/ Hex Artifact Content
Login

Artifact 116f748ee11ba4d3630882102e99b60ff58d2a84:


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 33 31 20 32 30 30 36 2f 31  c,v 1.331 2006/1
0190: 31 2f 33 30 20 31 33 3a 30 35 3a 32 39 20 64 72  1/30 13:05:29 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 20 20 76 6f  e below) */.  vo
4550: 69 64 20 2a 70 4b 65 79 3b 20 20 20 20 20 20 2f  id *pKey;      /
4560: 2a 20 53 61 76 65 64 20 6b 65 79 20 74 68 61 74  * Saved key that
4570: 20 77 61 73 20 63 75 72 73 6f 72 27 73 20 6c 61   was cursor's la
4580: 73 74 20 6b 6e 6f 77 6e 20 70 6f 73 69 74 69 6f  st known positio
4590: 6e 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 3b  n */.  i64 nKey;
45a0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
45b0: 6f 66 20 70 4b 65 79 2c 20 6f 72 20 6c 61 73 74  of pKey, or last
45c0: 20 69 6e 74 65 67 65 72 20 6b 65 79 20 2a 2f 0a   integer key */.
45d0: 20 20 69 6e 74 20 73 6b 69 70 3b 20 20 20 20 20    int skip;     
45e0: 20 20 20 2f 2a 20 28 73 6b 69 70 3c 30 29 20 2d     /* (skip<0) -
45f0: 3e 20 50 72 65 76 28 29 20 69 73 20 61 20 6e 6f  > Prev() is a no
4600: 2d 6f 70 2e 20 28 73 6b 69 70 3e 30 29 20 2d 3e  -op. (skip>0) ->
4610: 20 4e 65 78 74 28 29 20 69 73 20 2a 2f 0a 7d 3b   Next() is */.};
4620: 0a 0a 2f 2a 0a 2a 2a 20 50 6f 74 65 6e 74 69 61  ../*.** Potentia
4630: 6c 20 76 61 6c 75 65 73 20 66 6f 72 20 42 74 43  l values for BtC
4640: 75 72 73 6f 72 2e 65 53 74 61 74 65 2e 0a 2a 2a  ursor.eState..**
4650: 0a 2a 2a 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  .** CURSOR_VALID
4660: 3a 0a 2a 2a 20 20 20 43 75 72 73 6f 72 20 70 6f  :.**   Cursor po
4670: 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 69 64 20  ints to a valid 
4680: 65 6e 74 72 79 2e 20 67 65 74 50 61 79 6c 6f 61  entry. getPayloa
4690: 64 28 29 20 65 74 63 2e 20 6d 61 79 20 62 65 20  d() etc. may be 
46a0: 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 55  called..**.** CU
46b0: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3a 0a 2a 2a  RSOR_INVALID:.**
46c0: 20 20 20 43 75 72 73 6f 72 20 64 6f 65 73 20 6e     Cursor does n
46d0: 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 76 61  ot point to a va
46e0: 6c 69 64 20 65 6e 74 72 79 2e 20 54 68 69 73 20  lid entry. This 
46f0: 63 61 6e 20 68 61 70 70 65 6e 20 28 66 6f 72 20  can happen (for 
4700: 65 78 61 6d 70 6c 65 29 20 0a 2a 2a 20 20 20 62  example) .**   b
4710: 65 63 61 75 73 65 20 74 68 65 20 74 61 62 6c 65  ecause the table
4720: 20 69 73 20 65 6d 70 74 79 20 6f 72 20 62 65 63   is empty or bec
4730: 61 75 73 65 20 42 74 72 65 65 43 75 72 73 6f 72  ause BtreeCursor
4740: 46 69 72 73 74 28 29 20 68 61 73 20 6e 6f 74 20  First() has not 
4750: 62 65 65 6e 0a 2a 2a 20 20 20 63 61 6c 6c 65 64  been.**   called
4760: 2e 0a 2a 2a 0a 2a 2a 20 43 55 52 53 4f 52 5f 52  ..**.** CURSOR_R
4770: 45 51 55 49 52 45 53 45 45 4b 3a 0a 2a 2a 20 20  EQUIRESEEK:.**  
4780: 20 54 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   The table that 
4790: 74 68 69 73 20 63 75 72 73 6f 72 20 77 61 73 20  this cursor was 
47a0: 6f 70 65 6e 65 64 20 6f 6e 20 73 74 69 6c 6c 20  opened on still 
47b0: 65 78 69 73 74 73 2c 20 62 75 74 20 68 61 73 20  exists, but has 
47c0: 62 65 65 6e 20 0a 2a 2a 20 20 20 6d 6f 64 69 66  been .**   modif
47d0: 69 65 64 20 73 69 6e 63 65 20 74 68 65 20 63 75  ied since the cu
47e0: 72 73 6f 72 20 77 61 73 20 6c 61 73 74 20 75 73  rsor was last us
47f0: 65 64 2e 20 54 68 65 20 63 75 72 73 6f 72 20 70  ed. The cursor p
4800: 6f 73 69 74 69 6f 6e 20 69 73 20 73 61 76 65 64  osition is saved
4810: 0a 2a 2a 20 20 20 69 6e 20 76 61 72 69 61 62 6c  .**   in variabl
4820: 65 73 20 42 74 43 75 72 73 6f 72 2e 70 4b 65 79  es BtCursor.pKey
4830: 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 6e 4b   and BtCursor.nK
4840: 65 79 2e 20 57 68 65 6e 20 61 20 63 75 72 73 6f  ey. When a curso
4850: 72 20 69 73 20 69 6e 20 0a 2a 2a 20 20 20 74 68  r is in .**   th
4860: 69 73 20 73 74 61 74 65 2c 20 72 65 73 74 6f 72  is state, restor
4870: 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f  eOrClearCursorPo
4880: 73 69 74 69 6f 6e 28 29 20 63 61 6e 20 62 65 20  sition() can be 
4890: 63 61 6c 6c 65 64 20 74 6f 20 61 74 74 65 6d 70  called to attemp
48a0: 74 20 74 6f 0a 2a 2a 20 20 20 73 65 65 6b 20 74  t to.**   seek t
48b0: 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
48c0: 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 2e   saved position.
48d0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 55 52 53  .*/.#define CURS
48e0: 4f 52 5f 49 4e 56 41 4c 49 44 20 20 20 20 20 20  OR_INVALID      
48f0: 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20 43       0.#define C
4900: 55 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 20 20  URSOR_VALID     
4910: 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e          1.#defin
4920: 65 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  e CURSOR_REQUIRE
4930: 53 45 45 4b 20 20 20 20 20 20 20 32 0a 0a 2f 2a  SEEK       2../*
4940: 0a 2a 2a 20 54 68 65 20 54 52 41 43 45 20 6d 61  .** The TRACE ma
4950: 63 72 6f 20 77 69 6c 6c 20 70 72 69 6e 74 20 68  cro will print h
4960: 69 67 68 2d 6c 65 76 65 6c 20 73 74 61 74 75 73  igh-level status
4970: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
4980: 75 74 20 74 68 65 0a 2a 2a 20 62 74 72 65 65 20  ut the.** btree 
4990: 6f 70 65 72 61 74 69 6f 6e 20 77 68 65 6e 20 74  operation when t
49a0: 68 65 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  he global variab
49b0: 6c 65 20 73 71 6c 69 74 65 33 5f 62 74 72 65 65  le sqlite3_btree
49c0: 5f 74 72 61 63 65 20 69 73 0a 2a 2a 20 65 6e 61  _trace is.** ena
49d0: 62 6c 65 64 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  bled..*/.#if SQL
49e0: 49 54 45 5f 54 45 53 54 0a 23 20 64 65 66 69 6e  ITE_TEST.# defin
49f0: 65 20 54 52 41 43 45 28 58 29 20 20 20 69 66 28  e TRACE(X)   if(
4a00: 20 73 71 6c 69 74 65 33 5f 62 74 72 65 65 5f 74   sqlite3_btree_t
4a10: 72 61 63 65 20 29 5c 0a 20 20 20 20 20 20 20 20  race )\.        
4a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a30: 7b 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72  { sqlite3DebugPr
4a40: 69 6e 74 66 20 58 3b 20 66 66 6c 75 73 68 28 73  intf X; fflush(s
4a50: 74 64 6f 75 74 29 3b 20 7d 0a 69 6e 74 20 73 71  tdout); }.int sq
4a60: 6c 69 74 65 33 5f 62 74 72 65 65 5f 74 72 61 63  lite3_btree_trac
4a70: 65 3d 30 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f  e=0;  /* True to
4a80: 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20   enable tracing 
4a90: 2a 2f 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  */.#else.# defin
4aa0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
4ab0: 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64  f../*.** Forward
4ac0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a   declaration.*/.
4ad0: 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b  static int check
4ae0: 52 65 61 64 4c 6f 63 6b 73 28 42 74 72 65 65 2a  ReadLocks(Btree*
4af0: 2c 50 67 6e 6f 2c 42 74 43 75 72 73 6f 72 2a 29  ,Pgno,BtCursor*)
4b00: 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 6f 72  ;../*.** Read or
4b10: 20 77 72 69 74 65 20 61 20 74 77 6f 2d 20 61 6e   write a two- an
4b20: 64 20 66 6f 75 72 2d 62 79 74 65 20 62 69 67 2d  d four-byte big-
4b30: 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 76  endian integer v
4b40: 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  alues..*/.static
4b50: 20 75 33 32 20 67 65 74 32 62 79 74 65 28 75 6e   u32 get2byte(un
4b60: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 29 7b  signed char *p){
4b70: 0a 20 20 72 65 74 75 72 6e 20 28 70 5b 30 5d 3c  .  return (p[0]<
4b80: 3c 38 29 20 7c 20 70 5b 31 5d 3b 0a 7d 0a 73 74  <8) | p[1];.}.st
4b90: 61 74 69 63 20 75 33 32 20 67 65 74 34 62 79 74  atic u32 get4byt
4ba0: 65 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  e(unsigned char 
4bb0: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70  *p){.  return (p
4bc0: 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 70 5b 31 5d  [0]<<24) | (p[1]
4bd0: 3c 3c 31 36 29 20 7c 20 28 70 5b 32 5d 3c 3c 38  <<16) | (p[2]<<8
4be0: 29 20 7c 20 70 5b 33 5d 3b 0a 7d 0a 73 74 61 74  ) | p[3];.}.stat
4bf0: 69 63 20 76 6f 69 64 20 70 75 74 32 62 79 74 65  ic void put2byte
4c00: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
4c10: 70 2c 20 75 33 32 20 76 29 7b 0a 20 20 70 5b 30  p, u32 v){.  p[0
4c20: 5d 20 3d 20 76 3e 3e 38 3b 0a 20 20 70 5b 31 5d  ] = v>>8;.  p[1]
4c30: 20 3d 20 76 3b 0a 7d 0a 73 74 61 74 69 63 20 76   = v;.}.static v
4c40: 6f 69 64 20 70 75 74 34 62 79 74 65 28 75 6e 73  oid put4byte(uns
4c50: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 2c 20 75  igned char *p, u
4c60: 33 32 20 76 29 7b 0a 20 20 70 5b 30 5d 20 3d 20  32 v){.  p[0] = 
4c70: 76 3e 3e 32 34 3b 0a 20 20 70 5b 31 5d 20 3d 20  v>>24;.  p[1] = 
4c80: 76 3e 3e 31 36 3b 0a 20 20 70 5b 32 5d 20 3d 20  v>>16;.  p[2] = 
4c90: 76 3e 3e 38 3b 0a 20 20 70 5b 33 5d 20 3d 20 76  v>>8;.  p[3] = v
4ca0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69  ;.}../*.** Routi
4cb0: 6e 65 73 20 74 6f 20 72 65 61 64 20 61 6e 64 20  nes to read and 
4cc0: 77 72 69 74 65 20 76 61 72 69 61 62 6c 65 2d 6c  write variable-l
4cd0: 65 6e 67 74 68 20 69 6e 74 65 67 65 72 73 2e 20  ength integers. 
4ce0: 20 54 68 65 73 65 20 75 73 65 64 20 74 6f 0a 2a   These used to.*
4cf0: 2a 20 62 65 20 64 65 66 69 6e 65 64 20 6c 6f 63  * be defined loc
4d00: 61 6c 6c 79 2c 20 62 75 74 20 6e 6f 77 20 77 65  ally, but now we
4d10: 20 75 73 65 20 74 68 65 20 76 61 72 69 6e 74 20   use the varint 
4d20: 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 65 20  routines in the 
4d30: 75 74 69 6c 2e 63 0a 2a 2a 20 66 69 6c 65 2e 0a  util.c.** file..
4d40: 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65 74 56 61  */.#define getVa
4d50: 72 69 6e 74 20 20 20 20 73 71 6c 69 74 65 33 47  rint    sqlite3G
4d60: 65 74 56 61 72 69 6e 74 0a 2f 2a 20 23 64 65 66  etVarint./* #def
4d70: 69 6e 65 20 67 65 74 56 61 72 69 6e 74 33 32 20  ine getVarint32 
4d80: 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e   sqlite3GetVarin
4d90: 74 33 32 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67  t32 */.#define g
4da0: 65 74 56 61 72 69 6e 74 33 32 28 41 2c 42 29 20  etVarint32(A,B) 
4db0: 20 28 28 2a 42 3d 2a 28 41 29 29 3c 3d 30 78 37   ((*B=*(A))<=0x7
4dc0: 66 3f 31 3a 73 71 6c 69 74 65 33 47 65 74 56 61  f?1:sqlite3GetVa
4dd0: 72 69 6e 74 33 32 28 41 2c 42 29 29 0a 23 64 65  rint32(A,B)).#de
4de0: 66 69 6e 65 20 70 75 74 56 61 72 69 6e 74 20 20  fine putVarint  
4df0: 20 20 73 71 6c 69 74 65 33 50 75 74 56 61 72 69    sqlite3PutVari
4e00: 6e 74 0a 0a 2f 2a 20 54 68 65 20 64 61 74 61 62  nt../* The datab
4e10: 61 73 65 20 70 61 67 65 20 74 68 65 20 50 45 4e  ase page the PEN
4e20: 44 49 4e 47 5f 42 59 54 45 20 6f 63 63 75 70 69  DING_BYTE occupi
4e30: 65 73 2e 20 54 68 69 73 20 70 61 67 65 20 69 73  es. This page is
4e40: 20 6e 65 76 65 72 20 75 73 65 64 2e 0a 2a 2a 20   never used..** 
4e50: 54 4f 44 4f 3a 20 54 68 69 73 20 6d 61 63 72 6f  TODO: This macro
4e60: 20 69 73 20 76 65 72 79 20 73 69 6d 69 6c 61 72   is very similar
4e70: 79 20 74 6f 20 50 41 47 45 52 5f 4d 4a 5f 50 47  y to PAGER_MJ_PG
4e80: 4e 4f 28 29 20 69 6e 20 70 61 67 65 72 2e 63 2e  NO() in pager.c.
4e90: 20 54 68 65 79 0a 2a 2a 20 73 68 6f 75 6c 64 20   They.** should 
4ea0: 70 6f 73 73 69 62 6c 79 20 62 65 20 63 6f 6e 73  possibly be cons
4eb0: 6f 6c 69 64 61 74 65 64 20 28 70 72 65 73 75 6d  olidated (presum
4ec0: 61 62 6c 79 20 69 6e 20 70 61 67 65 72 2e 68 29  ably in pager.h)
4ed0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 69 73 6b 20  ..**.** If disk 
4ee0: 49 2f 4f 20 69 73 20 6f 6d 69 74 74 65 64 20 28  I/O is omitted (
4ef0: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 74 68 65  meaning that the
4f00: 20 64 61 74 61 62 61 73 65 20 69 73 20 73 74 6f   database is sto
4f10: 72 65 64 20 70 75 72 65 6c 79 0a 2a 2a 20 69 6e  red purely.** in
4f20: 20 6d 65 6d 6f 72 79 29 20 74 68 65 6e 20 74 68   memory) then th
4f30: 65 72 65 20 69 73 20 6e 6f 20 70 65 6e 64 69 6e  ere is no pendin
4f40: 67 20 62 79 74 65 2e 0a 2a 2f 0a 23 69 66 64 65  g byte..*/.#ifde
4f50: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  f SQLITE_OMIT_DI
4f60: 53 4b 49 4f 0a 23 20 64 65 66 69 6e 65 20 50 45  SKIO.# define PE
4f70: 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
4f80: 70 42 74 29 20 20 30 78 37 66 66 66 66 66 66 66  pBt)  0x7fffffff
4f90: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
4fa0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
4fb0: 45 28 70 42 74 29 20 28 28 50 45 4e 44 49 4e 47  E(pBt) ((PENDING
4fc0: 5f 42 59 54 45 2f 28 70 42 74 29 2d 3e 70 61 67  _BYTE/(pBt)->pag
4fd0: 65 53 69 7a 65 29 2b 31 29 0a 23 65 6e 64 69 66  eSize)+1).#endif
4fe0: 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 6e 6b 65 64  ../*.** A linked
4ff0: 20 6c 69 73 74 20 6f 66 20 74 68 65 20 66 6f 6c   list of the fol
5000: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
5010: 73 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 42  s is stored at B
5020: 74 53 68 61 72 65 64 2e 70 4c 6f 63 6b 2e 0a 2a  tShared.pLock..*
5030: 2a 20 4c 6f 63 6b 73 20 61 72 65 20 61 64 64 65  * Locks are adde
5040: 64 20 28 6f 72 20 75 70 67 72 61 64 65 64 20 66  d (or upgraded f
5050: 72 6f 6d 20 52 45 41 44 5f 4c 4f 43 4b 20 74 6f  rom READ_LOCK to
5060: 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 77 68 65   WRITE_LOCK) whe
5070: 6e 20 61 20 63 75 72 73 6f 72 20 0a 2a 2a 20 69  n a cursor .** i
5080: 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20  s opened on the 
5090: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 20  table with root 
50a0: 70 61 67 65 20 42 74 53 68 61 72 65 64 2e 69 54  page BtShared.iT
50b0: 61 62 6c 65 2e 20 4c 6f 63 6b 73 20 61 72 65 20  able. Locks are 
50c0: 72 65 6d 6f 76 65 64 0a 2a 2a 20 66 72 6f 6d 20  removed.** from 
50d0: 74 68 69 73 20 6c 69 73 74 20 77 68 65 6e 20 61  this list when a
50e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
50f0: 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
5100: 6c 65 64 20 62 61 63 6b 2c 20 6f 72 20 77 68 65  led back, or whe
5110: 6e 0a 2a 2a 20 61 20 62 74 72 65 65 20 68 61 6e  n.** a btree han
5120: 64 6c 65 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a  dle is closed..*
5130: 2f 0a 73 74 72 75 63 74 20 42 74 4c 6f 63 6b 20  /.struct BtLock 
5140: 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  {.  Btree *pBtre
5150: 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72  e;        /* Btr
5160: 65 65 20 68 61 6e 64 6c 65 20 68 6f 6c 64 69 6e  ee handle holdin
5170: 67 20 74 68 69 73 20 6c 6f 63 6b 20 2a 2f 0a 20  g this lock */. 
5180: 20 50 67 6e 6f 20 69 54 61 62 6c 65 3b 20 20 20   Pgno iTable;   
5190: 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
51a0: 61 67 65 20 6f 66 20 74 61 62 6c 65 20 2a 2f 0a  age of table */.
51b0: 20 20 75 38 20 65 4c 6f 63 6b 3b 20 20 20 20 20    u8 eLock;     
51c0: 20 20 20 20 20 20 20 20 2f 2a 20 52 45 41 44 5f          /* READ_
51d0: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
51e0: 43 4b 20 2a 2f 0a 20 20 42 74 4c 6f 63 6b 20 2a  CK */.  BtLock *
51f0: 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 2f 2a  pNext;        /*
5200: 20 4e 65 78 74 20 69 6e 20 42 74 53 68 61 72 65   Next in BtShare
5210: 64 2e 70 4c 6f 63 6b 20 6c 69 73 74 20 2a 2f 0a  d.pLock list */.
5220: 7d 3b 0a 0a 2f 2a 20 43 61 6e 64 69 64 61 74 65  };../* Candidate
5230: 20 76 61 6c 75 65 73 20 66 6f 72 20 42 74 4c 6f   values for BtLo
5240: 63 6b 2e 65 4c 6f 63 6b 20 2a 2f 0a 23 64 65 66  ck.eLock */.#def
5250: 69 6e 65 20 52 45 41 44 5f 4c 4f 43 4b 20 20 20  ine READ_LOCK   
5260: 20 20 31 0a 23 64 65 66 69 6e 65 20 57 52 49 54    1.#define WRIT
5270: 45 5f 4c 4f 43 4b 20 20 20 20 32 0a 0a 23 69 66  E_LOCK    2..#if
5280: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5290: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
52a0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
52b0: 69 6f 6e 73 20 71 75 65 72 79 54 61 62 6c 65 4c  ions queryTableL
52c0: 6f 63 6b 28 29 2c 20 6c 6f 63 6b 54 61 62 6c 65  ock(), lockTable
52d0: 28 29 20 61 6e 64 20 75 6e 6c 6f 63 6b 41 6c 6c  () and unlockAll
52e0: 54 61 62 6c 65 73 28 29 0a 20 20 2a 2a 20 6d 61  Tables().  ** ma
52f0: 6e 69 70 75 6c 61 74 65 20 65 6e 74 72 69 65 73  nipulate entries
5300: 20 69 6e 20 74 68 65 20 42 74 53 68 61 72 65 64   in the BtShared
5310: 2e 70 4c 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69  .pLock linked li
5320: 73 74 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  st used to store
5330: 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63  .  ** shared-cac
5340: 68 65 20 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c  he table level l
5350: 6f 63 6b 73 2e 20 49 66 20 74 68 65 20 6c 69 62  ocks. If the lib
5360: 72 61 72 79 20 69 73 20 63 6f 6d 70 69 6c 65 64  rary is compiled
5370: 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73   with the.  ** s
5380: 68 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74  hared-cache feat
5390: 75 72 65 20 64 69 73 61 62 6c 65 64 2c 20 74 68  ure disabled, th
53a0: 65 6e 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79  en there is only
53b0: 20 65 76 65 72 20 6f 6e 65 20 75 73 65 72 0a 20   ever one user. 
53c0: 20 2a 2a 20 6f 66 20 65 61 63 68 20 42 74 53 68   ** of each BtSh
53d0: 61 72 65 64 20 73 74 72 75 63 74 75 72 65 20 61  ared structure a
53e0: 6e 64 20 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69  nd so this locki
53f0: 6e 67 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  ng is not necess
5400: 61 72 79 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65  ary. .  ** So de
5410: 66 69 6e 65 20 74 68 65 20 6c 6f 63 6b 20 72 65  fine the lock re
5420: 6c 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 73 20  lated functions 
5430: 61 73 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a  as no-ops..  */.
5440: 20 20 23 64 65 66 69 6e 65 20 71 75 65 72 79 54    #define queryT
5450: 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20  ableLock(a,b,c) 
5460: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66  SQLITE_OK.  #def
5470: 69 6e 65 20 6c 6f 63 6b 54 61 62 6c 65 28 61 2c  ine lockTable(a,
5480: 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20  b,c) SQLITE_OK. 
5490: 20 23 64 65 66 69 6e 65 20 75 6e 6c 6f 63 6b 41   #define unlockA
54a0: 6c 6c 54 61 62 6c 65 73 28 61 29 0a 23 65 6c 73  llTables(a).#els
54b0: 65 0a 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20  e.../*.** Query 
54c0: 74 6f 20 73 65 65 20 69 66 20 62 74 72 65 65 20  to see if btree 
54d0: 68 61 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74  handle p may obt
54e0: 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79  ain a lock of ty
54f0: 70 65 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45  pe eLock .** (RE
5500: 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45  AD_LOCK or WRITE
5510: 5f 4c 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61  _LOCK) on the ta
5520: 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  ble with root-pa
5530: 67 65 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a  ge iTab. Return.
5540: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  ** SQLITE_OK if 
5550: 74 68 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20  the lock may be 
5560: 6f 62 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c  obtained (by cal
5570: 6c 69 6e 67 20 6c 6f 63 6b 54 61 62 6c 65 28 29  ling lockTable()
5580: 29 2c 20 6f 72 0a 2a 2a 20 53 51 4c 49 54 45 5f  ), or.** SQLITE_
5590: 4c 4f 43 4b 45 44 20 69 66 20 6e 6f 74 2e 0a 2a  LOCKED if not..*
55a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 71 75 65  /.static int que
55b0: 72 79 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65  ryTableLock(Btre
55c0: 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c  e *p, Pgno iTab,
55d0: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
55e0: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
55f0: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
5600: 70 49 74 65 72 3b 0a 0a 20 20 2f 2a 20 54 68 69  pIter;..  /* Thi
5610: 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  s is a no-op if 
5620: 74 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65  the shared-cache
5630: 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20   is not enabled 
5640: 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69  */.  if( 0==sqli
5650: 74 65 33 54 68 72 65 61 64 44 61 74 61 52 65 61  te3ThreadDataRea
5660: 64 4f 6e 6c 79 28 29 2d 3e 75 73 65 53 68 61 72  dOnly()->useShar
5670: 65 64 44 61 74 61 20 29 7b 0a 20 20 20 20 72 65  edData ){.    re
5680: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
5690: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 28    }..  /* This (
56a0: 61 6c 6f 6e 67 20 77 69 74 68 20 6c 6f 63 6b 54  along with lockT
56b0: 61 62 6c 65 28 29 29 20 69 73 20 77 68 65 72 65  able()) is where
56c0: 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69   the ReadUncommi
56d0: 74 74 65 64 20 66 6c 61 67 20 69 73 0a 20 20 2a  tted flag is.  *
56e0: 2a 20 64 65 61 6c 74 20 77 69 74 68 2e 20 49 66  * dealt with. If
56f0: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 71   the caller is q
5700: 75 65 72 79 69 6e 67 20 66 6f 72 20 61 20 72 65  uerying for a re
5710: 61 64 2d 6c 6f 63 6b 20 61 6e 64 20 74 68 65 20  ad-lock and the 
5720: 66 6c 61 67 20 69 73 0a 20 20 2a 2a 20 73 65 74  flag is.  ** set
5730: 2c 20 69 74 20 69 73 20 75 6e 63 6f 6e 64 69 74  , it is uncondit
5740: 69 6f 6e 61 6c 6c 79 20 67 72 61 6e 74 65 64 20  ionally granted 
5750: 2d 20 65 76 65 6e 20 69 66 20 74 68 65 72 65 20  - even if there 
5760: 61 72 65 20 77 72 69 74 65 2d 6c 6f 63 6b 73 0a  are write-locks.
5770: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 74 61 62 6c    ** on the tabl
5780: 65 2e 20 49 66 20 61 20 77 72 69 74 65 2d 6c 6f  e. If a write-lo
5790: 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ck is requested,
57a0: 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69   the ReadUncommi
57b0: 74 74 65 64 20 66 6c 61 67 0a 20 20 2a 2a 20 69  tted flag.  ** i
57c0: 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64  s not considered
57d0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 66  ..  **.  ** In f
57e0: 75 6e 63 74 69 6f 6e 20 6c 6f 63 6b 54 61 62 6c  unction lockTabl
57f0: 65 28 29 2c 20 69 66 20 61 20 72 65 61 64 2d 6c  e(), if a read-l
5800: 6f 63 6b 20 69 73 20 64 65 6d 61 6e 64 65 64 20  ock is demanded 
5810: 61 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20 52 65  and the .  ** Re
5820: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  adUncommitted fl
5830: 61 67 20 69 73 20 73 65 74 2c 20 6e 6f 20 65 6e  ag is set, no en
5840: 74 72 79 20 69 73 20 61 64 64 65 64 20 74 6f 20  try is added to 
5850: 74 68 65 20 6c 6f 63 6b 73 20 6c 69 73 74 20 0a  the locks list .
5860: 20 20 2a 2a 20 28 42 74 53 68 61 72 65 64 2e 70    ** (BtShared.p
5870: 4c 6f 63 6b 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  Lock)..  **.  **
5880: 20 54 6f 20 73 75 6d 6d 61 72 69 7a 65 3a 20 49   To summarize: I
5890: 66 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d  f the ReadUncomm
58a0: 69 74 74 65 64 20 66 6c 61 67 20 69 73 20 73 65  itted flag is se
58b0: 74 2c 20 74 68 65 6e 20 72 65 61 64 20 63 75 72  t, then read cur
58c0: 73 6f 72 73 20 64 6f 0a 20 20 2a 2a 20 6e 6f 74  sors do.  ** not
58d0: 20 63 72 65 61 74 65 20 6f 72 20 72 65 73 70 65   create or respe
58e0: 63 74 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2e 20  ct table locks. 
58f0: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 63  The locking proc
5900: 65 64 75 72 65 20 66 6f 72 20 61 20 0a 20 20 2a  edure for a .  *
5910: 2a 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 64  * write-cursor d
5920: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 2e 0a  oes not change..
5930: 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20 20    */.  if( .    
5940: 21 70 2d 3e 70 53 71 6c 69 74 65 20 7c 7c 20 0a  !p->pSqlite || .
5950: 20 20 20 20 30 3d 3d 28 70 2d 3e 70 53 71 6c 69      0==(p->pSqli
5960: 74 65 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  te->flags&SQLITE
5970: 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64  _ReadUncommitted
5980: 29 20 7c 7c 20 0a 20 20 20 20 65 4c 6f 63 6b 3d  ) || .    eLock=
5990: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 0a 20  =WRITE_LOCK ||. 
59a0: 20 20 20 69 54 61 62 3d 3d 4d 41 53 54 45 52 5f     iTab==MASTER_
59b0: 52 4f 4f 54 0a 20 20 29 7b 0a 20 20 20 20 66 6f  ROOT.  ){.    fo
59c0: 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f  r(pIter=pBt->pLo
59d0: 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72  ck; pIter; pIter
59e0: 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a  =pIter->pNext){.
59f0: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
5a00: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
5a10: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
5a20: 62 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20  b && .          
5a30: 28 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65  (pIter->eLock!=e
5a40: 4c 6f 63 6b 20 7c 7c 20 65 4c 6f 63 6b 21 3d 52  Lock || eLock!=R
5a50: 45 41 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  EAD_LOCK) ){.   
5a60: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
5a70: 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20  TE_LOCKED;.     
5a80: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
5a90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
5aa0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
5ab0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c  lock on the tabl
5ac0: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
5ad0: 20 69 54 61 62 6c 65 20 74 6f 20 74 68 65 20 73   iTable to the s
5ae0: 68 61 72 65 64 2d 62 74 72 65 65 20 75 73 65 64  hared-btree used
5af0: 0a 2a 2a 20 62 79 20 42 74 72 65 65 20 68 61 6e  .** by Btree han
5b00: 64 6c 65 20 70 2e 20 50 61 72 61 6d 65 74 65 72  dle p. Parameter
5b10: 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 65   eLock must be e
5b20: 69 74 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20  ither READ_LOCK 
5b30: 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43  or .** WRITE_LOC
5b40: 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  K..**.** SQLITE_
5b50: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
5b60: 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64  f the lock is ad
5b70: 64 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ded successfully
5b80: 2e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e  . SQLITE_BUSY an
5b90: 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  d.** SQLITE_NOME
5ba0: 4d 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 72 65  M may also be re
5bb0: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
5bc0: 63 20 69 6e 74 20 6c 6f 63 6b 54 61 62 6c 65 28  c int lockTable(
5bd0: 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69  Btree *p, Pgno i
5be0: 54 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29  Table, u8 eLock)
5bf0: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
5c00: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
5c10: 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b  Lock *pLock = 0;
5c20: 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72  .  BtLock *pIter
5c30: 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20  ;..  /* This is 
5c40: 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 73  a no-op if the s
5c50: 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20 6e  hared-cache is n
5c60: 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20  ot enabled */.  
5c70: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 54 68  if( 0==sqlite3Th
5c80: 72 65 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79  readDataReadOnly
5c90: 28 29 2d 3e 75 73 65 53 68 61 72 65 64 44 61 74  ()->useSharedDat
5ca0: 61 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  a ){.    return 
5cb0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
5cc0: 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
5cd0: 5f 4f 4b 3d 3d 71 75 65 72 79 54 61 62 6c 65 4c  _OK==queryTableL
5ce0: 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 65  ock(p, iTable, e
5cf0: 4c 6f 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  Lock) );..  /* I
5d00: 66 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  f the read-uncom
5d10: 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73 20 73  mitted flag is s
5d20: 65 74 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f  et and a read-lo
5d30: 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ck is requested,
5d40: 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 65 61 72  .  ** return ear
5d50: 6c 79 20 77 69 74 68 6f 75 74 20 61 64 64 69 6e  ly without addin
5d60: 67 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68  g an entry to th
5d70: 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f 63 6b  e BtShared.pLock
5d80: 20 6c 69 73 74 2e 20 53 65 65 0a 20 20 2a 2a 20   list. See.  ** 
5d90: 63 6f 6d 6d 65 6e 74 20 69 6e 20 66 75 6e 63 74  comment in funct
5da0: 69 6f 6e 20 71 75 65 72 79 54 61 62 6c 65 4c 6f  ion queryTableLo
5db0: 63 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 69 6e  ck() for more in
5dc0: 66 6f 20 6f 6e 20 68 61 6e 64 6c 69 6e 67 20 0a  fo on handling .
5dd0: 20 20 2a 2a 20 74 68 65 20 52 65 61 64 55 6e 63    ** the ReadUnc
5de0: 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 2e 0a 20  ommitted flag.. 
5df0: 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20 20 28   */.  if( .    (
5e00: 70 2d 3e 70 53 71 6c 69 74 65 29 20 26 26 20 0a  p->pSqlite) && .
5e10: 20 20 20 20 28 70 2d 3e 70 53 71 6c 69 74 65 2d      (p->pSqlite-
5e20: 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65  >flags&SQLITE_Re
5e30: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 20 26  adUncommitted) &
5e40: 26 20 0a 20 20 20 20 28 65 4c 6f 63 6b 3d 3d 52  & .    (eLock==R
5e50: 45 41 44 5f 4c 4f 43 4b 29 20 26 26 0a 20 20 20  EAD_LOCK) &&.   
5e60: 20 69 54 61 62 6c 65 21 3d 4d 41 53 54 45 52 5f   iTable!=MASTER_
5e70: 52 4f 4f 54 0a 20 20 29 7b 0a 20 20 20 20 72 65  ROOT.  ){.    re
5e80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
5e90: 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20    }..  /* First 
5ea0: 73 65 61 72 63 68 20 74 68 65 20 6c 69 73 74 20  search the list 
5eb0: 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20  for an existing 
5ec0: 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74 61 62  lock on this tab
5ed0: 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49 74  le. */.  for(pIt
5ee0: 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  er=pBt->pLock; p
5ef0: 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65  Iter; pIter=pIte
5f00: 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  r->pNext){.    i
5f10: 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62 6c 65  f( pIter->iTable
5f20: 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49 74 65  ==iTable && pIte
5f30: 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a  r->pBtree==p ){.
5f40: 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20 70 49        pLock = pI
5f50: 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ter;.      break
5f60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
5f70: 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65 20 73  * If the above s
5f80: 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20 66 69  earch did not fi
5f90: 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74 72 75  nd a BtLock stru
5fa0: 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67 20 42  ct associating B
5fb0: 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69 74 68  tree p.  ** with
5fc0: 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c 20 61   table iTable, a
5fd0: 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e 64 20  llocate one and 
5fe0: 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74 68 65  link it into the
5ff0: 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66   list..  */.  if
6000: 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  ( !pLock ){.    
6010: 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63 6b 20  pLock = (BtLock 
6020: 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73  *)sqliteMalloc(s
6030: 69 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a  izeof(BtLock));.
6040: 20 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29      if( !pLock )
6050: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
6060: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
6070: 20 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54   }.    pLock->iT
6080: 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20  able = iTable;. 
6090: 20 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65     pLock->pBtree
60a0: 20 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d   = p;.    pLock-
60b0: 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c  >pNext = pBt->pL
60c0: 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c  ock;.    pBt->pL
60d0: 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d  ock = pLock;.  }
60e0: 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 42  ..  /* Set the B
60f0: 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69  tLock.eLock vari
6100: 61 62 6c 65 20 74 6f 20 74 68 65 20 6d 61 78 69  able to the maxi
6110: 6d 75 6d 20 6f 66 20 74 68 65 20 63 75 72 72 65  mum of the curre
6120: 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64  nt lock.  ** and
6130: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
6140: 6f 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ock. This means 
6150: 69 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  if a write-lock 
6160: 77 61 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64  was already held
6170: 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 61 64  .  ** and a read
6180: 2d 6c 6f 63 6b 20 72 65 71 75 65 73 74 65 64 2c  -lock requested,
6190: 20 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72   we don't incorr
61a0: 65 63 74 6c 79 20 64 6f 77 6e 67 72 61 64 65 20  ectly downgrade 
61b0: 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20  the lock..  */. 
61c0: 20 61 73 73 65 72 74 28 20 57 52 49 54 45 5f 4c   assert( WRITE_L
61d0: 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b  OCK>READ_LOCK );
61e0: 0a 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f  .  if( eLock>pLo
61f0: 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  ck->eLock ){.   
6200: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20   pLock->eLock = 
6210: 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65  eLock;.  }..  re
6220: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6230: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
6240: 20 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c   all the table l
6250: 6f 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61  ocks (locks obta
6260: 69 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74  ined via calls t
6270: 6f 20 74 68 65 20 6c 6f 63 6b 54 61 62 6c 65 28  o the lockTable(
6280: 29 0a 2a 2a 20 70 72 6f 63 65 64 75 72 65 29 20  ).** procedure) 
6290: 68 65 6c 64 20 62 79 20 42 74 72 65 65 20 68 61  held by Btree ha
62a0: 6e 64 6c 65 20 70 2e 0a 2a 2f 0a 73 74 61 74 69  ndle p..*/.stati
62b0: 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 41 6c 6c  c void unlockAll
62c0: 54 61 62 6c 65 73 28 42 74 72 65 65 20 2a 70 29  Tables(Btree *p)
62d0: 7b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49  {.  BtLock **ppI
62e0: 74 65 72 20 3d 20 26 70 2d 3e 70 42 74 2d 3e 70  ter = &p->pBt->p
62f0: 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  Lock;..  /* If t
6300: 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  he shared-cache 
6310: 65 78 74 65 6e 73 69 6f 6e 20 69 73 20 6e 6f 74  extension is not
6320: 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 72 65 20   enabled, there 
6330: 73 68 6f 75 6c 64 20 62 65 20 6e 6f 0a 20 20 2a  should be no.  *
6340: 2a 20 6c 6f 63 6b 73 20 69 6e 20 74 68 65 20 42  * locks in the B
6350: 74 53 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69  tShared.pLock li
6360: 73 74 2c 20 6d 61 6b 69 6e 67 20 74 68 69 73 20  st, making this 
6370: 70 72 6f 63 65 64 75 72 65 20 61 20 6e 6f 2d 6f  procedure a no-o
6380: 70 2e 20 41 73 73 65 72 74 0a 20 20 2a 2a 20 74  p. Assert.  ** t
6390: 68 61 74 20 74 68 69 73 20 69 73 20 74 68 65 20  hat this is the 
63a0: 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  case..  */.  ass
63b0: 65 72 74 28 20 73 71 6c 69 74 65 33 54 68 72 65  ert( sqlite3Thre
63c0: 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79 28 29  adDataReadOnly()
63d0: 2d 3e 75 73 65 53 68 61 72 65 64 44 61 74 61 20  ->useSharedData 
63e0: 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29 3b  || 0==*ppIter );
63f0: 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70 70 49 74  ..  while( *ppIt
6400: 65 72 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b  er ){.    BtLock
6410: 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65   *pLock = *ppIte
6420: 72 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b  r;.    if( pLock
6430: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
6440: 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70       *ppIter = p
6450: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Lock->pNext;.   
6460: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c     sqliteFree(pL
6470: 6f 63 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ock);.    }else{
6480: 0a 20 20 20 20 20 20 70 70 49 74 65 72 20 3d 20  .      ppIter = 
6490: 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20  &pLock->pNext;. 
64a0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
64b0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
64c0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
64d0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  ..static void re
64e0: 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67  leasePage(MemPag
64f0: 65 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46  e *pPage);  /* F
6500: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
6510: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20   */../*.** Save 
6520: 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
6530: 6f 72 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74  or position in t
6540: 68 65 20 76 61 72 69 61 62 6c 65 73 20 42 74 43  he variables BtC
6550: 75 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61  ursor.nKey .** a
6560: 6e 64 20 42 74 43 75 72 73 6f 72 2e 70 4b 65 79  nd BtCursor.pKey
6570: 2e 20 54 68 65 20 63 75 72 73 6f 72 27 73 20 73  . The cursor's s
6580: 74 61 74 65 20 69 73 20 73 65 74 20 74 6f 20 43  tate is set to C
6590: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
65a0: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
65b0: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
65c0: 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ion(BtCursor *pC
65d0: 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ur){.  int rc;..
65e0: 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
65f0: 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  _VALID==pCur->eS
6600: 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  tate );.  assert
6610: 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20  ( 0==pCur->pKey 
6620: 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  );..  rc = sqlit
6630: 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70  e3BtreeKeySize(p
6640: 43 75 72 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79  Cur, &pCur->nKey
6650: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
6660: 20 69 73 20 61 6e 20 69 6e 74 4b 65 79 20 74 61   is an intKey ta
6670: 62 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 61 62  ble, then the ab
6680: 6f 76 65 20 63 61 6c 6c 20 74 6f 20 42 74 72 65  ove call to Btre
6690: 65 4b 65 79 53 69 7a 65 28 29 0a 20 20 2a 2a 20  eKeySize().  ** 
66a0: 73 74 6f 72 65 73 20 74 68 65 20 69 6e 74 65 67  stores the integ
66b0: 65 72 20 6b 65 79 20 69 6e 20 70 43 75 72 2d 3e  er key in pCur->
66c0: 6e 4b 65 79 2e 20 49 6e 20 74 68 69 73 20 63 61  nKey. In this ca
66d0: 73 65 20 74 68 69 73 20 76 61 6c 75 65 20 69 73  se this value is
66e0: 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69  .  ** all that i
66f0: 73 20 72 65 71 75 69 72 65 64 2e 20 4f 74 68 65  s required. Othe
6700: 72 77 69 73 65 2c 20 69 66 20 70 43 75 72 20 69  rwise, if pCur i
6710: 73 20 6e 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e  s not open on an
6720: 20 69 6e 74 4b 65 79 0a 20 20 2a 2a 20 74 61 62   intKey.  ** tab
6730: 6c 65 2c 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 20  le, then malloc 
6740: 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20 73 74  space for and st
6750: 6f 72 65 20 74 68 65 20 70 43 75 72 2d 3e 6e 4b  ore the pCur->nK
6760: 65 79 20 62 79 74 65 73 20 6f 66 20 6b 65 79 20  ey bytes of key 
6770: 0a 20 20 2a 2a 20 64 61 74 61 2e 0a 20 20 2a 2f  .  ** data..  */
6780: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
6790: 45 5f 4f 4b 20 26 26 20 30 3d 3d 70 43 75 72 2d  E_OK && 0==pCur-
67a0: 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 29 7b  >pPage->intKey){
67b0: 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 20  .    void *pKey 
67c0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 70  = sqliteMalloc(p
67d0: 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 20 20 20 20  Cur->nKey);.    
67e0: 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20  if( pKey ){.    
67f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
6800: 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c 20  reeKey(pCur, 0, 
6810: 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79  pCur->nKey, pKey
6820: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
6830: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6840: 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79        pCur->pKey
6850: 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d   = pKey;.      }
6860: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
6870: 6c 69 74 65 46 72 65 65 28 70 4b 65 79 29 3b 0a  liteFree(pKey);.
6880: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
6890: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
68a0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
68b0: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
68c0: 21 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e  !pCur->pPage->in
68d0: 74 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70  tKey || !pCur->p
68e0: 4b 65 79 20 29 3b 0a 0a 20 20 69 66 28 20 72 63  Key );..  if( rc
68f0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
6900: 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
6910: 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20  Cur->pPage);.   
6920: 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 30   pCur->pPage = 0
6930: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  ;.    pCur->eSta
6940: 74 65 20 3d 20 43 55 52 53 4f 52 5f 52 45 51 55  te = CURSOR_REQU
6950: 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20  IRESEEK;.  }..  
6960: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
6970: 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73  .** Save the pos
6980: 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75  itions of all cu
6990: 72 73 6f 72 73 20 65 78 63 65 70 74 20 70 45 78  rsors except pEx
69a0: 63 65 70 74 20 6f 70 65 6e 20 6f 6e 20 74 68 65  cept open on the
69b0: 20 74 61 62 6c 65 20 0a 2a 2a 20 77 69 74 68 20   table .** with 
69c0: 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e  root-page iRoot.
69d0: 20 55 73 75 61 6c 6c 79 2c 20 74 68 69 73 20 69   Usually, this i
69e0: 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65  s called just be
69f0: 66 6f 72 65 20 63 75 72 73 6f 72 0a 2a 2a 20 70  fore cursor.** p
6a00: 45 78 63 65 70 74 20 69 73 20 75 73 65 64 20 74  Except is used t
6a10: 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 74 61 62  o modify the tab
6a20: 6c 65 20 28 42 74 72 65 65 44 65 6c 65 74 65 28  le (BtreeDelete(
6a30: 29 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74  ) or BtreeInsert
6a40: 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ())..*/.static i
6a50: 6e 74 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72  nt saveAllCursor
6a60: 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  s(BtShared *pBt,
6a70: 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43   Pgno iRoot, BtC
6a80: 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74 29 7b  ursor *pExcept){
6a90: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
6aa0: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
6ab0: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
6ac0: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21  ext){.    if( p!
6ad0: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
6ae0: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
6af0: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 26 26 20  Root==iRoot) && 
6b00: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
6b10: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
6b20: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
6b30: 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73   = saveCursorPos
6b40: 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20  ition(p);.      
6b50: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72  if( SQLITE_OK!=r
6b60: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  c ){.        ret
6b70: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
6b80: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
6b90: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
6ba0: 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74  ./*.** Restore t
6bb0: 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
6bc0: 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73   position it was
6bd0: 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65   in (or as close
6be0: 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29   to as possible)
6bf0: 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72  .** when saveCur
6c00: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61  sorPosition() wa
6c10: 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74  s called. Note t
6c20: 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65  hat this call de
6c30: 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61  letes the .** sa
6c40: 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66  ved position inf
6c50: 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61 76 65  o stored by save
6c60: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
6c70: 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62  , so there can b
6c80: 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65  e.** at most one
6c90: 20 65 66 66 65 63 74 69 76 65 20 72 65 73 74 6f   effective resto
6ca0: 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50  reOrClearCursorP
6cb0: 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61  osition() call a
6cc0: 66 74 65 72 20 65 61 63 68 20 0a 2a 2a 20 73 61  fter each .** sa
6cd0: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
6ce0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ()..**.** If the
6cf0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
6d00: 20 61 72 67 75 6d 65 6e 74 20 2d 20 64 6f 53 65   argument - doSe
6d10: 65 6b 20 2d 20 69 73 20 66 61 6c 73 65 2c 20 74  ek - is false, t
6d20: 68 65 6e 20 69 6e 73 74 65 61 64 20 6f 66 20 0a  hen instead of .
6d30: 2a 2a 20 72 65 74 75 72 6e 69 6e 67 20 74 68 65  ** returning the
6d40: 20 63 75 72 73 6f 72 20 74 6f 20 69 74 27 73 20   cursor to it's 
6d50: 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 2c 20  saved position, 
6d60: 61 6e 79 20 73 61 76 65 64 20 70 6f 73 69 74 69  any saved positi
6d70: 6f 6e 20 69 73 20 64 65 6c 65 74 65 64 0a 2a 2a  on is deleted.**
6d80: 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20   and the cursor 
6d90: 73 74 61 74 65 20 73 65 74 20 74 6f 20 43 55 52  state set to CUR
6da0: 53 4f 52 5f 49 4e 56 41 4c 49 44 2e 0a 2a 2f 0a  SOR_INVALID..*/.
6db0: 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 74 6f  static int resto
6dc0: 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50  reOrClearCursorP
6dd0: 6f 73 69 74 69 6f 6e 58 28 42 74 43 75 72 73 6f  ositionX(BtCurso
6de0: 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 64 6f 53  r *pCur, int doS
6df0: 65 65 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  eek){.  int rc =
6e00: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
6e10: 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
6e20: 74 65 3d 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te==CURSOR_REQUI
6e30: 52 45 53 45 45 4b 20 29 3b 0a 20 20 70 43 75 72  RESEEK );.  pCur
6e40: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
6e50: 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 69 66 28  R_INVALID;.  if(
6e60: 20 64 6f 53 65 65 6b 20 29 7b 0a 20 20 20 20 72   doSeek ){.    r
6e70: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
6e80: 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75  Moveto(pCur, pCu
6e90: 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e  r->pKey, pCur->n
6ea0: 4b 65 79 2c 20 26 70 43 75 72 2d 3e 73 6b 69 70  Key, &pCur->skip
6eb0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
6ec0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6ed0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 75    sqliteFree(pCu
6ee0: 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70 43  r->pKey);.    pC
6ef0: 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20  ur->pKey = 0;.  
6f00: 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
6f10: 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  _VALID==pCur->eS
6f20: 74 61 74 65 20 7c 7c 20 43 55 52 53 4f 52 5f 49  tate || CURSOR_I
6f30: 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
6f40: 74 61 74 65 20 29 3b 0a 20 20 7d 0a 20 20 72 65  tate );.  }.  re
6f50: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66  turn rc;.}..#def
6f60: 69 6e 65 20 72 65 73 74 6f 72 65 4f 72 43 6c 65  ine restoreOrCle
6f70: 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  arCursorPosition
6f80: 28 70 2c 78 29 20 5c 0a 20 20 28 70 2d 3e 65 53  (p,x) \.  (p->eS
6f90: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 52 45 51  tate==CURSOR_REQ
6fa0: 55 49 52 45 53 45 45 4b 3f 72 65 73 74 6f 72 65  UIRESEEK?restore
6fb0: 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73  OrClearCursorPos
6fc0: 69 74 69 6f 6e 58 28 70 2c 78 29 3a 53 51 4c 49  itionX(p,x):SQLI
6fd0: 54 45 5f 4f 4b 29 0a 0a 23 69 66 6e 64 65 66 20  TE_OK)..#ifndef 
6fe0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
6ff0: 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 54 68 65  VACUUM./*.** The
7000: 73 65 20 6d 61 63 72 6f 73 20 64 65 66 69 6e 65  se macros define
7010: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   the location of
7020: 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
7030: 20 65 6e 74 72 79 20 66 6f 72 20 61 20 0a 2a 2a   entry for a .**
7040: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20   database page. 
7050: 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
7060: 6e 74 20 74 6f 20 65 61 63 68 20 69 73 20 74 68  nt to each is th
7070: 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 73 61 62  e number of usab
7080: 6c 65 0a 2a 2a 20 62 79 74 65 73 20 6f 6e 20 65  le.** bytes on e
7090: 61 63 68 20 70 61 67 65 20 6f 66 20 74 68 65 20  ach page of the 
70a0: 64 61 74 61 62 61 73 65 20 28 6f 66 74 65 6e 20  database (often 
70b0: 31 30 32 34 29 2e 20 54 68 65 20 73 65 63 6f 6e  1024). The secon
70c0: 64 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65  d is the.** page
70d0: 20 6e 75 6d 62 65 72 20 74 6f 20 6c 6f 6f 6b 20   number to look 
70e0: 75 70 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65  up in the pointe
70f0: 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 50 54 52  r map..**.** PTR
7100: 4d 41 50 5f 50 41 47 45 4e 4f 20 72 65 74 75 72  MAP_PAGENO retur
7110: 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
7120: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
7130: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a  he pointer-map.*
7140: 2a 20 70 61 67 65 20 74 68 61 74 20 73 74 6f 72  * page that stor
7150: 65 73 20 74 68 65 20 72 65 71 75 69 72 65 64 20  es the required 
7160: 70 6f 69 6e 74 65 72 2e 20 50 54 52 4d 41 50 5f  pointer. PTRMAP_
7170: 50 54 52 4f 46 46 53 45 54 20 72 65 74 75 72 6e  PTROFFSET return
7180: 73 0a 2a 2a 20 74 68 65 20 6f 66 66 73 65 74 20  s.** the offset 
7190: 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  of the requested
71a0: 20 6d 61 70 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a   map entry..**.*
71b0: 2a 20 49 66 20 74 68 65 20 70 67 6e 6f 20 61 72  * If the pgno ar
71c0: 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f  gument passed to
71d0: 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 20 69   PTRMAP_PAGENO i
71e0: 73 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  s a pointer-map 
71f0: 70 61 67 65 2c 0a 2a 2a 20 74 68 65 6e 20 70 67  page,.** then pg
7200: 6e 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  no is returned. 
7210: 53 6f 20 28 70 67 6e 6f 3d 3d 50 54 52 4d 41 50  So (pgno==PTRMAP
7220: 5f 50 41 47 45 4e 4f 28 70 67 73 7a 2c 20 70 67  _PAGENO(pgsz, pg
7230: 6e 6f 29 29 20 63 61 6e 20 62 65 0a 2a 2a 20 75  no)) can be.** u
7240: 73 65 64 20 74 6f 20 74 65 73 74 20 69 66 20 70  sed to test if p
7250: 67 6e 6f 20 69 73 20 61 20 70 6f 69 6e 74 65 72  gno is a pointer
7260: 2d 6d 61 70 20 70 61 67 65 2e 20 50 54 52 4d 41  -map page. PTRMA
7270: 50 5f 49 53 50 41 47 45 20 69 6d 70 6c 65 6d 65  P_ISPAGE impleme
7280: 6e 74 73 0a 2a 2a 20 74 68 69 73 20 74 65 73 74  nts.** this test
7290: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 54 52  ..*/.#define PTR
72a0: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
72b0: 70 67 6e 6f 29 20 70 74 72 6d 61 70 50 61 67 65  pgno) ptrmapPage
72c0: 6e 6f 28 70 42 74 2c 20 70 67 6e 6f 29 0a 23 64  no(pBt, pgno).#d
72d0: 65 66 69 6e 65 20 50 54 52 4d 41 50 5f 50 54 52  efine PTRMAP_PTR
72e0: 4f 46 46 53 45 54 28 70 42 74 2c 20 70 67 6e 6f  OFFSET(pBt, pgno
72f0: 29 20 28 35 2a 28 70 67 6e 6f 2d 70 74 72 6d 61  ) (5*(pgno-ptrma
7300: 70 50 61 67 65 6e 6f 28 70 42 74 2c 20 70 67 6e  pPageno(pBt, pgn
7310: 6f 29 2d 31 29 29 0a 23 64 65 66 69 6e 65 20 50  o)-1)).#define P
7320: 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
7330: 2c 20 70 67 6e 6f 29 20 28 50 54 52 4d 41 50 5f  , pgno) (PTRMAP_
7340: 50 41 47 45 4e 4f 28 28 70 42 74 29 2c 28 70 67  PAGENO((pBt),(pg
7350: 6e 6f 29 29 3d 3d 28 70 67 6e 6f 29 29 0a 0a 73  no))==(pgno))..s
7360: 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61  tatic Pgno ptrma
7370: 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64  pPageno(BtShared
7380: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
7390: 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50  ){.  int nPagesP
73a0: 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74  erMapPage = (pBt
73b0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b  ->usableSize/5)+
73c0: 31 3b 0a 20 20 69 6e 74 20 69 50 74 72 4d 61 70  1;.  int iPtrMap
73d0: 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67   = (pgno-2)/nPag
73e0: 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20  esPerMapPage;.  
73f0: 69 6e 74 20 72 65 74 20 3d 20 28 69 50 74 72 4d  int ret = (iPtrM
7400: 61 70 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50  ap*nPagesPerMapP
7410: 61 67 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28  age) + 2; .  if(
7420: 20 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59   ret==PENDING_BY
7430: 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
7440: 20 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20      ret++;.  }. 
7450: 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a   return ret;.}..
7460: 2f 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  /*.** The pointe
7470: 72 20 6d 61 70 20 69 73 20 61 20 6c 6f 6f 6b 75  r map is a looku
7480: 70 20 74 61 62 6c 65 20 74 68 61 74 20 69 64 65  p table that ide
7490: 6e 74 69 66 69 65 73 20 74 68 65 20 70 61 72 65  ntifies the pare
74a0: 6e 74 20 70 61 67 65 20 66 6f 72 0a 2a 2a 20 65  nt page for.** e
74b0: 61 63 68 20 63 68 69 6c 64 20 70 61 67 65 20 69  ach child page i
74c0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
74d0: 69 6c 65 2e 20 20 54 68 65 20 70 61 72 65 6e 74  ile.  The parent
74e0: 20 70 61 67 65 20 69 73 20 74 68 65 20 70 61 67   page is the pag
74f0: 65 20 74 68 61 74 0a 2a 2a 20 63 6f 6e 74 61 69  e that.** contai
7500: 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
7510: 74 68 65 20 63 68 69 6c 64 2e 20 20 45 76 65 72  the child.  Ever
7520: 79 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  y page in the da
7530: 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 73 0a  tabase contains.
7540: 2a 2a 20 30 20 6f 72 20 31 20 70 61 72 65 6e 74  ** 0 or 1 parent
7550: 20 70 61 67 65 73 2e 20 20 28 49 6e 20 74 68 69   pages.  (In thi
7560: 73 20 63 6f 6e 74 65 78 74 20 27 64 61 74 61 62  s context 'datab
7570: 61 73 65 20 70 61 67 65 27 20 72 65 66 65 72 73  ase page' refers
7580: 0a 2a 2a 20 74 6f 20 61 6e 79 20 70 61 67 65 20  .** to any page 
7590: 74 68 61 74 20 69 73 20 6e 6f 74 20 70 61 72 74  that is not part
75a0: 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 20   of the pointer 
75b0: 6d 61 70 20 69 74 73 65 6c 66 2e 29 20 20 45 61  map itself.)  Ea
75c0: 63 68 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 2a  ch pointer map.*
75d0: 2a 20 65 6e 74 72 79 20 63 6f 6e 73 69 73 74 73  * entry consists
75e0: 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 62 79 74   of a single byt
75f0: 65 20 27 74 79 70 65 27 20 61 6e 64 20 61 20 34  e 'type' and a 4
7600: 20 62 79 74 65 20 70 61 72 65 6e 74 20 70 61 67   byte parent pag
7610: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 54 68 65  e number..** The
7620: 20 50 54 52 4d 41 50 5f 58 58 58 20 69 64 65 6e   PTRMAP_XXX iden
7630: 74 69 66 69 65 72 73 20 62 65 6c 6f 77 20 61 72  tifiers below ar
7640: 65 20 74 68 65 20 76 61 6c 69 64 20 74 79 70 65  e the valid type
7650: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 75 72  s..**.** The pur
7660: 70 6f 73 65 20 6f 66 20 74 68 65 20 70 6f 69 6e  pose of the poin
7670: 74 65 72 20 6d 61 70 20 69 73 20 74 6f 20 66 61  ter map is to fa
7680: 63 69 6c 69 74 79 20 6d 6f 76 69 6e 67 20 70 61  cility moving pa
7690: 67 65 73 20 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20  ges from one.** 
76a0: 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20  position in the 
76b0: 66 69 6c 65 20 74 6f 20 61 6e 6f 74 68 65 72 20  file to another 
76c0: 61 73 20 70 61 72 74 20 6f 66 20 61 75 74 6f 76  as part of autov
76d0: 61 63 75 75 6d 2e 20 20 57 68 65 6e 20 61 20 70  acuum.  When a p
76e0: 61 67 65 0a 2a 2a 20 69 73 20 6d 6f 76 65 64 2c  age.** is moved,
76f0: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 69 6e 20   the pointer in 
7700: 69 74 73 20 70 61 72 65 6e 74 20 6d 75 73 74 20  its parent must 
7710: 62 65 20 75 70 64 61 74 65 64 20 74 6f 20 70 6f  be updated to po
7720: 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20 6e 65  int to the.** ne
7730: 77 20 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 65  w location.  The
7740: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 69 73 20   pointer map is 
7750: 75 73 65 64 20 74 6f 20 6c 6f 63 61 74 65 20 74  used to locate t
7760: 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 71  he parent page q
7770: 75 69 63 6b 6c 79 2e 0a 2a 2a 0a 2a 2a 20 50 54  uickly..**.** PT
7780: 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 3a 20 54  RMAP_ROOTPAGE: T
7790: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
77a0: 20 69 73 20 61 20 72 6f 6f 74 2d 70 61 67 65 2e   is a root-page.
77b0: 20 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72   The page-number
77c0: 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20   is not.**      
77d0: 20 20 20 20 20 20 20 20 20 20 20 20 75 73 65 64              used
77e0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
77f0: 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 46 52 45 45  *.** PTRMAP_FREE
7800: 50 41 47 45 3a 20 54 68 65 20 64 61 74 61 62 61  PAGE: The databa
7810: 73 65 20 70 61 67 65 20 69 73 20 61 6e 20 75 6e  se page is an un
7820: 75 73 65 64 20 28 66 72 65 65 29 20 70 61 67 65  used (free) page
7830: 2e 20 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65  . The page-numbe
7840: 72 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  r .**           
7850: 20 20 20 20 20 20 20 69 73 20 6e 6f 74 20 75 73         is not us
7860: 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ed in this case.
7870: 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56  .**.** PTRMAP_OV
7880: 45 52 46 4c 4f 57 31 3a 20 54 68 65 20 64 61 74  ERFLOW1: The dat
7890: 61 62 61 73 65 20 70 61 67 65 20 69 73 20 74 68  abase page is th
78a0: 65 20 66 69 72 73 74 20 70 61 67 65 20 69 6e 20  e first page in 
78b0: 61 20 6c 69 73 74 20 6f 66 20 0a 2a 2a 20 20 20  a list of .**   
78c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78d0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
78e0: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
78f0: 69 64 65 6e 74 69 66 69 65 73 20 74 68 65 20 70  identifies the p
7900: 61 67 65 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  age that.**     
7910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
7920: 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20  ntains the cell 
7930: 77 69 74 68 20 61 20 70 6f 69 6e 74 65 72 20 74  with a pointer t
7940: 6f 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20  o this overflow 
7950: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  page..**.** PTRM
7960: 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 54 68  AP_OVERFLOW2: Th
7970: 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  e database page 
7980: 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72  is the second or
7990: 20 6c 61 74 65 72 20 70 61 67 65 20 69 6e 20 61   later page in a
79a0: 20 6c 69 73 74 20 6f 66 0a 2a 2a 20 20 20 20 20   list of.**     
79b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 76                ov
79c0: 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68  erflow pages. Th
79d0: 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 64  e page-number id
79e0: 65 6e 74 69 66 69 65 73 20 74 68 65 20 70 72 65  entifies the pre
79f0: 76 69 6f 75 73 0a 2a 2a 20 20 20 20 20 20 20 20  vious.**        
7a00: 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20             page 
7a10: 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
7a20: 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  page list..**.**
7a30: 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 54   PTRMAP_BTREE: T
7a40: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
7a50: 20 69 73 20 61 20 6e 6f 6e 2d 72 6f 6f 74 20 62   is a non-root b
7a60: 74 72 65 65 20 70 61 67 65 2e 20 54 68 65 20 70  tree page. The p
7a70: 61 67 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20  age number.**   
7a80: 20 20 20 20 20 20 20 20 20 20 20 20 69 64 65 6e              iden
7a90: 74 69 66 69 65 73 20 74 68 65 20 70 61 72 65 6e  tifies the paren
7aa0: 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 62 74  t page in the bt
7ab0: 72 65 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ree..*/.#define 
7ac0: 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
7ad0: 31 0a 23 64 65 66 69 6e 65 20 50 54 52 4d 41 50  1.#define PTRMAP
7ae0: 5f 46 52 45 45 50 41 47 45 20 32 0a 23 64 65 66  _FREEPAGE 2.#def
7af0: 69 6e 65 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  ine PTRMAP_OVERF
7b00: 4c 4f 57 31 20 33 0a 23 64 65 66 69 6e 65 20 50  LOW1 3.#define P
7b10: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20  TRMAP_OVERFLOW2 
7b20: 34 0a 23 64 65 66 69 6e 65 20 50 54 52 4d 41 50  4.#define PTRMAP
7b30: 5f 42 54 52 45 45 20 35 0a 0a 2f 2a 0a 2a 2a 20  _BTREE 5../*.** 
7b40: 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69  Write an entry i
7b50: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20  nto the pointer 
7b60: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
7b70: 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73 20  routine updates 
7b80: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
7b90: 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e  entry for page n
7ba0: 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73  umber 'key'.** s
7bb0: 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73 20 74  o that it maps t
7bc0: 6f 20 74 79 70 65 20 27 65 54 79 70 65 27 20 61  o type 'eType' a
7bd0: 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e  nd parent page n
7be0: 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a  umber 'pgno'..**
7bf0: 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   An error code i
7c00: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f  s returned if so
7c10: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
7c20: 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51  ng, otherwise SQ
7c30: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
7c40: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74  ic int ptrmapPut
7c50: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
7c60: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79  Pgno key, u8 eTy
7c70: 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 29  pe, Pgno parent)
7c80: 7b 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b  {.  u8 *pPtrmap;
7c90: 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
7ca0: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
7cb0: 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20   Pgno iPtrmap;  
7cc0: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
7cd0: 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20  map page number 
7ce0: 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b  */.  int offset;
7cf0: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
7d00: 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  n pointer map pa
7d10: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  ge */.  int rc;.
7d20: 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72  .  /* The master
7d30: 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75  -journal page nu
7d40: 6d 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20  mber must never 
7d50: 62 65 20 75 73 65 64 20 61 73 20 61 20 70 6f 69  be used as a poi
7d60: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
7d70: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54  .  assert( 0==PT
7d80: 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
7d90: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41   PENDING_BYTE_PA
7da0: 47 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61  GE(pBt)) );..  a
7db0: 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
7dc0: 56 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20  Vacuum );.  if( 
7dd0: 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  key==0 ){.    re
7de0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
7df0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
7e00: 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50  iPtrmap = PTRMAP
7e10: 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79  _PAGENO(pBt, key
7e20: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
7e30: 33 70 61 67 65 72 5f 67 65 74 28 70 42 74 2d 3e  3pager_get(pBt->
7e40: 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c  pPager, iPtrmap,
7e50: 20 28 76 6f 69 64 20 2a 2a 29 26 70 50 74 72 6d   (void **)&pPtrm
7e60: 61 70 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ap);.  if( rc!=S
7e70: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7e80: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
7e90: 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50   offset = PTRMAP
7ea0: 5f 50 54 52 4f 46 46 53 45 54 28 70 42 74 2c 20  _PTROFFSET(pBt, 
7eb0: 6b 65 79 29 3b 0a 0a 20 20 69 66 28 20 65 54 79  key);..  if( eTy
7ec0: 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73  pe!=pPtrmap[offs
7ed0: 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28  et] || get4byte(
7ee0: 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b  &pPtrmap[offset+
7ef0: 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20  1])!=parent ){. 
7f00: 20 20 20 54 52 41 43 45 28 28 22 50 54 52 4d 41     TRACE(("PTRMA
7f10: 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25  P_UPDATE: %d->(%
7f20: 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65  d,%d)\n", key, e
7f30: 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a  Type, parent));.
7f40: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
7f50: 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 74 72  pager_write(pPtr
7f60: 6d 61 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63  map);.    if( rc
7f70: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
7f80: 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66       pPtrmap[off
7f90: 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20  set] = eType;.  
7fa0: 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
7fb0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c  trmap[offset+1],
7fc0: 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a   parent);.    }.
7fd0: 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 70 61    }..  sqlite3pa
7fe0: 67 65 72 5f 75 6e 72 65 66 28 70 50 74 72 6d 61  ger_unref(pPtrma
7ff0: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
8000: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  .}../*.** Read a
8010: 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65  n entry from the
8020: 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a   pointer map..**
8030: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8040: 20 72 65 74 72 69 65 76 65 73 20 74 68 65 20 70   retrieves the p
8050: 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
8060: 20 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c   for page 'key',
8070: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20   writing.** the 
8080: 74 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20  type and parent 
8090: 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a  page number to *
80a0: 70 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e  pEType and *pPgn
80b0: 6f 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a  o respectively..
80c0: 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65  ** An error code
80d0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
80e0: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
80f0: 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20  rong, otherwise 
8100: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
8110: 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47  atic int ptrmapG
8120: 65 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  et(BtShared *pBt
8130: 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a  , Pgno key, u8 *
8140: 70 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50  pEType, Pgno *pP
8150: 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 50 74 72  gno){.  int iPtr
8160: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  map;       /* Po
8170: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 69  inter map page i
8180: 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50  ndex */.  u8 *pP
8190: 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20  trmap;       /* 
81a0: 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  Pointer map page
81b0: 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f   data */.  int o
81c0: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a  ffset;        /*
81d0: 20 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79   Offset of entry
81e0: 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20   in pointer map 
81f0: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  */.  int rc;..  
8200: 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50  iPtrmap = PTRMAP
8210: 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79  _PAGENO(pBt, key
8220: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
8230: 33 70 61 67 65 72 5f 67 65 74 28 70 42 74 2d 3e  3pager_get(pBt->
8240: 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c  pPager, iPtrmap,
8250: 20 28 76 6f 69 64 20 2a 2a 29 26 70 50 74 72 6d   (void **)&pPtrm
8260: 61 70 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30  ap);.  if( rc!=0
8270: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
8280: 63 3b 0a 20 20 7d 0a 0a 20 20 6f 66 66 73 65 74  c;.  }..  offset
8290: 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46   = PTRMAP_PTROFF
82a0: 53 45 54 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20  SET(pBt, key);. 
82b0: 20 61 73 73 65 72 74 28 20 70 45 54 79 70 65 21   assert( pEType!
82c0: 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65 20  =0 );.  *pEType 
82d0: 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  = pPtrmap[offset
82e0: 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20 29  ];.  if( pPgno )
82f0: 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62 79   *pPgno = get4by
8300: 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73  te(&pPtrmap[offs
8310: 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74  et+1]);..  sqlit
8320: 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70 50  e3pager_unref(pP
8330: 74 72 6d 61 70 29 3b 0a 20 20 69 66 28 20 2a 70  trmap);.  if( *p
8340: 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79  EType<1 || *pETy
8350: 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51  pe>5 ) return SQ
8360: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
8370: 54 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  T;.  return SQLI
8380: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66  TE_OK;.}..#endif
8390: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
83a0: 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 0a 2f  AUTOVACUUM */../
83b0: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74 72  *.** Given a btr
83c0: 65 65 20 70 61 67 65 20 61 6e 64 20 61 20 63 65  ee page and a ce
83d0: 6c 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61 6e  ll index (0 mean
83e0: 73 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c  s the first cell
83f0: 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c   on.** the page,
8400: 20 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65 63   1 means the sec
8410: 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f  ond cell, and so
8420: 20 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20 61   forth) return a
8430: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
8440: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e  he cell content.
8450: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
8460: 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66  ine works only f
8470: 6f 72 20 70 61 67 65 73 20 74 68 61 74 20 64 6f  or pages that do
8480: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65   not contain ove
8490: 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a  rflow cells..*/.
84a0: 73 74 61 74 69 63 20 75 38 20 2a 66 69 6e 64 43  static u8 *findC
84b0: 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
84c0: 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a  ge, int iCell){.
84d0: 20 20 75 38 20 2a 64 61 74 61 20 3d 20 70 50 61    u8 *data = pPa
84e0: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 61 73 73  ge->aData;.  ass
84f0: 65 72 74 28 20 69 43 65 6c 6c 3e 3d 30 20 29 3b  ert( iCell>=0 );
8500: 0a 20 20 61 73 73 65 72 74 28 20 69 43 65 6c 6c  .  assert( iCell
8510: 3c 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  <get2byte(&data[
8520: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
8530: 2b 33 5d 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  +3]) );.  return
8540: 20 64 61 74 61 20 2b 20 67 65 74 32 62 79 74 65   data + get2byte
8550: 28 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 65  (&data[pPage->ce
8560: 6c 6c 4f 66 66 73 65 74 2b 32 2a 69 43 65 6c 6c  llOffset+2*iCell
8570: 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ]);.}../*.** Thi
8580: 73 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78  s a more complex
8590: 20 76 65 72 73 69 6f 6e 20 6f 66 20 66 69 6e 64   version of find
85a0: 43 65 6c 6c 28 29 20 74 68 61 74 20 77 6f 72 6b  Cell() that work
85b0: 73 20 66 6f 72 0a 2a 2a 20 70 61 67 65 73 20 74  s for.** pages t
85c0: 68 61 74 20 64 6f 20 63 6f 6e 74 61 69 6e 20 6f  hat do contain o
85d0: 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 20 20  verflow cells.  
85e0: 53 65 65 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 74  See insert.*/.st
85f0: 61 74 69 63 20 75 38 20 2a 66 69 6e 64 4f 76 65  atic u8 *findOve
8600: 72 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50 61 67  rflowCell(MemPag
8610: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43  e *pPage, int iC
8620: 65 6c 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ell){.  int i;. 
8630: 20 66 6f 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f   for(i=pPage->nO
8640: 76 65 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b  verflow-1; i>=0;
8650: 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b   i--){.    int k
8660: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 5f 4f 76  ;.    struct _Ov
8670: 66 6c 43 65 6c 6c 20 2a 70 4f 76 66 6c 3b 0a 20  flCell *pOvfl;. 
8680: 20 20 20 70 4f 76 66 6c 20 3d 20 26 70 50 61 67     pOvfl = &pPag
8690: 65 2d 3e 61 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20  e->aOvfl[i];.   
86a0: 20 6b 20 3d 20 70 4f 76 66 6c 2d 3e 69 64 78 3b   k = pOvfl->idx;
86b0: 0a 20 20 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c  .    if( k<=iCel
86c0: 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6b  l ){.      if( k
86d0: 3d 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ==iCell ){.     
86e0: 20 20 20 72 65 74 75 72 6e 20 70 4f 76 66 6c 2d     return pOvfl-
86f0: 3e 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  >pCell;.      }.
8700: 20 20 20 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20        iCell--;. 
8710: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
8720: 6e 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  n findCell(pPage
8730: 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a  , iCell);.}../*.
8740: 2a 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20  ** Parse a cell 
8750: 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e  content block an
8760: 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65  d fill in the Ce
8770: 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  llInfo structure
8780: 2e 20 20 54 68 65 72 65 0a 2a 2a 20 61 72 65 20  .  There.** are 
8790: 74 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  two versions of 
87a0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20  this function.  
87b0: 70 61 72 73 65 43 65 6c 6c 28 29 20 74 61 6b 65  parseCell() take
87c0: 73 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 0a 2a  s a cell index.*
87d0: 2a 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  * as the second 
87e0: 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 70 61 72  argument and par
87f0: 73 65 43 65 6c 6c 50 74 72 28 29 20 74 61 6b 65  seCellPtr() take
8800: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
8810: 68 65 0a 2a 2a 20 62 6f 64 79 20 6f 66 20 74 68  he.** body of th
8820: 65 20 63 65 6c 6c 20 61 73 20 69 74 73 20 73 65  e cell as its se
8830: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
8840: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
8850: 72 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65  rseCellPtr(.  Me
8860: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
8870: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
8880: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c  ntaining the cel
8890: 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  l */.  u8 *pCell
88a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
88b0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
88c0: 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20   cell text. */. 
88d0: 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
88e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c           /* Fill
88f0: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
8900: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  re */.){.  int n
8910: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8920: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74     /* Number byt
8930: 65 73 20 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65  es in cell conte
8940: 6e 74 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  nt header */.  u
8950: 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20  32 nPayload;    
8960: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
8970: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c   of bytes of cel
8980: 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20  l payload */..  
8990: 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70  pInfo->pCell = p
89a0: 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Cell;.  assert( 
89b0: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c  pPage->leaf==0 |
89c0: 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31  | pPage->leaf==1
89d0: 20 29 3b 0a 20 20 6e 20 3d 20 70 50 61 67 65 2d   );.  n = pPage-
89e0: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
89f0: 20 61 73 73 65 72 74 28 20 6e 3d 3d 34 2d 34 2a   assert( n==4-4*
8a00: 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20  pPage->leaf );. 
8a10: 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44   if( pPage->hasD
8a20: 61 74 61 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20  ata ){.    n += 
8a30: 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 43 65  getVarint32(&pCe
8a40: 6c 6c 5b 6e 5d 2c 20 26 6e 50 61 79 6c 6f 61 64  ll[n], &nPayload
8a50: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
8a60: 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20  nPayload = 0;.  
8a70: 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61  }.  pInfo->nData
8a80: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 69   = nPayload;.  i
8a90: 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
8aa0: 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74   ){.    n += get
8ab0: 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d  Varint(&pCell[n]
8ac0: 2c 20 28 75 36 34 20 2a 29 26 70 49 6e 66 6f 2d  , (u64 *)&pInfo-
8ad0: 3e 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b  >nKey);.  }else{
8ae0: 0a 20 20 20 20 75 33 32 20 78 3b 0a 20 20 20 20  .    u32 x;.    
8af0: 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  n += getVarint32
8b00: 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 26 78 29 3b  (&pCell[n], &x);
8b10: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79  .    pInfo->nKey
8b20: 20 3d 20 78 3b 0a 20 20 20 20 6e 50 61 79 6c 6f   = x;.    nPaylo
8b30: 61 64 20 2b 3d 20 78 3b 0a 20 20 7d 0a 20 20 70  ad += x;.  }.  p
8b40: 49 6e 66 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20  Info->nHeader = 
8b50: 6e 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61  n;.  if( nPayloa
8b60: 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d<=pPage->maxLoc
8b70: 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  al ){.    /* Thi
8b80: 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29 20  s is the (easy) 
8b90: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
8ba0: 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 79  e the entire pay
8bb0: 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a  load fits.    **
8bc0: 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
8bd0: 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77  ge.  No overflow
8be0: 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20   is required..  
8bf0: 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 69    */.    int nSi
8c00: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ze;          /* 
8c10: 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 63 65  Total size of ce
8c20: 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 62 79  ll content in by
8c30: 74 65 73 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f  tes */.    pInfo
8c40: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 6e 50 61 79 6c  ->nLocal = nPayl
8c50: 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  oad;.    pInfo->
8c60: 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  iOverflow = 0;. 
8c70: 20 20 20 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c     nSize = nPayl
8c80: 6f 61 64 20 2b 20 6e 3b 0a 20 20 20 20 69 66 28  oad + n;.    if(
8c90: 20 6e 53 69 7a 65 3c 34 20 29 7b 0a 20 20 20 20   nSize<4 ){.    
8ca0: 20 20 6e 53 69 7a 65 20 3d 20 34 3b 20 20 20 20    nSize = 4;    
8cb0: 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63      /* Minimum c
8cc0: 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f  ell size is 4 */
8cd0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f  .    }.    pInfo
8ce0: 2d 3e 6e 53 69 7a 65 20 3d 20 6e 53 69 7a 65 3b  ->nSize = nSize;
8cf0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
8d00: 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20   If the payload 
8d10: 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d  will not fit com
8d20: 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c  pletely on the l
8d30: 6f 63 61 6c 20 70 61 67 65 2c 20 77 65 20 68 61  ocal page, we ha
8d40: 76 65 0a 20 20 20 20 2a 2a 20 74 6f 20 64 65 63  ve.    ** to dec
8d50: 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74 6f 20  ide how much to 
8d60: 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e  store locally an
8d70: 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 70  d how much to sp
8d80: 69 6c 6c 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20  ill onto.    ** 
8d90: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
8da0: 20 54 68 65 20 73 74 72 61 74 65 67 79 20 69 73   The strategy is
8db0: 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65   to minimize the
8dc0: 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65   amount of unuse
8dd0: 64 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 6f  d.    ** space o
8de0: 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  n overflow pages
8df0: 20 77 68 69 6c 65 20 6b 65 65 70 69 6e 67 20 74   while keeping t
8e00: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63  he amount of loc
8e10: 61 6c 20 73 74 6f 72 61 67 65 0a 20 20 20 20 2a  al storage.    *
8e20: 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e  * in between min
8e30: 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63  Local and maxLoc
8e40: 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  al..    **.    *
8e50: 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e  * Warning:  chan
8e60: 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65  ging the way ove
8e70: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73  rflow payload is
8e80: 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20   distributed in 
8e90: 61 6e 79 0a 20 20 20 20 2a 2a 20 77 61 79 20 77  any.    ** way w
8ea0: 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e  ill result in an
8eb0: 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69   incompatible fi
8ec0: 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20 20 20 2a  le format..    *
8ed0: 2f 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63  /.    int minLoc
8ee0: 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  al;  /* Minimum 
8ef0: 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
8f00: 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a  d held locally *
8f10: 2f 0a 20 20 20 20 69 6e 74 20 6d 61 78 4c 6f 63  /.    int maxLoc
8f20: 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20  al;  /* Maximum 
8f30: 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
8f40: 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a  d held locally *
8f50: 2f 0a 20 20 20 20 69 6e 74 20 73 75 72 70 6c 75  /.    int surplu
8f60: 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77  s;   /* Overflow
8f70: 20 70 61 79 6c 6f 61 64 20 61 76 61 69 6c 61 62   payload availab
8f80: 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f  le for local sto
8f90: 72 61 67 65 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e  rage */..    min
8fa0: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
8fb0: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6d 61 78  inLocal;.    max
8fc0: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
8fd0: 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 73 75 72  axLocal;.    sur
8fe0: 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20  plus = minLocal 
8ff0: 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69  + (nPayload - mi
9000: 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e  nLocal)%(pPage->
9010: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
9020: 2d 20 34 29 3b 0a 20 20 20 20 69 66 28 20 73 75  - 4);.    if( su
9030: 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61  rplus <= maxLoca
9040: 6c 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f  l ){.      pInfo
9050: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 73 75 72 70 6c  ->nLocal = surpl
9060: 75 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  us;.    }else{. 
9070: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63       pInfo->nLoc
9080: 61 6c 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  al = minLocal;. 
9090: 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e     }.    pInfo->
90a0: 69 4f 76 65 72 66 6c 6f 77 20 3d 20 70 49 6e 66  iOverflow = pInf
90b0: 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6e 3b 0a 20  o->nLocal + n;. 
90c0: 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20     pInfo->nSize 
90d0: 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c  = pInfo->iOverfl
90e0: 6f 77 20 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 73 74  ow + 4;.  }.}.st
90f0: 61 74 69 63 20 76 6f 69 64 20 70 61 72 73 65 43  atic void parseC
9100: 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
9110: 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f  pPage,         /
9120: 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
9130: 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  g the cell */.  
9140: 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20  int iCell,      
9150: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
9160: 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72 73  ell index.  Firs
9170: 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20  t cell is 0 */. 
9180: 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
9190: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c           /* Fill
91a0: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
91b0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 61 72 73 65  re */.){.  parse
91c0: 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 66  CellPtr(pPage, f
91d0: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
91e0: 43 65 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a 7d  Cell), pInfo);.}
91f0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
9200: 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
9210: 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 20 61   of bytes that a
9220: 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74   Cell needs in t
9230: 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20  he cell.** data 
9240: 61 72 65 61 20 6f 66 20 74 68 65 20 62 74 72 65  area of the btre
9250: 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65 74  e-page.  The ret
9260: 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75  urn number inclu
9270: 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20  des the cell.** 
9280: 64 61 74 61 20 68 65 61 64 65 72 20 61 6e 64 20  data header and 
9290: 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61  the local payloa
92a0: 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f  d, but not any o
92b0: 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a  verflow page or.
92c0: 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75 73 65  ** the space use
92d0: 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f  d by the cell po
92e0: 69 6e 74 65 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65  inter..*/.#ifnde
92f0: 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20  f NDEBUG.static 
9300: 69 6e 74 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d  int cellSize(Mem
9310: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
9320: 20 69 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49   iCell){.  CellI
9330: 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 70 61 72 73  nfo info;.  pars
9340: 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  eCell(pPage, iCe
9350: 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 72 65  ll, &info);.  re
9360: 74 75 72 6e 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b  turn info.nSize;
9370: 0a 7d 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63  .}.#endif.static
9380: 20 69 6e 74 20 63 65 6c 6c 53 69 7a 65 50 74 72   int cellSizePtr
9390: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
93a0: 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 43   u8 *pCell){.  C
93b0: 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
93c0: 70 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  parseCellPtr(pPa
93d0: 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
93e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 66 6f  );.  return info
93f0: 2e 6e 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 6e 64  .nSize;.}..#ifnd
9400: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
9410: 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
9420: 49 66 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c  If the cell pCel
9430: 6c 2c 20 70 61 72 74 20 6f 66 20 70 61 67 65 20  l, part of page 
9440: 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61  pPage contains a
9450: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61   pointer.** to a
9460: 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  n overflow page,
9470: 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79   insert an entry
9480: 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
9490: 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65  r-map.** for the
94a0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a   overflow page..
94b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74  */.static int pt
94c0: 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d  rmapPutOvflPtr(M
94d0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
94e0: 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 69 66 28  8 *pCell){.  if(
94f0: 20 70 43 65 6c 6c 20 29 7b 0a 20 20 20 20 43 65   pCell ){.    Ce
9500: 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
9510: 20 70 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50   parseCellPtr(pP
9520: 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
9530: 6f 29 3b 0a 20 20 20 20 69 66 28 20 28 69 6e 66  o);.    if( (inf
9540: 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e  o.nData+(pPage->
9550: 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b  intKey?0:info.nK
9560: 65 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  ey))>info.nLocal
9570: 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6f   ){.      Pgno o
9580: 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26  vfl = get4byte(&
9590: 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
95a0: 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20 72 65  flow]);.      re
95b0: 74 75 72 6e 20 70 74 72 6d 61 70 50 75 74 28 70  turn ptrmapPut(p
95c0: 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c  Page->pBt, ovfl,
95d0: 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
95e0: 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  1, pPage->pgno);
95f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
9600: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
9610: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  ./*.** If the ce
9620: 6c 6c 20 77 69 74 68 20 69 6e 64 65 78 20 69 43  ll with index iC
9630: 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67  ell on page pPag
9640: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  e contains a poi
9650: 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76  nter.** to an ov
9660: 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73  erflow page, ins
9670: 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74  ert an entry int
9680: 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
9690: 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65  p.** for the ove
96a0: 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73  rflow page..*/.s
96b0: 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70  tatic int ptrmap
96c0: 50 75 74 4f 76 66 6c 28 4d 65 6d 50 61 67 65 20  PutOvfl(MemPage 
96d0: 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c  *pPage, int iCel
96e0: 6c 29 7b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 3b  l){.  u8 *pCell;
96f0: 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 4f  .  pCell = findO
9700: 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 67  verflowCell(pPag
9710: 65 2c 20 69 43 65 6c 6c 29 3b 0a 20 20 72 65 74  e, iCell);.  ret
9720: 75 72 6e 20 70 74 72 6d 61 70 50 75 74 4f 76 66  urn ptrmapPutOvf
9730: 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
9740: 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f  l);.}.#endif.../
9750: 2a 20 41 20 62 75 6e 63 68 20 6f 66 20 61 73 73  * A bunch of ass
9760: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
9770: 20 74 6f 20 63 68 65 63 6b 20 74 68 65 20 74 72   to check the tr
9780: 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20  ansaction state 
9790: 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f 66 20  variables.** of 
97a0: 68 61 6e 64 6c 65 20 70 20 28 74 79 70 65 20 42  handle p (type B
97b0: 74 72 65 65 2a 29 20 61 72 65 20 69 6e 74 65 72  tree*) are inter
97c0: 6e 61 6c 6c 79 20 63 6f 6e 73 69 73 74 65 6e 74  nally consistent
97d0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 62 74 72  ..*/.#define btr
97e0: 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 20 5c  eeIntegrity(p) \
97f0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e  .  assert( p->in
9800: 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans!=TRANS_NON
9810: 45 20 7c 7c 20 70 2d 3e 70 42 74 2d 3e 6e 54 72  E || p->pBt->nTr
9820: 61 6e 73 61 63 74 69 6f 6e 3c 70 2d 3e 70 42 74  ansaction<p->pBt
9830: 2d 3e 6e 52 65 66 20 29 3b 20 5c 0a 20 20 61 73  ->nRef ); \.  as
9840: 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 6e 54  sert( p->pBt->nT
9850: 72 61 6e 73 61 63 74 69 6f 6e 3c 3d 70 2d 3e 70  ransaction<=p->p
9860: 42 74 2d 3e 6e 52 65 66 20 29 3b 20 5c 0a 20 20  Bt->nRef ); \.  
9870: 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e  assert( p->pBt->
9880: 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d 54  inTransaction!=T
9890: 52 41 4e 53 5f 4e 4f 4e 45 20 7c 7c 20 70 2d 3e  RANS_NONE || p->
98a0: 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
98b0: 6e 3d 3d 30 20 29 3b 20 5c 0a 20 20 61 73 73 65  n==0 ); \.  asse
98c0: 72 74 28 20 70 2d 3e 70 42 74 2d 3e 69 6e 54 72  rt( p->pBt->inTr
98d0: 61 6e 73 61 63 74 69 6f 6e 3e 3d 70 2d 3e 69 6e  ansaction>=p->in
98e0: 54 72 61 6e 73 20 29 3b 20 0a 0a 2f 2a 0a 2a 2a  Trans ); ../*.**
98f0: 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20   Defragment the 
9900: 70 61 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c  page given.  All
9910: 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64   Cells are moved
9920: 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f   to the.** end o
9930: 66 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 61  f the page and a
9940: 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20 69 73  ll free space is
9950: 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20   collected into 
9960: 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42  one.** big FreeB
9970: 6c 6b 20 74 68 61 74 20 6f 63 63 75 72 73 20 69  lk that occurs i
9980: 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 68 65  n between the he
9990: 61 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a  ader and cell.**
99a0: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61   pointer array a
99b0: 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  nd the cell cont
99c0: 65 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61  ent area..*/.sta
99d0: 74 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65  tic int defragme
99e0: 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  ntPage(MemPage *
99f0: 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pPage){.  int i;
9a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a10: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
9a20: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63  nter */.  int pc
9a30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9a40: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
9a50: 6f 66 20 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a  of a i-th cell *
9a60: 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20  /.  int addr;   
9a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9a80: 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73  * Offset of firs
9a90: 74 20 62 79 74 65 20 61 66 74 65 72 20 63 65 6c  t byte after cel
9aa0: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  l pointer array 
9ab0: 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
9ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ad0: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
9ae0: 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
9af0: 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20    int size;     
9b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9b10: 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a  Size of a cell *
9b20: 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  /.  int usableSi
9b30: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
9b40: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62  * Number of usab
9b50: 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61  le bytes on a pa
9b60: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  ge */.  int cell
9b70: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
9b80: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
9b90: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
9ba0: 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
9bb0: 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  brk;            
9bc0: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
9bd0: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
9be0: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69  tent area */.  i
9bf0: 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20  nt nCell;       
9c00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
9c10: 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20  ber of cells on 
9c20: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e  the page */.  un
9c30: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
9c40: 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  a;       /* The 
9c50: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75  page data */.  u
9c60: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65  nsigned char *te
9c70: 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  mp;       /* Tem
9c80: 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20  p area for cell 
9c90: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73  content */..  as
9ca0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 70 61 67  sert( sqlite3pag
9cb0: 65 72 5f 69 73 77 72 69 74 65 61 62 6c 65 28 70  er_iswriteable(p
9cc0: 50 61 67 65 2d 3e 61 44 61 74 61 29 20 29 3b 0a  Page->aData) );.
9cd0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
9ce0: 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
9cf0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d  ert( pPage->pBt-
9d00: 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53  >usableSize <= S
9d10: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
9d20: 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IZE );.  assert(
9d30: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
9d40: 77 3d 3d 30 20 29 3b 0a 20 20 74 65 6d 70 20 3d  w==0 );.  temp =
9d50: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70   sqliteMalloc( p
9d60: 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53  Page->pBt->pageS
9d70: 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 74 65 6d  ize );.  if( tem
9d80: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  p==0 ) return SQ
9d90: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 64 61  LITE_NOMEM;.  da
9da0: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
9db0: 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  a;.  hdr = pPage
9dc0: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63  ->hdrOffset;.  c
9dd0: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67  ellOffset = pPag
9de0: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20  e->cellOffset;. 
9df0: 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
9e00: 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  nCell;.  assert(
9e10: 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65   nCell==get2byte
9e20: 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29  (&data[hdr+3]) )
9e30: 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ;.  usableSize =
9e40: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
9e50: 62 6c 65 53 69 7a 65 3b 0a 20 20 62 72 6b 20 3d  bleSize;.  brk =
9e60: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
9e70: 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70  hdr+5]);.  memcp
9e80: 79 28 26 74 65 6d 70 5b 62 72 6b 5d 2c 20 26 64  y(&temp[brk], &d
9e90: 61 74 61 5b 62 72 6b 5d 2c 20 75 73 61 62 6c 65  ata[brk], usable
9ea0: 53 69 7a 65 20 2d 20 62 72 6b 29 3b 0a 20 20 62  Size - brk);.  b
9eb0: 72 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b  rk = usableSize;
9ec0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
9ed0: 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  ell; i++){.    u
9ee0: 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a  8 *pAddr;     /*
9ef0: 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70   The i-th cell p
9f00: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41  ointer */.    pA
9f10: 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c  ddr = &data[cell
9f20: 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20  Offset + i*2];. 
9f30: 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65     pc = get2byte
9f40: 28 70 41 64 64 72 29 3b 0a 20 20 20 20 61 73 73  (pAddr);.    ass
9f50: 65 72 74 28 20 70 63 3c 70 50 61 67 65 2d 3e 70  ert( pc<pPage->p
9f60: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
9f70: 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 63 65 6c  ;.    size = cel
9f80: 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
9f90: 26 74 65 6d 70 5b 70 63 5d 29 3b 0a 20 20 20 20  &temp[pc]);.    
9fa0: 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20  brk -= size;.   
9fb0: 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 62 72   memcpy(&data[br
9fc0: 6b 5d 2c 20 26 74 65 6d 70 5b 70 63 5d 2c 20 73  k], &temp[pc], s
9fd0: 69 7a 65 29 3b 0a 20 20 20 20 70 75 74 32 62 79  ize);.    put2by
9fe0: 74 65 28 70 41 64 64 72 2c 20 62 72 6b 29 3b 0a  te(pAddr, brk);.
9ff0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 62 72    }.  assert( br
a000: 6b 3e 3d 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a  k>=cellOffset+2*
a010: 6e 43 65 6c 6c 20 29 3b 0a 20 20 70 75 74 32 62  nCell );.  put2b
a020: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
a030: 2c 20 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68  , brk);.  data[h
a040: 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74  dr+1] = 0;.  dat
a050: 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20  a[hdr+2] = 0;.  
a060: 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b  data[hdr+7] = 0;
a070: 0a 20 20 61 64 64 72 20 3d 20 63 65 6c 6c 4f 66  .  addr = cellOf
a080: 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 3b 0a 20 20  fset+2*nCell;.  
a090: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 61 64 64  memset(&data[add
a0a0: 72 5d 2c 20 30 2c 20 62 72 6b 2d 61 64 64 72 29  r], 0, brk-addr)
a0b0: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 74  ;.  sqliteFree(t
a0c0: 65 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  emp);.  return S
a0d0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
a0e0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74  ** Allocate nByt
a0f0: 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  e bytes of space
a100: 20 6f 6e 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a   on a page..**.*
a110: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64  * Return the ind
a120: 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61  ex into pPage->a
a130: 44 61 74 61 5b 5d 20 6f 66 20 74 68 65 20 66 69  Data[] of the fi
a140: 72 73 74 20 62 79 74 65 20 6f 66 0a 2a 2a 20 74  rst byte of.** t
a150: 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f  he new allocatio
a160: 6e 2e 20 4f 72 20 72 65 74 75 72 6e 20 30 20 69  n. Or return 0 i
a170: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 65  f there is not e
a180: 6e 6f 75 67 68 20 66 72 65 65 0a 2a 2a 20 73 70  nough free.** sp
a190: 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ace on the page 
a1a0: 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 20 61  to satisfy the a
a1b0: 6c 6c 6f 63 61 74 69 6f 6e 20 72 65 71 75 65 73  llocation reques
a1c0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
a1d0: 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 42  page contains nB
a1e0: 79 74 65 73 20 6f 66 20 66 72 65 65 20 73 70 61  ytes of free spa
a1f0: 63 65 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20  ce but does not 
a200: 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 42 79 74 65  contain.** nByte
a210: 73 20 6f 66 20 63 6f 6e 74 69 67 75 6f 75 73 20  s of contiguous 
a220: 66 72 65 65 20 73 70 61 63 65 2c 20 74 68 65 6e  free space, then
a230: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 75   this routine au
a240: 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 2a 2a 20 63  tomatically.** c
a250: 61 6c 6c 73 20 64 65 66 72 61 67 65 6d 65 6e 74  alls defragement
a260: 50 61 67 65 28 29 20 74 6f 20 63 6f 6e 73 6f 6c  Page() to consol
a270: 69 64 61 74 65 20 61 6c 6c 20 66 72 65 65 20 73  idate all free s
a280: 70 61 63 65 20 62 65 66 6f 72 65 20 0a 2a 2a 20  pace before .** 
a290: 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 6e  allocating the n
a2a0: 65 77 20 63 68 75 6e 6b 2e 0a 2a 2f 0a 73 74 61  ew chunk..*/.sta
a2b0: 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
a2c0: 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70  Space(MemPage *p
a2d0: 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 29  Page, int nByte)
a2e0: 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 70 63  {.  int addr, pc
a2f0: 2c 20 68 64 72 3b 0a 20 20 69 6e 74 20 73 69 7a  , hdr;.  int siz
a300: 65 3b 0a 20 20 69 6e 74 20 6e 46 72 61 67 3b 0a  e;.  int nFrag;.
a310: 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 69 6e 74    int top;.  int
a320: 20 6e 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 63 65   nCell;.  int ce
a330: 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 75 6e 73 69  llOffset;.  unsi
a340: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b  gned char *data;
a350: 0a 20 20 0a 20 20 64 61 74 61 20 3d 20 70 50 61  .  .  data = pPa
a360: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 61 73 73  ge->aData;.  ass
a370: 65 72 74 28 20 73 71 6c 69 74 65 33 70 61 67 65  ert( sqlite3page
a380: 72 5f 69 73 77 72 69 74 65 61 62 6c 65 28 64 61  r_iswriteable(da
a390: 74 61 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ta) );.  assert(
a3a0: 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20   pPage->pBt );. 
a3b0: 20 69 66 28 20 6e 42 79 74 65 3c 34 20 29 20 6e   if( nByte<4 ) n
a3c0: 42 79 74 65 20 3d 20 34 3b 0a 20 20 69 66 28 20  Byte = 4;.  if( 
a3d0: 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c 6e 42 79  pPage->nFree<nBy
a3e0: 74 65 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 4f 76  te || pPage->nOv
a3f0: 65 72 66 6c 6f 77 3e 30 20 29 20 72 65 74 75 72  erflow>0 ) retur
a400: 6e 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46  n 0;.  pPage->nF
a410: 72 65 65 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20  ree -= nByte;.  
a420: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
a430: 4f 66 66 73 65 74 3b 0a 0a 20 20 6e 46 72 61 67  Offset;..  nFrag
a440: 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 3b 0a   = data[hdr+7];.
a450: 20 20 69 66 28 20 6e 46 72 61 67 3c 36 30 20 29    if( nFrag<60 )
a460: 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20  {.    /* Search 
a470: 74 68 65 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f  the freelist loo
a480: 6b 69 6e 67 20 66 6f 72 20 61 20 73 6c 6f 74 20  king for a slot 
a490: 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73 61  big enough to sa
a4a0: 74 69 73 66 79 20 74 68 65 0a 20 20 20 20 2a 2a  tisfy the.    **
a4b0: 20 73 70 61 63 65 20 72 65 71 75 65 73 74 2e 20   space request. 
a4c0: 2a 2f 0a 20 20 20 20 61 64 64 72 20 3d 20 68 64  */.    addr = hd
a4d0: 72 2b 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  r+1;.    while( 
a4e0: 28 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26  (pc = get2byte(&
a4f0: 64 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29  data[addr]))>0 )
a500: 7b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67  {.      size = g
a510: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
a520: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +2]);.      if( 
a530: 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29 7b 0a 20  size>=nByte ){. 
a540: 20 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3c         if( size<
a550: 6e 42 79 74 65 2b 34 20 29 7b 0a 20 20 20 20 20  nByte+4 ){.     
a560: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74       memcpy(&dat
a570: 61 5b 61 64 64 72 5d 2c 20 26 64 61 74 61 5b 70  a[addr], &data[p
a580: 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20  c], 2);.        
a590: 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20    data[hdr+7] = 
a5a0: 6e 46 72 61 67 20 2b 20 73 69 7a 65 20 2d 20 6e  nFrag + size - n
a5b0: 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Byte;.          
a5c0: 72 65 74 75 72 6e 20 70 63 3b 0a 20 20 20 20 20  return pc;.     
a5d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a5e0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
a5f0: 74 61 5b 70 63 2b 32 5d 2c 20 73 69 7a 65 2d 6e  ta[pc+2], size-n
a600: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Byte);.         
a610: 20 72 65 74 75 72 6e 20 70 63 20 2b 20 73 69 7a   return pc + siz
a620: 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20  e - nByte;.     
a630: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
a640: 20 20 20 61 64 64 72 20 3d 20 70 63 3b 0a 20 20     addr = pc;.  
a650: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c    }.  }..  /* Al
a660: 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72  locate memory fr
a670: 6f 6d 20 74 68 65 20 67 61 70 20 69 6e 20 62 65  om the gap in be
a680: 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70  tween the cell p
a690: 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a  ointer array.  *
a6a0: 2a 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63  * and the cell c
a6b0: 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a 20 20 2a  ontent area..  *
a6c0: 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79  /.  top = get2by
a6d0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
a6e0: 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32  ;.  nCell = get2
a6f0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
a700: 5d 29 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74  ]);.  cellOffset
a710: 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
a720: 66 73 65 74 3b 0a 20 20 69 66 28 20 6e 46 72 61  fset;.  if( nFra
a730: 67 3e 3d 36 30 20 7c 7c 20 63 65 6c 6c 4f 66 66  g>=60 || cellOff
a740: 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 20 3e 20  set + 2*nCell > 
a750: 74 6f 70 20 2d 20 6e 42 79 74 65 20 29 7b 0a 20  top - nByte ){. 
a760: 20 20 20 69 66 28 20 64 65 66 72 61 67 6d 65 6e     if( defragmen
a770: 74 50 61 67 65 28 70 50 61 67 65 29 20 29 20 72  tPage(pPage) ) r
a780: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 74 6f 70  eturn 0;.    top
a790: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
a7a0: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 7d 0a 20  a[hdr+5]);.  }. 
a7b0: 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20   top -= nByte;. 
a7c0: 20 61 73 73 65 72 74 28 20 63 65 6c 6c 4f 66 66   assert( cellOff
a7d0: 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 20 3c 3d  set + 2*nCell <=
a7e0: 20 74 6f 70 20 29 3b 0a 20 20 70 75 74 32 62 79   top );.  put2by
a7f0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
a800: 20 74 6f 70 29 3b 0a 20 20 72 65 74 75 72 6e 20   top);.  return 
a810: 74 6f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  top;.}../*.** Re
a820: 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f  turn a section o
a830: 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61  f the pPage->aDa
a840: 74 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ta to the freeli
a850: 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  st..** The first
a860: 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77   byte of the new
a870: 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70   free block is p
a880: 50 61 67 65 2d 3e 61 44 69 73 6b 5b 73 74 61 72  Page->aDisk[star
a890: 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69  t].** and the si
a8a0: 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20  ze of the block 
a8b0: 69 73 20 22 73 69 7a 65 22 20 62 79 74 65 73 2e  is "size" bytes.
a8c0: 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20 74  .**.** Most of t
a8d0: 68 65 20 65 66 66 6f 72 74 20 68 65 72 65 20 69  he effort here i
a8e0: 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 63 6f  s involved in co
a8f0: 61 6c 65 73 69 6e 67 20 61 64 6a 61 63 65 6e 74  alesing adjacent
a900: 0a 2a 2a 20 66 72 65 65 20 62 6c 6f 63 6b 73 20  .** free blocks 
a910: 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 69  into a single bi
a920: 67 20 66 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f  g free block..*/
a930: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
a940: 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a  eSpace(MemPage *
a950: 70 50 61 67 65 2c 20 69 6e 74 20 73 74 61 72 74  pPage, int start
a960: 2c 20 69 6e 74 20 73 69 7a 65 29 7b 0a 20 20 69  , int size){.  i
a970: 6e 74 20 61 64 64 72 2c 20 70 62 65 67 69 6e 2c  nt addr, pbegin,
a980: 20 68 64 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64   hdr;.  unsigned
a990: 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50   char *data = pP
a9a0: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61  age->aData;..  a
a9b0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
a9c0: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
a9d0: 28 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 69  ( sqlite3pager_i
a9e0: 73 77 72 69 74 65 61 62 6c 65 28 64 61 74 61 29  swriteable(data)
a9f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74   );.  assert( st
aa00: 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f  art>=pPage->hdrO
aa10: 66 66 73 65 74 2b 36 2b 28 70 50 61 67 65 2d 3e  ffset+6+(pPage->
aa20: 6c 65 61 66 3f 30 3a 34 29 20 29 3b 0a 20 20 61  leaf?0:4) );.  a
aa30: 73 73 65 72 74 28 20 28 73 74 61 72 74 20 2b 20  ssert( (start + 
aa40: 73 69 7a 65 29 3c 3d 70 50 61 67 65 2d 3e 70 42  size)<=pPage->pB
aa50: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
aa60: 0a 20 20 69 66 28 20 73 69 7a 65 3c 34 20 29 20  .  if( size<4 ) 
aa70: 73 69 7a 65 20 3d 20 34 3b 0a 0a 23 69 66 64 65  size = 4;..#ifde
aa80: 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f  f SQLITE_SECURE_
aa90: 44 45 4c 45 54 45 0a 20 20 2f 2a 20 4f 76 65 72  DELETE.  /* Over
aaa0: 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e  write deleted in
aab0: 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a  formation with z
aac0: 65 72 6f 73 20 77 68 65 6e 20 74 68 65 20 53 45  eros when the SE
aad0: 43 55 52 45 5f 44 45 4c 45 54 45 20 0a 20 20 2a  CURE_DELETE .  *
aae0: 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62  * option is enab
aaf0: 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  led at compile-t
ab00: 69 6d 65 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ime */.  memset(
ab10: 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 30 2c  &data[start], 0,
ab20: 20 73 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a   size);.#endif..
ab30: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 73 70 61    /* Add the spa
ab40: 63 65 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  ce back into the
ab50: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
ab60: 66 72 65 65 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20  freeblocks */.  
ab70: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
ab80: 4f 66 66 73 65 74 3b 0a 20 20 61 64 64 72 20 3d  Offset;.  addr =
ab90: 20 68 64 72 20 2b 20 31 3b 0a 20 20 77 68 69 6c   hdr + 1;.  whil
aba0: 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67 65 74  e( (pbegin = get
abb0: 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72  2byte(&data[addr
abc0: 5d 29 29 3c 73 74 61 72 74 20 26 26 20 70 62 65  ]))<start && pbe
abd0: 67 69 6e 3e 30 20 29 7b 0a 20 20 20 20 61 73 73  gin>0 ){.    ass
abe0: 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70 50 61  ert( pbegin<=pPa
abf0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
ac00: 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20 61 73 73  ize-4 );.    ass
ac10: 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72  ert( pbegin>addr
ac20: 20 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 70   );.    addr = p
ac30: 62 65 67 69 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  begin;.  }.  ass
ac40: 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70 50 61  ert( pbegin<=pPa
ac50: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
ac60: 69 7a 65 2d 34 20 29 3b 0a 20 20 61 73 73 65 72  ize-4 );.  asser
ac70: 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20 7c  t( pbegin>addr |
ac80: 7c 20 70 62 65 67 69 6e 3d 3d 30 20 29 3b 0a 20  | pbegin==0 );. 
ac90: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
aca0: 61 64 64 72 5d 2c 20 73 74 61 72 74 29 3b 0a 20  addr], start);. 
acb0: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
acc0: 73 74 61 72 74 5d 2c 20 70 62 65 67 69 6e 29 3b  start], pbegin);
acd0: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
ace0: 61 5b 73 74 61 72 74 2b 32 5d 2c 20 73 69 7a 65  a[start+2], size
acf0: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
ad00: 65 20 2b 3d 20 73 69 7a 65 3b 0a 0a 20 20 2f 2a  e += size;..  /*
ad10: 20 43 6f 61 6c 65 73 63 65 20 61 64 6a 61 63 65   Coalesce adjace
ad20: 6e 74 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a  nt free blocks *
ad30: 2f 0a 20 20 61 64 64 72 20 3d 20 70 50 61 67 65  /.  addr = pPage
ad40: 2d 3e 68 64 72 4f 66 66 73 65 74 20 2b 20 31 3b  ->hdrOffset + 1;
ad50: 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67 69  .  while( (pbegi
ad60: 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  n = get2byte(&da
ad70: 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a  ta[addr]))>0 ){.
ad80: 20 20 20 20 69 6e 74 20 70 6e 65 78 74 2c 20 70      int pnext, p
ad90: 73 69 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74  size;.    assert
ada0: 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20 29 3b  ( pbegin>addr );
adb0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 62 65  .    assert( pbe
adc0: 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d  gin<=pPage->pBt-
add0: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b  >usableSize-4 );
ade0: 0a 20 20 20 20 70 6e 65 78 74 20 3d 20 67 65 74  .    pnext = get
adf0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
ae00: 69 6e 5d 29 3b 0a 20 20 20 20 70 73 69 7a 65 20  in]);.    psize 
ae10: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
ae20: 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20  [pbegin+2]);.   
ae30: 20 69 66 28 20 70 62 65 67 69 6e 20 2b 20 70 73   if( pbegin + ps
ae40: 69 7a 65 20 2b 20 33 20 3e 3d 20 70 6e 65 78 74  ize + 3 >= pnext
ae50: 20 26 26 20 70 6e 65 78 74 3e 30 20 29 7b 0a 20   && pnext>0 ){. 
ae60: 20 20 20 20 20 69 6e 74 20 66 72 61 67 20 3d 20       int frag = 
ae70: 70 6e 65 78 74 20 2d 20 28 70 62 65 67 69 6e 2b  pnext - (pbegin+
ae80: 70 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 61 73  psize);.      as
ae90: 73 65 72 74 28 20 66 72 61 67 3c 3d 64 61 74 61  sert( frag<=data
aea0: 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
aeb0: 74 2b 37 5d 20 29 3b 0a 20 20 20 20 20 20 64 61  t+7] );.      da
aec0: 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
aed0: 73 65 74 2b 37 5d 20 2d 3d 20 66 72 61 67 3b 0a  set+7] -= frag;.
aee0: 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26        put2byte(&
aef0: 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 67 65  data[pbegin], ge
af00: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65  t2byte(&data[pne
af10: 78 74 5d 29 29 3b 0a 20 20 20 20 20 20 70 75 74  xt]));.      put
af20: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
af30: 69 6e 2b 32 5d 2c 20 70 6e 65 78 74 2b 67 65 74  in+2], pnext+get
af40: 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78  2byte(&data[pnex
af50: 74 2b 32 5d 29 2d 70 62 65 67 69 6e 29 3b 0a 20  t+2])-pbegin);. 
af60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
af70: 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20  addr = pbegin;. 
af80: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
af90: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
afa0: 6e 74 20 61 72 65 61 20 62 65 67 69 6e 73 20 77  nt area begins w
afb0: 69 74 68 20 61 20 66 72 65 65 62 6c 6f 63 6b 2c  ith a freeblock,
afc0: 20 72 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20   remove it. */. 
afd0: 20 69 66 28 20 64 61 74 61 5b 68 64 72 2b 31 5d   if( data[hdr+1]
afe0: 3d 3d 64 61 74 61 5b 68 64 72 2b 35 5d 20 26 26  ==data[hdr+5] &&
aff0: 20 64 61 74 61 5b 68 64 72 2b 32 5d 3d 3d 64 61   data[hdr+2]==da
b000: 74 61 5b 68 64 72 2b 36 5d 20 29 7b 0a 20 20 20  ta[hdr+6] ){.   
b010: 20 69 6e 74 20 74 6f 70 3b 0a 20 20 20 20 70 62   int top;.    pb
b020: 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28  egin = get2byte(
b030: 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20  &data[hdr+1]);. 
b040: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
b050: 68 64 72 2b 31 5d 2c 20 26 64 61 74 61 5b 70 62  hdr+1], &data[pb
b060: 65 67 69 6e 5d 2c 20 32 29 3b 0a 20 20 20 20 74  egin], 2);.    t
b070: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
b080: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20  ata[hdr+5]);.   
b090: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
b0a0: 68 64 72 2b 35 5d 2c 20 74 6f 70 20 2b 20 67 65  hdr+5], top + ge
b0b0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65  t2byte(&data[pbe
b0c0: 67 69 6e 2b 32 5d 29 29 3b 0a 20 20 7d 0a 7d 0a  gin+2]));.  }.}.
b0d0: 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68  ./*.** Decode th
b0e0: 65 20 66 6c 61 67 73 20 62 79 74 65 20 28 74 68  e flags byte (th
b0f0: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
b100: 74 68 65 20 68 65 61 64 65 72 29 20 66 6f 72 20  the header) for 
b110: 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e  a page.** and in
b120: 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20  itialize fields 
b130: 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73  of the MemPage s
b140: 74 72 75 63 74 75 72 65 20 61 63 63 6f 72 64 69  tructure accordi
b150: 6e 67 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ngly..*/.static 
b160: 76 6f 69 64 20 64 65 63 6f 64 65 46 6c 61 67 73  void decodeFlags
b170: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
b180: 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a   int flagByte){.
b190: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
b1a0: 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f       /* A copy o
b1b0: 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a  f pPage->pBt */.
b1c0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
b1d0: 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50  ->hdrOffset==(pP
b1e0: 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31  age->pgno==1 ? 1
b1f0: 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 70 50 61  00 : 0) );.  pPa
b200: 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 28 66 6c  ge->intKey = (fl
b210: 61 67 42 79 74 65 20 26 20 28 50 54 46 5f 49 4e  agByte & (PTF_IN
b220: 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54  TKEY|PTF_LEAFDAT
b230: 41 29 29 21 3d 30 3b 0a 20 20 70 50 61 67 65 2d  A))!=0;.  pPage-
b240: 3e 7a 65 72 6f 44 61 74 61 20 3d 20 28 66 6c 61  >zeroData = (fla
b250: 67 42 79 74 65 20 26 20 50 54 46 5f 5a 45 52 4f  gByte & PTF_ZERO
b260: 44 41 54 41 29 21 3d 30 3b 0a 20 20 70 50 61 67  DATA)!=0;.  pPag
b270: 65 2d 3e 6c 65 61 66 20 3d 20 28 66 6c 61 67 42  e->leaf = (flagB
b280: 79 74 65 20 26 20 50 54 46 5f 4c 45 41 46 29 21  yte & PTF_LEAF)!
b290: 3d 30 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68 69  =0;.  pPage->chi
b2a0: 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2a 28 70  ldPtrSize = 4*(p
b2b0: 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 29 3b 0a  Page->leaf==0);.
b2c0: 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
b2d0: 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79  Bt;.  if( flagBy
b2e0: 74 65 20 26 20 50 54 46 5f 4c 45 41 46 44 41 54  te & PTF_LEAFDAT
b2f0: 41 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e  A ){.    pPage->
b300: 6c 65 61 66 44 61 74 61 20 3d 20 31 3b 0a 20 20  leafData = 1;.  
b310: 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61    pPage->maxLoca
b320: 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  l = pBt->maxLeaf
b330: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
b340: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
b350: 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Leaf;.  }else{. 
b360: 20 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61     pPage->leafDa
b370: 74 61 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ta = 0;.    pPag
b380: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42  e->maxLocal = pB
b390: 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20  t->maxLocal;.   
b3a0: 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
b3b0: 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c   = pBt->minLocal
b3c0: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 68  ;.  }.  pPage->h
b3d0: 61 73 44 61 74 61 20 3d 20 21 28 70 50 61 67 65  asData = !(pPage
b3e0: 2d 3e 7a 65 72 6f 44 61 74 61 20 7c 7c 20 28 21  ->zeroData || (!
b3f0: 70 50 61 67 65 2d 3e 6c 65 61 66 20 26 26 20 70  pPage->leaf && p
b400: 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 29 29  Page->leafData))
b410: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
b420: 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69  alize the auxili
b430: 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ary information 
b440: 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b  for a disk block
b450: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 50 61 72  ..**.** The pPar
b460: 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 6d 75  ent parameter mu
b470: 73 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20  st be a pointer 
b480: 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 77  to the MemPage w
b490: 68 69 63 68 0a 2a 2a 20 69 73 20 74 68 65 20 70  hich.** is the p
b4a0: 61 72 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  arent of the pag
b4b0: 65 20 62 65 69 6e 67 20 69 6e 69 74 69 61 6c 69  e being initiali
b4c0: 7a 65 64 2e 20 20 54 68 65 20 72 6f 6f 74 20 6f  zed.  The root o
b4d0: 66 20 61 0a 2a 2a 20 42 54 72 65 65 20 68 61 73  f a.** BTree has
b4e0: 20 6e 6f 20 70 61 72 65 6e 74 20 61 6e 64 20 73   no parent and s
b4f0: 6f 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 2c  o for that page,
b500: 20 70 50 61 72 65 6e 74 3d 3d 4e 55 4c 4c 2e 0a   pParent==NULL..
b510: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
b520: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
b530: 73 2e 20 20 49 66 20 77 65 20 73 65 65 20 74 68  s.  If we see th
b540: 61 74 20 74 68 65 20 70 61 67 65 20 64 6f 65 73  at the page does
b550: 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  .** not contain 
b560: 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  a well-formed da
b570: 74 61 62 61 73 65 20 70 61 67 65 2c 20 74 68 65  tabase page, the
b580: 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  n return .** SQL
b590: 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f  ITE_CORRUPT.  No
b5a0: 74 65 20 74 68 61 74 20 61 20 72 65 74 75 72 6e  te that a return
b5b0: 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f   of SQLITE_OK do
b5c0: 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e  es not.** guaran
b5d0: 74 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67  tee that the pag
b5e0: 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  e is well-formed
b5f0: 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73  .  It only shows
b600: 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c   that.** we fail
b610: 65 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79  ed to detect any
b620: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a   corruption..*/.
b630: 73 74 61 74 69 63 20 69 6e 74 20 69 6e 69 74 50  static int initP
b640: 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  age(.  MemPage *
b650: 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a  pPage,        /*
b660: 20 54 68 65 20 70 61 67 65 20 74 6f 20 62 65 20   The page to be 
b670: 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20  initialized */. 
b680: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
b690: 74 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  t       /* The p
b6a0: 61 72 65 6e 74 2e 20 20 4d 69 67 68 74 20 62 65  arent.  Might be
b6b0: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e   NULL */.){.  in
b6c0: 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20  t pc;           
b6d0: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61   /* Address of a
b6e0: 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69   freeblock withi
b6f0: 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  n pPage->aData[]
b700: 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
b710: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
b720: 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20  et to beginning 
b730: 6f 66 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  of page header *
b740: 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
b750: 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20         /* Equal 
b760: 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  to pPage->aData 
b770: 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
b780: 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  Bt;        /* Th
b790: 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74 72  e main btree str
b7a0: 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20  ucture */.  int 
b7b0: 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f  usableSize;    /
b7c0: 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62  * Amount of usab
b7d0: 6c 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68  le space on each
b7e0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63   page */.  int c
b7f0: 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a  ellOffset;    /*
b800: 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61   Offset from sta
b810: 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69  rt of page to fi
b820: 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  rst cell pointer
b830: 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b   */.  int nFree;
b840: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
b850: 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74  er of unused byt
b860: 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a  es on the page *
b870: 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20  /.  int top;    
b880: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
b890: 62 79 74 65 20 6f 66 20 74 68 65 20 63 65 6c 6c  byte of the cell
b8a0: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f   content area */
b8b0: 0a 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d  ..  pBt = pPage-
b8c0: 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
b8d0: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
b8e0: 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 30 20 7c  rt( pParent==0 |
b8f0: 7c 20 70 50 61 72 65 6e 74 2d 3e 70 42 74 3d 3d  | pParent->pBt==
b900: 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  pBt );.  assert(
b910: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71   pPage->pgno==sq
b920: 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 6e  lite3pager_pagen
b930: 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 61 44 61  umber(pPage->aDa
b940: 74 61 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ta) );.  assert(
b950: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d   pPage->aData ==
b960: 20 26 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61   &((unsigned cha
b970: 72 2a 29 70 50 61 67 65 29 5b 2d 70 42 74 2d 3e  r*)pPage)[-pBt->
b980: 70 61 67 65 53 69 7a 65 5d 20 29 3b 0a 20 20 69  pageSize] );.  i
b990: 66 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e  f( pPage->pParen
b9a0: 74 21 3d 70 50 61 72 65 6e 74 20 26 26 20 28 70  t!=pParent && (p
b9b0: 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 21 3d 30  Page->pParent!=0
b9c0: 20 7c 7c 20 70 50 61 67 65 2d 3e 69 73 49 6e 69   || pPage->isIni
b9d0: 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  t) ){.    /* The
b9e0: 20 70 61 72 65 6e 74 20 70 61 67 65 20 73 68 6f   parent page sho
b9f0: 75 6c 64 20 6e 65 76 65 72 20 63 68 61 6e 67 65  uld never change
ba00: 20 75 6e 6c 65 73 73 20 74 68 65 20 66 69 6c 65   unless the file
ba10: 20 69 73 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20   is corrupt */. 
ba20: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ba30: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
ba40: 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e   }.  if( pPage->
ba50: 69 73 49 6e 69 74 20 29 20 72 65 74 75 72 6e 20  isInit ) return 
ba60: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
ba70: 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d   pPage->pParent=
ba80: 3d 30 20 26 26 20 70 50 61 72 65 6e 74 21 3d 30  =0 && pParent!=0
ba90: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70   ){.    pPage->p
baa0: 50 61 72 65 6e 74 20 3d 20 70 50 61 72 65 6e 74  Parent = pParent
bab0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67  ;.    sqlite3pag
bac0: 65 72 5f 72 65 66 28 70 50 61 72 65 6e 74 2d 3e  er_ref(pParent->
bad0: 61 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20 68 64  aData);.  }.  hd
bae0: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
baf0: 66 73 65 74 3b 0a 20 20 64 61 74 61 20 3d 20 70  fset;.  data = p
bb00: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 64  Page->aData;.  d
bb10: 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65  ecodeFlags(pPage
bb20: 2c 20 64 61 74 61 5b 68 64 72 5d 29 3b 0a 20 20  , data[hdr]);.  
bb30: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
bb40: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69   = 0;.  pPage->i
bb50: 64 78 53 68 69 66 74 20 3d 20 30 3b 0a 20 20 75  dxShift = 0;.  u
bb60: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
bb70: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 70  >usableSize;.  p
bb80: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
bb90: 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20   = cellOffset = 
bba0: 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61  hdr + 12 - 4*pPa
bbb0: 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 74 6f 70 20  ge->leaf;.  top 
bbc0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
bbd0: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 70 50 61 67  [hdr+5]);.  pPag
bbe0: 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62  e->nCell = get2b
bbf0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
bc00: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
bc10: 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42  nCell>MX_CELL(pB
bc20: 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 6f 20  t) ){.    /* To 
bc30: 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61  many cells for a
bc40: 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54   single page.  T
bc50: 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20  he page must be 
bc60: 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 72  corrupt */.    r
bc70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
bc80: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
bc90: 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c   if( pPage->nCel
bca0: 6c 3d 3d 30 20 26 26 20 70 50 61 72 65 6e 74 21  l==0 && pParent!
bcb0: 3d 30 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 70  =0 && pParent->p
bcc0: 67 6e 6f 21 3d 31 20 29 7b 0a 20 20 20 20 2f 2a  gno!=1 ){.    /*
bcd0: 20 41 6c 6c 20 70 61 67 65 73 20 6d 75 73 74 20   All pages must 
bce0: 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  have at least on
bcf0: 65 20 63 65 6c 6c 2c 20 65 78 63 65 70 74 20 66  e cell, except f
bd00: 6f 72 20 72 6f 6f 74 20 70 61 67 65 73 20 2a 2f  or root pages */
bd10: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
bd20: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
bd30: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  .  }..  /* Compu
bd40: 74 65 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65  te the total fre
bd50: 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70  e space on the p
bd60: 61 67 65 20 2a 2f 0a 20 20 70 63 20 3d 20 67 65  age */.  pc = ge
bd70: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
bd80: 2b 31 5d 29 3b 0a 20 20 6e 46 72 65 65 20 3d 20  +1]);.  nFree = 
bd90: 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f  data[hdr+7] + to
bda0: 70 20 2d 20 28 63 65 6c 6c 4f 66 66 73 65 74 20  p - (cellOffset 
bdb0: 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  + 2*pPage->nCell
bdc0: 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 63 3e 30  );.  while( pc>0
bdd0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 65 78 74   ){.    int next
bde0: 2c 20 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20  , size;.    if( 
bdf0: 70 63 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  pc>usableSize-4 
be00: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65  ){.      /* Free
be10: 20 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74 68   block is off th
be20: 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  e page */.      
be30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
be40: 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20  RRUPT_BKPT; .   
be50: 20 7d 0a 20 20 20 20 6e 65 78 74 20 3d 20 67 65   }.    next = ge
be60: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d  t2byte(&data[pc]
be70: 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 67 65  );.    size = ge
be80: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b  t2byte(&data[pc+
be90: 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78  2]);.    if( nex
bea0: 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b  t>0 && next<=pc+
beb0: 73 69 7a 65 2b 33 20 29 7b 0a 20 20 20 20 20 20  size+3 ){.      
bec0: 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d  /* Free blocks m
bed0: 75 73 74 20 62 65 20 69 6e 20 61 63 63 65 6e 64  ust be in accend
bee0: 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20  ing order */.   
bef0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
bf00: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
bf10: 20 20 20 20 7d 0a 20 20 20 20 6e 46 72 65 65 20      }.    nFree 
bf20: 2b 3d 20 73 69 7a 65 3b 0a 20 20 20 20 70 63 20  += size;.    pc 
bf30: 3d 20 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 70 50  = next;.  }.  pP
bf40: 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 6e 46 72  age->nFree = nFr
bf50: 65 65 3b 0a 20 20 69 66 28 20 6e 46 72 65 65 3e  ee;.  if( nFree>
bf60: 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  =usableSize ){. 
bf70: 20 20 20 2f 2a 20 46 72 65 65 20 73 70 61 63 65     /* Free space
bf80: 20 63 61 6e 6e 6f 74 20 65 78 63 65 65 64 20 74   cannot exceed t
bf90: 6f 74 61 6c 20 70 61 67 65 20 73 69 7a 65 20 2a  otal page size *
bfa0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
bfb0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
bfc0: 3b 20 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 2d  ; .  }..  pPage-
bfd0: 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 72  >isInit = 1;.  r
bfe0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
bff0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70  .}../*.** Set up
c000: 20 61 20 72 61 77 20 70 61 67 65 20 73 6f 20 74   a raw page so t
c010: 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b  hat it looks lik
c020: 65 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  e a database pag
c030: 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20  e holding.** no 
c040: 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74  entries..*/.stat
c050: 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65  ic void zeroPage
c060: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
c070: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75   int flags){.  u
c080: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
c090: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
c0a0: 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  a;.  BtShared *p
c0b0: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
c0c0: 0a 20 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61  .  int hdr = pPa
c0d0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
c0e0: 20 69 6e 74 20 66 69 72 73 74 3b 0a 0a 20 20 61   int first;..  a
c0f0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 70 61  ssert( sqlite3pa
c100: 67 65 72 5f 70 61 67 65 6e 75 6d 62 65 72 28 64  ger_pagenumber(d
c110: 61 74 61 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e  ata)==pPage->pgn
c120: 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 26  o );.  assert( &
c130: 64 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69  data[pBt->pageSi
c140: 7a 65 5d 20 3d 3d 20 28 75 6e 73 69 67 6e 65 64  ze] == (unsigned
c150: 20 63 68 61 72 2a 29 70 50 61 67 65 20 29 3b 0a   char*)pPage );.
c160: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
c170: 33 70 61 67 65 72 5f 69 73 77 72 69 74 65 61 62  3pager_iswriteab
c180: 6c 65 28 64 61 74 61 29 20 29 3b 0a 20 20 6d 65  le(data) );.  me
c190: 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c  mset(&data[hdr],
c1a0: 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53   0, pBt->usableS
c1b0: 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 64 61  ize - hdr);.  da
c1c0: 74 61 5b 68 64 72 5d 20 3d 20 66 6c 61 67 73 3b  ta[hdr] = flags;
c1d0: 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b  .  first = hdr +
c1e0: 20 38 20 2b 20 34 2a 28 28 66 6c 61 67 73 26 50   8 + 4*((flags&P
c1f0: 54 46 5f 4c 45 41 46 29 3d 3d 30 29 3b 0a 20 20  TF_LEAF)==0);.  
c200: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72  memset(&data[hdr
c210: 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61  +1], 0, 4);.  da
c220: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20  ta[hdr+7] = 0;. 
c230: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
c240: 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61  hdr+5], pBt->usa
c250: 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67  bleSize);.  pPag
c260: 65 2d 3e 6e 46 72 65 65 20 3d 20 70 42 74 2d 3e  e->nFree = pBt->
c270: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69 72  usableSize - fir
c280: 73 74 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67  st;.  decodeFlag
c290: 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b  s(pPage, flags);
c2a0: 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  .  pPage->hdrOff
c2b0: 73 65 74 20 3d 20 68 64 72 3b 0a 20 20 70 50 61  set = hdr;.  pPa
c2c0: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
c2d0: 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65 2d   first;.  pPage-
c2e0: 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
c2f0: 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66    pPage->idxShif
c300: 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e  t = 0;.  pPage->
c310: 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61  nCell = 0;.  pPa
c320: 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a  ge->isInit = 1;.
c330: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70  }../*.** Get a p
c340: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  age from the pag
c350: 65 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20  er.  Initialize 
c360: 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20  the MemPage.pBt 
c370: 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61  and.** MemPage.a
c380: 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66  Data elements if
c390: 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74   needed..*/.stat
c3a0: 69 63 20 69 6e 74 20 67 65 74 50 61 67 65 28 42  ic int getPage(B
c3b0: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
c3c0: 6e 6f 20 70 67 6e 6f 2c 20 4d 65 6d 50 61 67 65  no pgno, MemPage
c3d0: 20 2a 2a 70 70 50 61 67 65 29 7b 0a 20 20 69 6e   **ppPage){.  in
c3e0: 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64  t rc;.  unsigned
c3f0: 20 63 68 61 72 20 2a 61 44 61 74 61 3b 0a 20 20   char *aData;.  
c400: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
c410: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
c420: 67 65 72 5f 67 65 74 28 70 42 74 2d 3e 70 50 61  ger_get(pBt->pPa
c430: 67 65 72 2c 20 70 67 6e 6f 2c 20 28 76 6f 69 64  ger, pgno, (void
c440: 2a 2a 29 26 61 44 61 74 61 29 3b 0a 20 20 69 66  **)&aData);.  if
c450: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
c460: 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d  ;.  pPage = (Mem
c470: 50 61 67 65 2a 29 26 61 44 61 74 61 5b 70 42 74  Page*)&aData[pBt
c480: 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20 70  ->pageSize];.  p
c490: 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 61 44  Page->aData = aD
c4a0: 61 74 61 3b 0a 20 20 70 50 61 67 65 2d 3e 70 42  ata;.  pPage->pB
c4b0: 74 20 3d 20 70 42 74 3b 0a 20 20 70 50 61 67 65  t = pBt;.  pPage
c4c0: 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20  ->pgno = pgno;. 
c4d0: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
c4e0: 74 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d  t = pPage->pgno=
c4f0: 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20  =1 ? 100 : 0;.  
c500: 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b  *ppPage = pPage;
c510: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
c520: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  _OK;.}../*.** Ge
c530: 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  t a page from th
c540: 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74  e pager and init
c550: 69 61 6c 69 7a 65 20 69 74 2e 20 20 54 68 69 73  ialize it.  This
c560: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 6a   routine.** is j
c570: 75 73 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63  ust a convenienc
c580: 65 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64  e wrapper around
c590: 20 73 65 70 61 72 61 74 65 20 63 61 6c 6c 73 20   separate calls 
c5a0: 74 6f 0a 2a 2a 20 67 65 74 50 61 67 65 28 29 20  to.** getPage() 
c5b0: 61 6e 64 20 69 6e 69 74 50 61 67 65 28 29 2e 0a  and initPage()..
c5c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
c5d0: 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20  tAndInitPage(.  
c5e0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
c5f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
c600: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
c610: 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
c620: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
c630: 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20   of the page to 
c640: 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  get */.  MemPage
c650: 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
c660: 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20   Write the page 
c670: 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a  pointer here */.
c680: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65    MemPage *pPare
c690: 6e 74 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74  nt     /* Parent
c6a0: 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   of the page */.
c6b0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
c6c0: 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20  f( pgno==0 ){.  
c6d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c6e0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
c6f0: 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 50 61 67   }.  rc = getPag
c700: 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50  e(pBt, pgno, ppP
c710: 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  age);.  if( rc==
c720: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 2a 70  SQLITE_OK && (*p
c730: 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d  pPage)->isInit==
c740: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 69 6e  0 ){.    rc = in
c750: 69 74 50 61 67 65 28 2a 70 70 50 61 67 65 2c 20  itPage(*ppPage, 
c760: 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20  pParent);.  }.  
c770: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
c780: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65  .** Release a Me
c790: 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f  mPage.  This sho
c7a0: 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  uld be called on
c7b0: 63 65 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f  ce for each prio
c7c0: 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 67 65 74  r.** call to get
c7d0: 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Page..*/.static 
c7e0: 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65  void releasePage
c7f0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
c800: 7b 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b  {.  if( pPage ){
c810: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
c820: 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20  ge->aData );.   
c830: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
c840: 70 42 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72  pBt );.    asser
c850: 74 28 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61  t( &pPage->aData
c860: 5b 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67  [pPage->pBt->pag
c870: 65 53 69 7a 65 5d 3d 3d 28 75 6e 73 69 67 6e 65  eSize]==(unsigne
c880: 64 20 63 68 61 72 2a 29 70 50 61 67 65 20 29 3b  d char*)pPage );
c890: 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65  .    sqlite3page
c8a0: 72 5f 75 6e 72 65 66 28 70 50 61 67 65 2d 3e 61  r_unref(pPage->a
c8b0: 44 61 74 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Data);.  }.}../*
c8c0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
c8d0: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
c8e0: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
c8f0: 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65 0a 2a  unt for a page.*
c900: 2a 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20  * reaches zero. 
c910: 20 57 65 20 6e 65 65 64 20 74 6f 20 75 6e 72 65   We need to unre
c920: 66 20 74 68 65 20 70 50 61 72 65 6e 74 20 70 6f  f the pParent po
c930: 69 6e 74 65 72 20 77 68 65 6e 20 74 68 61 74 0a  inter when that.
c940: 2a 2a 20 68 61 70 70 65 6e 73 2e 0a 2a 2f 0a 73  ** happens..*/.s
c950: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 44  tatic void pageD
c960: 65 73 74 72 75 63 74 6f 72 28 76 6f 69 64 20 2a  estructor(void *
c970: 70 44 61 74 61 2c 20 69 6e 74 20 70 61 67 65 53  pData, int pageS
c980: 69 7a 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  ize){.  MemPage 
c990: 2a 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74  *pPage;.  assert
c9a0: 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29  ( (pageSize & 7)
c9b0: 3d 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 20 3d  ==0 );.  pPage =
c9c0: 20 28 4d 65 6d 50 61 67 65 2a 29 26 28 28 63 68   (MemPage*)&((ch
c9d0: 61 72 2a 29 70 44 61 74 61 29 5b 70 61 67 65 53  ar*)pData)[pageS
c9e0: 69 7a 65 5d 3b 0a 20 20 69 66 28 20 70 50 61 67  ize];.  if( pPag
c9f0: 65 2d 3e 70 50 61 72 65 6e 74 20 29 7b 0a 20 20  e->pParent ){.  
ca00: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65    MemPage *pPare
ca10: 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72  nt = pPage->pPar
ca20: 65 6e 74 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ent;.    pPage->
ca30: 70 50 61 72 65 6e 74 20 3d 20 30 3b 0a 20 20 20  pParent = 0;.   
ca40: 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
ca50: 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 70 50 61  rent);.  }.  pPa
ca60: 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
ca70: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20  }../*.** During 
ca80: 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e  a rollback, when
ca90: 20 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61   the pager reloa
caa0: 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ds information i
cab0: 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a  nto the cache.**
cac0: 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63   so that the cac
cad0: 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74  he is restored t
cae0: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
caf0: 74 61 74 65 20 61 74 20 74 68 65 20 73 74 61 72  tate at the star
cb00: 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e  t of.** the tran
cb10: 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63  saction, for eac
cb20: 68 20 70 61 67 65 20 72 65 73 74 6f 72 65 64 20  h page restored 
cb30: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
cb40: 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  called..**.** Th
cb50: 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73  is routine needs
cb60: 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 65 78   to reset the ex
cb70: 74 72 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e  tra data section
cb80: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
cb90: 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67  he.** page to ag
cba0: 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73  ree with the res
cbb0: 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73  tored data..*/.s
cbc0: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 52  tatic void pageR
cbd0: 65 69 6e 69 74 28 76 6f 69 64 20 2a 70 44 61 74  einit(void *pDat
cbe0: 61 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 29  a, int pageSize)
cbf0: 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
cc00: 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70  ge;.  assert( (p
cc10: 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
cc20: 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65  );.  pPage = (Me
cc30: 6d 50 61 67 65 2a 29 26 28 28 63 68 61 72 2a 29  mPage*)&((char*)
cc40: 70 44 61 74 61 29 5b 70 61 67 65 53 69 7a 65 5d  pData)[pageSize]
cc50: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
cc60: 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 70 50 61  sInit ){.    pPa
cc70: 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
cc80: 20 20 20 20 69 6e 69 74 50 61 67 65 28 70 50 61      initPage(pPa
cc90: 67 65 2c 20 70 50 61 67 65 2d 3e 70 50 61 72 65  ge, pPage->pPare
cca0: 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  nt);.  }.}../*.*
ccb0: 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73  * Open a databas
ccc0: 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a  e file..** .** z
ccd0: 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20  Filename is the 
cce0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
ccf0: 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a  base file.  If z
cd00: 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c  Filename is NULL
cd10: 0a 2a 2a 20 61 20 6e 65 77 20 64 61 74 61 62 61  .** a new databa
cd20: 73 65 20 77 69 74 68 20 61 20 72 61 6e 64 6f 6d  se with a random
cd30: 20 6e 61 6d 65 20 69 73 20 63 72 65 61 74 65 64   name is created
cd40: 2e 20 20 54 68 69 73 20 72 61 6e 64 6f 6d 6c 79  .  This randomly
cd50: 20 6e 61 6d 65 64 0a 2a 2a 20 64 61 74 61 62 61   named.** databa
cd60: 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  se file will be 
cd70: 64 65 6c 65 74 65 64 20 77 68 65 6e 20 73 71 6c  deleted when sql
cd80: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 29  ite3BtreeClose()
cd90: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 69   is called..*/.i
cda0: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f  nt sqlite3BtreeO
cdb0: 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  pen(.  const cha
cdc0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f  r *zFilename,  /
cdd0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
cde0: 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
cdf0: 65 20 42 54 72 65 65 20 64 61 74 61 62 61 73 65  e BTree database
ce00: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 70   */.  sqlite3 *p
ce10: 53 71 6c 69 74 65 2c 20 20 20 20 20 20 20 2f 2a  Sqlite,       /*
ce20: 20 41 73 73 6f 63 69 61 74 65 64 20 64 61 74 61   Associated data
ce30: 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
ce40: 20 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65   Btree **ppBtree
ce50: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ,        /* Poin
ce60: 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65  ter to new Btree
ce70: 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20   object written 
ce80: 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  here */.  int fl
ce90: 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20  ags             
cea0: 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a    /* Options */.
ceb0: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
cec0: 42 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Bt;          /* 
ced0: 53 68 61 72 65 64 20 70 61 72 74 20 6f 66 20 62  Shared part of b
cee0: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a  tree structure *
cef0: 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20  /.  Btree *p;   
cf00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
cf10: 61 6e 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20  andle to return 
cf20: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  */.  int rc;.  i
cf30: 6e 74 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 75  nt nReserve;.  u
cf40: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44 62  nsigned char zDb
cf50: 48 65 61 64 65 72 5b 31 30 30 5d 3b 0a 23 69 66  Header[100];.#if
cf60: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
cf70: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
cf80: 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
cf90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
cfa0: 49 4f 29 0a 20 20 63 6f 6e 73 74 20 54 68 72 65  IO).  const Thre
cfb0: 61 64 44 61 74 61 20 2a 70 54 73 64 72 6f 3b 0a  adData *pTsdro;.
cfc0: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74  #endif..  /* Set
cfd0: 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 69 73   the variable is
cfe0: 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f  Memdb to true fo
cff0: 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  r an in-memory d
d000: 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a  atabase, or .  *
d010: 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69  * false for a fi
d020: 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62 61 73  le-based databas
d030: 65 2e 20 54 68 69 73 20 73 79 6d 62 6f 6c 20 69  e. This symbol i
d040: 73 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 64 20  s only required 
d050: 69 66 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 6f  if.  ** either o
d060: 66 20 74 68 65 20 73 68 61 72 65 64 2d 64 61 74  f the shared-dat
d070: 61 20 6f 72 20 61 75 74 6f 76 61 63 75 75 6d 20  a or autovacuum 
d080: 66 65 61 74 75 72 65 73 20 61 72 65 20 63 6f 6d  features are com
d090: 70 69 6c 65 64 20 0a 20 20 2a 2a 20 69 6e 74 6f  piled .  ** into
d0a0: 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 20 20   the library..  
d0b0: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
d0c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
d0d0: 45 44 5f 43 41 43 48 45 29 20 7c 7c 20 21 64 65  ED_CACHE) || !de
d0e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
d0f0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 29 0a 20 20  T_AUTOVACUUM).  
d100: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
d110: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20  IT_MEMORYDB.    
d120: 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64  const int isMemd
d130: 62 20 3d 20 30 3b 0a 20 20 23 65 6c 73 65 0a 20  b = 0;.  #else. 
d140: 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d     const int isM
d150: 65 6d 64 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65  emdb = zFilename
d160: 20 26 26 20 21 73 74 72 63 6d 70 28 7a 46 69 6c   && !strcmp(zFil
d170: 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a  ename, ":memory:
d180: 22 29 3b 0a 20 20 23 65 6e 64 69 66 0a 23 65 6e  ");.  #endif.#en
d190: 64 69 66 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74  dif..  p = sqlit
d1a0: 65 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 42  eMalloc(sizeof(B
d1b0: 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21 70  tree));.  if( !p
d1c0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
d1d0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
d1e0: 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20  .  p->inTrans = 
d1f0: 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d  TRANS_NONE;.  p-
d200: 3e 70 53 71 6c 69 74 65 20 3d 20 70 53 71 6c 69  >pSqlite = pSqli
d210: 74 65 3b 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f  te;..  /* Try to
d220: 20 66 69 6e 64 20 61 6e 20 65 78 69 73 74 69 6e   find an existin
d230: 67 20 42 74 72 65 65 20 73 74 72 75 63 74 75 72  g Btree structur
d240: 65 20 6f 70 65 6e 65 64 20 6f 6e 20 7a 46 69 6c  e opened on zFil
d250: 65 6e 61 6d 65 2e 20 2a 2f 0a 23 69 66 20 21 64  ename. */.#if !d
d260: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
d270: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
d280: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
d290: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
d2a0: 0a 20 20 70 54 73 64 72 6f 20 3d 20 73 71 6c 69  .  pTsdro = sqli
d2b0: 74 65 33 54 68 72 65 61 64 44 61 74 61 52 65 61  te3ThreadDataRea
d2c0: 64 4f 6e 6c 79 28 29 3b 0a 20 20 69 66 28 20 70  dOnly();.  if( p
d2d0: 54 73 64 72 6f 2d 3e 75 73 65 53 68 61 72 65 64  Tsdro->useShared
d2e0: 44 61 74 61 20 26 26 20 7a 46 69 6c 65 6e 61 6d  Data && zFilenam
d2f0: 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b  e && !isMemdb ){
d300: 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c  .    char *zFull
d310: 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
d320: 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
d330: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  (zFilename);.   
d340: 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e   if( !zFullPathn
d350: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ame ){.      sql
d360: 69 74 65 46 72 65 65 28 70 29 3b 0a 20 20 20 20  iteFree(p);.    
d370: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d380: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
d390: 20 66 6f 72 28 70 42 74 3d 70 54 73 64 72 6f 2d   for(pBt=pTsdro-
d3a0: 3e 70 42 74 72 65 65 3b 20 70 42 74 3b 20 70 42  >pBtree; pBt; pB
d3b0: 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20  t=pBt->pNext){. 
d3c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
d3d0: 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20  ->nRef>0 );.    
d3e0: 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28    if( 0==strcmp(
d3f0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73  zFullPathname, s
d400: 71 6c 69 74 65 33 70 61 67 65 72 5f 66 69 6c 65  qlite3pager_file
d410: 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65 72  name(pBt->pPager
d420: 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  )) ){.        p-
d430: 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20  >pBt = pBt;.    
d440: 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70      *ppBtree = p
d450: 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e  ;.        pBt->n
d460: 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73  Ref++;.        s
d470: 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50  qliteFree(zFullP
d480: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
d490: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d4a0: 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
d4b0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  }.    sqliteFree
d4c0: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
d4d0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
d4e0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  *.  ** The follo
d4f0: 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b  wing asserts mak
d500: 65 20 73 75 72 65 20 74 68 61 74 20 73 74 72 75  e sure that stru
d510: 63 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74  ctures used by t
d520: 68 65 20 62 74 72 65 65 20 61 72 65 0a 20 20 2a  he btree are.  *
d530: 2a 20 74 68 65 20 72 69 67 68 74 20 73 69 7a 65  * the right size
d540: 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20 67 75  .  This is to gu
d550: 61 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a 65  ard against size
d560: 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 72 65   changes that re
d570: 73 75 6c 74 0a 20 20 2a 2a 20 77 68 65 6e 20 63  sult.  ** when c
d580: 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69  ompiling on a di
d590: 66 66 65 72 65 6e 74 20 61 72 63 68 69 74 65 63  fferent architec
d5a0: 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  ture..  */.  ass
d5b0: 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36 34 29  ert( sizeof(i64)
d5c0: 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 69 36  ==8 || sizeof(i6
d5d0: 34 29 3d 3d 34 20 29 3b 0a 20 20 61 73 73 65 72  4)==4 );.  asser
d5e0: 74 28 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d  t( sizeof(u64)==
d5f0: 38 20 7c 7c 20 73 69 7a 65 6f 66 28 75 36 34 29  8 || sizeof(u64)
d600: 3d 3d 34 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==4 );.  assert(
d610: 20 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20   sizeof(u32)==4 
d620: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a  );.  assert( siz
d630: 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20  eof(u16)==2 );. 
d640: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
d650: 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 0a 20 20 70  Pgno)==4 );..  p
d660: 42 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  Bt = sqliteMallo
d670: 63 28 20 73 69 7a 65 6f 66 28 2a 70 42 74 29 20  c( sizeof(*pBt) 
d680: 29 3b 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20  );.  if( pBt==0 
d690: 29 7b 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20  ){.    *ppBtree 
d6a0: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  = 0;.    sqliteF
d6b0: 72 65 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75  ree(p);.    retu
d6c0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
d6d0: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
d6e0: 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 28 26 70  te3pager_open(&p
d6f0: 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c  Bt->pPager, zFil
d700: 65 6e 61 6d 65 2c 20 45 58 54 52 41 5f 53 49 5a  ename, EXTRA_SIZ
d710: 45 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28  E, flags);.  if(
d720: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
d730: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
d740: 65 33 70 61 67 65 72 5f 72 65 61 64 5f 66 69 6c  e3pager_read_fil
d750: 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61  eheader(pBt->pPa
d760: 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65  ger,sizeof(zDbHe
d770: 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29  ader),zDbHeader)
d780: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
d790: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d7a0: 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65 72   if( pBt->pPager
d7b0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
d7c0: 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 70 42 74  3pager_close(pBt
d7d0: 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  ->pPager);.    }
d7e0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
d7f0: 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
d800: 46 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70  Free(p);.    *pp
d810: 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 72  Btree = 0;.    r
d820: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
d830: 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 0a 20  p->pBt = pBt;.. 
d840: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65   sqlite3pager_se
d850: 74 5f 64 65 73 74 72 75 63 74 6f 72 28 70 42 74  t_destructor(pBt
d860: 2d 3e 70 50 61 67 65 72 2c 20 70 61 67 65 44 65  ->pPager, pageDe
d870: 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 73 71 6c  structor);.  sql
d880: 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 72 65  ite3pager_set_re
d890: 69 6e 69 74 65 72 28 70 42 74 2d 3e 70 50 61 67  initer(pBt->pPag
d8a0: 65 72 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b  er, pageReinit);
d8b0: 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  .  pBt->pCursor 
d8c0: 3d 20 30 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67  = 0;.  pBt->pPag
d8d0: 65 31 20 3d 20 30 3b 0a 20 20 70 42 74 2d 3e 72  e1 = 0;.  pBt->r
d8e0: 65 61 64 4f 6e 6c 79 20 3d 20 73 71 6c 69 74 65  eadOnly = sqlite
d8f0: 33 70 61 67 65 72 5f 69 73 72 65 61 64 6f 6e 6c  3pager_isreadonl
d900: 79 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  y(pBt->pPager);.
d910: 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
d920: 3d 20 67 65 74 32 62 79 74 65 28 26 7a 44 62 48  = get2byte(&zDbH
d930: 65 61 64 65 72 5b 31 36 5d 29 3b 0a 20 20 69 66  eader[16]);.  if
d940: 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  ( pBt->pageSize<
d950: 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65  512 || pBt->page
d960: 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
d970: 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20  PAGE_SIZE.      
d980: 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65 53   || ((pBt->pageS
d990: 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67 65  ize-1)&pBt->page
d9a0: 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Size)!=0 ){.    
d9b0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
d9c0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
d9d0: 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 70 42  AGE_SIZE;.    pB
d9e0: 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72 61 63 20  t->maxEmbedFrac 
d9f0: 3d 20 36 34 3b 20 20 20 2f 2a 20 32 35 25 20 2a  = 64;   /* 25% *
da00: 2f 0a 20 20 20 20 70 42 74 2d 3e 6d 69 6e 45 6d  /.    pBt->minEm
da10: 62 65 64 46 72 61 63 20 3d 20 33 32 3b 20 20 20  bedFrac = 32;   
da20: 2f 2a 20 31 32 2e 35 25 20 2a 2f 0a 20 20 20 20  /* 12.5% */.    
da30: 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63  pBt->minLeafFrac
da40: 20 3d 20 33 32 3b 20 20 20 20 2f 2a 20 31 32 2e   = 32;    /* 12.
da50: 35 25 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  5% */.#ifndef SQ
da60: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
da70: 43 55 55 4d 0a 20 20 20 20 2f 2a 20 49 66 20 74  CUUM.    /* If t
da80: 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a  he magic name ":
da90: 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72  memory:" will cr
daa0: 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  eate an in-memor
dab0: 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  y database, then
dac0: 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 73  .    ** do not s
dad0: 65 74 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  et the auto-vacu
dae0: 75 6d 20 66 6c 61 67 2c 20 65 76 65 6e 20 69 66  um flag, even if
daf0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
db00: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 2a  AUTOVACUUM.    *
db10: 2a 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68  * is true. On th
db20: 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66  e other hand, if
db30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
db40: 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e 20 64  ORYDB has been d
db50: 65 66 69 6e 65 64 2c 0a 20 20 20 20 2a 2a 20 74  efined,.    ** t
db60: 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69  hen ":memory:" i
db70: 73 20 6a 75 73 74 20 61 20 72 65 67 75 6c 61 72  s just a regular
db80: 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 52 65 73 70   file-name. Resp
db90: 65 63 74 20 74 68 65 20 61 75 74 6f 2d 76 61 63  ect the auto-vac
dba0: 75 75 6d 0a 20 20 20 20 2a 2a 20 64 65 66 61 75  uum.    ** defau
dbb0: 6c 74 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  lt in this case.
dbc0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
dbd0: 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73  zFilename && !is
dbe0: 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 70  Memdb ){.      p
dbf0: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
dc00: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
dc10: 41 55 54 4f 56 41 43 55 55 4d 3b 0a 20 20 20 20  AUTOVACUUM;.    
dc20: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 6e 52 65  }.#endif.    nRe
dc30: 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  serve = 0;.  }el
dc40: 73 65 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65  se{.    nReserve
dc50: 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d   = zDbHeader[20]
dc60: 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 45 6d  ;.    pBt->maxEm
dc70: 62 65 64 46 72 61 63 20 3d 20 7a 44 62 48 65 61  bedFrac = zDbHea
dc80: 64 65 72 5b 32 31 5d 3b 0a 20 20 20 20 70 42 74  der[21];.    pBt
dc90: 2d 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63 20 3d  ->minEmbedFrac =
dca0: 20 7a 44 62 48 65 61 64 65 72 5b 32 32 5d 3b 0a   zDbHeader[22];.
dcb0: 20 20 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66      pBt->minLeaf
dcc0: 46 72 61 63 20 3d 20 7a 44 62 48 65 61 64 65 72  Frac = zDbHeader
dcd0: 5b 32 33 5d 3b 0a 20 20 20 20 70 42 74 2d 3e 70  [23];.    pBt->p
dce0: 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31  ageSizeFixed = 1
dcf0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
dd00: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
dd10: 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61  .    pBt->autoVa
dd20: 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
dd30: 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b  (&zDbHeader[36 +
dd40: 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e   4*4])?1:0);.#en
dd50: 64 69 66 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 75  dif.  }.  pBt->u
dd60: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
dd70: 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73  >pageSize - nRes
dd80: 65 72 76 65 3b 0a 20 20 61 73 73 65 72 74 28 20  erve;.  assert( 
dd90: 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26  (pBt->pageSize &
dda0: 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d   7)==0 );  /* 8-
ddb0: 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f  byte alignment o
ddc0: 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20  f pageSize */.  
ddd0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74  sqlite3pager_set
dde0: 5f 70 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70  _pagesize(pBt->p
ddf0: 50 61 67 65 72 2c 20 70 42 74 2d 3e 70 61 67 65  Pager, pBt->page
de00: 53 69 7a 65 29 3b 0a 0a 23 69 66 20 21 64 65 66  Size);..#if !def
de10: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
de20: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
de30: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
de40: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
de50: 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20   /* Add the new 
de60: 62 74 72 65 65 20 74 6f 20 74 68 65 20 6c 69 6e  btree to the lin
de70: 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e  ked list startin
de80: 67 20 61 74 20 54 68 72 65 61 64 44 61 74 61 2e  g at ThreadData.
de90: 70 42 74 72 65 65 2e 0a 20 20 2a 2a 20 54 68 65  pBtree..  ** The
dea0: 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20  re is no chance 
deb0: 74 68 61 74 20 61 20 6d 61 6c 6c 6f 63 28 29 20  that a malloc() 
dec0: 6d 61 79 20 66 61 69 6c 20 69 6e 73 69 64 65 20  may fail inside 
ded0: 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 73 71 6c  of the .  ** sql
dee0: 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29  ite3ThreadData()
def0: 20 63 61 6c 6c 2c 20 61 73 20 74 68 65 20 54 68   call, as the Th
df00: 72 65 61 64 44 61 74 61 20 73 74 72 75 63 74 75  readData structu
df10: 72 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72  re must have alr
df20: 65 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20 61  eady.  ** been a
df30: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 70 54 73  llocated for pTs
df40: 64 72 6f 2d 3e 75 73 65 53 68 61 72 65 64 44 61  dro->useSharedDa
df50: 74 61 20 74 6f 20 62 65 20 6e 6f 6e 2d 7a 65 72  ta to be non-zer
df60: 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  o..  */.  if( pT
df70: 73 64 72 6f 2d 3e 75 73 65 53 68 61 72 65 64 44  sdro->useSharedD
df80: 61 74 61 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ata && zFilename
df90: 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a   && !isMemdb ){.
dfa0: 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d      pBt->pNext =
dfb0: 20 70 54 73 64 72 6f 2d 3e 70 42 74 72 65 65 3b   pTsdro->pBtree;
dfc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 54 68 72 65  .    sqlite3Thre
dfd0: 61 64 44 61 74 61 28 29 2d 3e 70 42 74 72 65 65  adData()->pBtree
dfe0: 20 3d 20 70 42 74 3b 0a 20 20 7d 0a 23 65 6e 64   = pBt;.  }.#end
dff0: 69 66 0a 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d  if.  pBt->nRef =
e000: 20 31 3b 0a 20 20 2a 70 70 42 74 72 65 65 20 3d   1;.  *ppBtree =
e010: 20 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   p;.  return SQL
e020: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
e030: 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64   Close an open d
e040: 61 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61  atabase and inva
e050: 6c 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f  lidate all curso
e060: 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
e070: 65 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72  e3BtreeClose(Btr
e080: 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
e090: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
e0a0: 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
e0b0: 75 72 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ur;..#ifndef SQL
e0c0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
e0d0: 43 41 43 48 45 0a 20 20 54 68 72 65 61 64 44 61  CACHE.  ThreadDa
e0e0: 74 61 20 2a 70 54 73 64 3b 0a 23 65 6e 64 69 66  ta *pTsd;.#endif
e0f0: 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c  ..  /* Close all
e100: 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20   cursors opened 
e110: 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e  via this handle.
e120: 20 20 2a 2f 0a 20 20 70 43 75 72 20 3d 20 70 42    */.  pCur = pB
e130: 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68  t->pCursor;.  wh
e140: 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20  ile( pCur ){.   
e150: 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20   BtCursor *pTmp 
e160: 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72  = pCur;.    pCur
e170: 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
e180: 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42      if( pTmp->pB
e190: 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
e1a0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
e1b0: 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a  seCursor(pTmp);.
e1c0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
e1d0: 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74  Rollback any act
e1e0: 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ive transaction 
e1f0: 61 6e 64 20 66 72 65 65 20 74 68 65 20 68 61 6e  and free the han
e200: 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20  dle structure.. 
e210: 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20   ** The call to 
e220: 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
e230: 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79  back() drops any
e240: 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c   table-locks hel
e250: 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68  d by.  ** this h
e260: 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71  andle..  */.  sq
e270: 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
e280: 63 6b 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 46  ck(p);.  sqliteF
e290: 72 65 65 28 70 29 3b 0a 0a 23 69 66 6e 64 65 66  ree(p);..#ifndef
e2a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
e2b0: 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a 20 49  RED_CACHE.  /* I
e2c0: 66 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c  f there are stil
e2d0: 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e 64  l other outstand
e2e0: 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74  ing references t
e2f0: 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  o the shared-btr
e300: 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72  ee.  ** structur
e310: 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54  e, return now. T
e320: 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20  he remainder of 
e330: 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63  this procedure c
e340: 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74  leans .  ** up t
e350: 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e  he shared-btree.
e360: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
e370: 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  pBt->nRef>0 );. 
e380: 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20   pBt->nRef--;.  
e390: 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 20 29 7b  if( pBt->nRef ){
e3a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
e3b0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
e3c0: 20 52 65 6d 6f 76 65 20 74 68 65 20 73 68 61 72   Remove the shar
e3d0: 65 64 2d 62 74 72 65 65 20 66 72 6f 6d 20 74 68  ed-btree from th
e3e0: 65 20 74 68 72 65 61 64 20 77 69 64 65 20 6c 69  e thread wide li
e3f0: 73 74 2e 20 43 61 6c 6c 20 0a 20 20 2a 2a 20 54  st. Call .  ** T
e400: 68 72 65 61 64 44 61 74 61 52 65 61 64 4f 6e 6c  hreadDataReadOnl
e410: 79 28 29 20 61 6e 64 20 74 68 65 6e 20 63 61 73  y() and then cas
e420: 74 20 61 77 61 79 20 74 68 65 20 63 6f 6e 73 74  t away the const
e430: 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65   property of the
e440: 20 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74   .  ** pointer t
e450: 6f 20 61 76 6f 69 64 20 61 6c 6c 6f 63 61 74 69  o avoid allocati
e460: 6e 67 20 74 68 72 65 61 64 20 64 61 74 61 20 69  ng thread data i
e470: 66 20 69 74 20 69 73 20 6e 6f 74 20 72 65 61 6c  f it is not real
e480: 6c 79 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a  ly required..  *
e490: 2f 0a 20 20 70 54 73 64 20 3d 20 28 54 68 72 65  /.  pTsd = (Thre
e4a0: 61 64 44 61 74 61 20 2a 29 73 71 6c 69 74 65 33  adData *)sqlite3
e4b0: 54 68 72 65 61 64 44 61 74 61 52 65 61 64 4f 6e  ThreadDataReadOn
e4c0: 6c 79 28 29 3b 0a 20 20 69 66 28 20 70 54 73 64  ly();.  if( pTsd
e4d0: 2d 3e 70 42 74 72 65 65 3d 3d 70 42 74 20 29 7b  ->pBtree==pBt ){
e4e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 73  .    assert( pTs
e4f0: 64 3d 3d 73 71 6c 69 74 65 33 54 68 72 65 61 64  d==sqlite3Thread
e500: 44 61 74 61 28 29 20 29 3b 0a 20 20 20 20 70 54  Data() );.    pT
e510: 73 64 2d 3e 70 42 74 72 65 65 20 3d 20 70 42 74  sd->pBtree = pBt
e520: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65  ->pNext;.  }else
e530: 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  {.    BtShared *
e540: 70 50 72 65 76 3b 0a 20 20 20 20 66 6f 72 28 70  pPrev;.    for(p
e550: 50 72 65 76 3d 70 54 73 64 2d 3e 70 42 74 72 65  Prev=pTsd->pBtre
e560: 65 3b 20 70 50 72 65 76 20 26 26 20 70 50 72 65  e; pPrev && pPre
e570: 76 2d 3e 70 4e 65 78 74 21 3d 70 42 74 3b 20 70  v->pNext!=pBt; p
e580: 50 72 65 76 3d 70 50 72 65 76 2d 3e 70 4e 65 78  Prev=pPrev->pNex
e590: 74 29 7b 7d 0a 20 20 20 20 69 66 28 20 70 50 72  t){}.    if( pPr
e5a0: 65 76 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ev ){.      asse
e5b0: 72 74 28 20 70 54 73 64 3d 3d 73 71 6c 69 74 65  rt( pTsd==sqlite
e5c0: 33 54 68 72 65 61 64 44 61 74 61 28 29 20 29 3b  3ThreadData() );
e5d0: 0a 20 20 20 20 20 20 70 50 72 65 76 2d 3e 70 4e  .      pPrev->pN
e5e0: 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74  ext = pBt->pNext
e5f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
e600: 69 66 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 74  if..  /* Close t
e610: 68 65 20 70 61 67 65 72 20 61 6e 64 20 66 72 65  he pager and fre
e620: 65 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  e the shared-btr
e630: 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
e640: 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
e650: 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 73 71 6c  pCursor );.  sql
e660: 69 74 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28  ite3pager_close(
e670: 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
e680: 69 66 28 20 70 42 74 2d 3e 78 46 72 65 65 53 63  if( pBt->xFreeSc
e690: 68 65 6d 61 20 26 26 20 70 42 74 2d 3e 70 53 63  hema && pBt->pSc
e6a0: 68 65 6d 61 20 29 7b 0a 20 20 20 20 70 42 74 2d  hema ){.    pBt-
e6b0: 3e 78 46 72 65 65 53 63 68 65 6d 61 28 70 42 74  >xFreeSchema(pBt
e6c0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a  ->pSchema);.  }.
e6d0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 42 74    sqliteFree(pBt
e6e0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 73 71  ->pSchema);.  sq
e6f0: 6c 69 74 65 46 72 65 65 28 70 42 74 29 3b 0a 20  liteFree(pBt);. 
e700: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
e710: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
e720: 67 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ge the busy hand
e730: 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e  ler callback fun
e740: 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
e750: 6c 69 74 65 33 42 74 72 65 65 53 65 74 42 75 73  lite3BtreeSetBus
e760: 79 48 61 6e 64 6c 65 72 28 42 74 72 65 65 20 2a  yHandler(Btree *
e770: 70 2c 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  p, BusyHandler *
e780: 70 48 61 6e 64 6c 65 72 29 7b 0a 20 20 42 74 53  pHandler){.  BtS
e790: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
e7a0: 70 42 74 3b 0a 20 20 70 42 74 2d 3e 70 42 75 73  pBt;.  pBt->pBus
e7b0: 79 48 61 6e 64 6c 65 72 20 3d 20 70 48 61 6e 64  yHandler = pHand
e7c0: 6c 65 72 3b 0a 20 20 73 71 6c 69 74 65 33 70 61  ler;.  sqlite3pa
e7d0: 67 65 72 5f 73 65 74 5f 62 75 73 79 68 61 6e 64  ger_set_busyhand
e7e0: 6c 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ler(pBt->pPager,
e7f0: 20 70 48 61 6e 64 6c 65 72 29 3b 0a 20 20 72 65   pHandler);.  re
e800: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
e810: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
e820: 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65  the limit on the
e830: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
e840: 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65 20   allowed in the 
e850: 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  cache..**.** The
e860: 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
e870: 6f 66 20 63 61 63 68 65 20 70 61 67 65 73 20 69  of cache pages i
e880: 73 20 73 65 74 20 74 6f 20 74 68 65 20 61 62 73  s set to the abs
e890: 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20 6f  olute.** value o
e8a0: 66 20 6d 78 50 61 67 65 2e 20 20 49 66 20 6d 78  f mxPage.  If mx
e8b0: 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76 65  Page is negative
e8c0: 2c 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c  , the pager will
e8d0: 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61 73 79 6e  .** operate asyn
e8e0: 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74 20  chronously - it 
e8f0: 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74 6f  will not stop to
e900: 20 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a 20   do fsync()s.** 
e910: 74 6f 20 69 6e 73 75 72 65 20 64 61 74 61 20 69  to insure data i
e920: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
e930: 20 64 69 73 6b 20 73 75 72 66 61 63 65 20 62 65   disk surface be
e940: 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69  fore.** continui
e950: 6e 67 2e 20 20 54 72 61 6e 73 61 63 74 69 6f 6e  ng.  Transaction
e960: 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66 20  s still work if 
e970: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f  synchronous is o
e980: 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64  ff,.** and the d
e990: 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62  atabase cannot b
e9a0: 65 20 63 6f 72 72 75 70 74 65 64 20 69 66 20 74  e corrupted if t
e9b0: 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 63  his program.** c
e9c0: 72 61 73 68 65 73 2e 20 20 42 75 74 20 69 66 20  rashes.  But if 
e9d0: 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
e9e0: 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72 20  stem crashes or 
e9f0: 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 61  there is.** an a
ea00: 62 72 75 70 74 20 70 6f 77 65 72 20 66 61 69 6c  brupt power fail
ea10: 75 72 65 20 77 68 65 6e 20 73 79 6e 63 68 72 6f  ure when synchro
ea20: 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20 74 68 65  nous is off, the
ea30: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 75   database.** cou
ea40: 6c 64 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e  ld be left in an
ea50: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e   inconsistent an
ea60: 64 20 75 6e 72 65 63 6f 76 65 72 61 62 6c 65 20  d unrecoverable 
ea70: 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68 72  state..** Synchr
ea80: 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79 20 64  onous is on by d
ea90: 65 66 61 75 6c 74 20 73 6f 20 64 61 74 61 62 61  efault so databa
eaa0: 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73  se corruption is
eab0: 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79   not.** normally
eac0: 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74   a worry..*/.int
ead0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
eae0: 43 61 63 68 65 53 69 7a 65 28 42 74 72 65 65 20  CacheSize(Btree 
eaf0: 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  *p, int mxPage){
eb00: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
eb10: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
eb20: 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 63 61  ite3pager_set_ca
eb30: 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  chesize(pBt->pPa
eb40: 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20  ger, mxPage);.  
eb50: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
eb60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
eb70: 65 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69  e the way data i
eb80: 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  s synced to disk
eb90: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63   in order to inc
eba0: 72 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73  rease or decreas
ebb0: 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68  e.** how well th
ebc0: 65 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73  e database resis
ebd0: 74 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  ts damage due to
ebe0: 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20   OS crashes and 
ebf0: 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
ec00: 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74  s.  Level 1 is t
ec10: 68 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63  he same as async
ec20: 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63  hronous (no sync
ec30: 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a  s() occur and.**
ec40: 20 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68   there is a high
ec50: 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
ec60: 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32  damage)  Level 2
ec70: 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e   is the default.
ec80: 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20    There.** is a 
ec90: 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e  very low but non
eca0: 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74  -zero probabilit
ecb0: 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65  y of damage.  Le
ecc0: 76 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68  vel 3 reduces th
ecd0: 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79  e.** probability
ece0: 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65   of damage to ne
ecf0: 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68  ar zero but with
ed00: 20 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d   a write perform
ed10: 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a  ance reduction..
ed20: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
ed30: 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
ed40: 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33  GMAS.int sqlite3
ed50: 42 74 72 65 65 53 65 74 53 61 66 65 74 79 4c 65  BtreeSetSafetyLe
ed60: 76 65 6c 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  vel(Btree *p, in
ed70: 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c  t level, int ful
ed80: 6c 53 79 6e 63 29 7b 0a 20 20 42 74 53 68 61 72  lSync){.  BtShar
ed90: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
eda0: 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72  ;.  sqlite3pager
edb0: 5f 73 65 74 5f 73 61 66 65 74 79 5f 6c 65 76 65  _set_safety_leve
edc0: 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6c  l(pBt->pPager, l
edd0: 65 76 65 6c 2c 20 66 75 6c 6c 53 79 6e 63 29 3b  evel, fullSync);
ede0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
edf0: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
ee00: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
ee10: 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 62 74   if the given bt
ee20: 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 73 61  ree is set to sa
ee30: 66 65 74 79 20 6c 65 76 65 6c 20 31 2e 20 20 49  fety level 1.  I
ee40: 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73  n other.** words
ee50: 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66  , return TRUE if
ee60: 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63 63 75 72   no sync() occur
ee70: 73 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69  s on the disk fi
ee80: 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  les..*/.int sqli
ee90: 74 65 33 42 74 72 65 65 53 79 6e 63 44 69 73 61  te3BtreeSyncDisa
eea0: 62 6c 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a  bled(Btree *p){.
eeb0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
eec0: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
eed0: 72 74 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e  rt( pBt && pBt->
eee0: 70 50 61 67 65 72 20 29 3b 0a 20 20 72 65 74 75  pPager );.  retu
eef0: 72 6e 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  rn sqlite3pager_
ef00: 6e 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50 61 67  nosync(pBt->pPag
ef10: 65 72 29 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66  er);.}..#if !def
ef20: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
ef30: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20  _PAGER_PRAGMAS) 
ef40: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
ef50: 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 0a  TE_OMIT_VACUUM).
ef60: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
ef70: 20 64 65 66 61 75 6c 74 20 70 61 67 65 73 20 73   default pages s
ef80: 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62  ize and the numb
ef90: 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62  er of reserved b
efa0: 79 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a  ytes per page..*
efb0: 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69  *.** The page si
efc0: 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77  ze must be a pow
efd0: 65 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20  er of 2 between 
efe0: 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20  512 and 65536.  
eff0: 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73  If the page.** s
f000: 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65  ize supplied doe
f010: 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20  s not meet this 
f020: 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20  constraint then 
f030: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
f040: 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e   not.** changed.
f050: 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65  .**.** Page size
f060: 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65  s are constraine
f070: 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20  d to be a power 
f080: 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74  of two so that t
f090: 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20  he region.** of 
f0a0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
f0b0: 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69  e used for locki
f0c0: 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74  ng (beginning at
f0d0: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a   PENDING_BYTE,.*
f0e0: 2a 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  * the first byte
f0f0: 20 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f   past the 1GB bo
f100: 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30  undary, 0x400000
f110: 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63  00) needs to occ
f120: 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67  ur.** at the beg
f130: 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65  inning of a page
f140: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
f150: 65 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73  eter nReserve is
f160: 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
f170: 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   then the number
f180: 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20   of reserved.** 
f190: 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69  bytes per page i
f1a0: 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64  s left unchanged
f1b0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
f1c0: 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65  BtreeSetPageSize
f1d0: 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70  (Btree *p, int p
f1e0: 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65  ageSize, int nRe
f1f0: 73 65 72 76 65 29 7b 0a 20 20 42 74 53 68 61 72  serve){.  BtShar
f200: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
f210: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67  ;.  if( pBt->pag
f220: 65 53 69 7a 65 46 69 78 65 64 20 29 7b 0a 20 20  eSizeFixed ){.  
f230: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f240: 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20  READONLY;.  }.  
f250: 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29  if( nReserve<0 )
f260: 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d  {.    nReserve =
f270: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
f280: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
f290: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 61 67 65  ;.  }.  if( page
f2a0: 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
f2b0: 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
f2c0: 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20  X_PAGE_SIZE &&. 
f2d0: 20 20 20 20 20 20 20 28 28 70 61 67 65 53 69 7a         ((pageSiz
f2e0: 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d  e-1)&pageSize)==
f2f0: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
f300: 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
f310: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
f320: 28 20 21 70 42 74 2d 3e 70 50 61 67 65 31 20 26  ( !pBt->pPage1 &
f330: 26 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  & !pBt->pCursor 
f340: 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  );.    pBt->page
f350: 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 70 61  Size = sqlite3pa
f360: 67 65 72 5f 73 65 74 5f 70 61 67 65 73 69 7a 65  ger_set_pagesize
f370: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 61  (pBt->pPager, pa
f380: 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70  geSize);.  }.  p
f390: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
f3a0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
f3b0: 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 72 65 74   nReserve;.  ret
f3c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
f3d0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
f3e0: 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66  he currently def
f3f0: 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a  ined page size.*
f400: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
f410: 65 65 47 65 74 50 61 67 65 53 69 7a 65 28 42 74  eeGetPageSize(Bt
f420: 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  ree *p){.  retur
f430: 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  n p->pBt->pageSi
f440: 7a 65 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  ze;.}.int sqlite
f450: 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65  3BtreeGetReserve
f460: 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65  (Btree *p){.  re
f470: 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67  turn p->pBt->pag
f480: 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e  eSize - p->pBt->
f490: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 7d 0a 23 65  usableSize;.}.#e
f4a0: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
f4b0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47  (SQLITE_OMIT_PAG
f4c0: 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21  ER_PRAGMAS) || !
f4d0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
f4e0: 4d 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f 0a 0a  MIT_VACUUM) */..
f4f0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
f500: 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70   'auto-vacuum' p
f510: 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 64  roperty of the d
f520: 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 20  atabase. If the 
f530: 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20  'autoVacuum'.** 
f540: 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e  parameter is non
f550: 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f  -zero, then auto
f560: 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20  -vacuum mode is 
f570: 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f  enabled. If zero
f580: 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62  , it.** is disab
f590: 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74  led. The default
f5a0: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61   value for the a
f5b0: 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65  uto-vacuum prope
f5c0: 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72  rty is .** deter
f5d0: 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c  mined by the SQL
f5e0: 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
f5f0: 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f  VACUUM macro..*/
f600: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
f610: 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42  eSetAutoVacuum(B
f620: 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74  tree *p, int aut
f630: 6f 56 61 63 75 75 6d 29 7b 0a 20 20 42 74 53 68  oVacuum){.  BtSh
f640: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
f650: 42 74 3b 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  Bt;;.#ifdef SQLI
f660: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
f670: 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  UM.  return SQLI
f680: 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c  TE_READONLY;.#el
f690: 73 65 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61  se.  if( pBt->pa
f6a0: 67 65 53 69 7a 65 46 69 78 65 64 20 29 7b 0a 20  geSizeFixed ){. 
f6b0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f6c0: 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20  _READONLY;.  }. 
f6d0: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
f6e0: 20 3d 20 28 61 75 74 6f 56 61 63 75 75 6d 3f 31   = (autoVacuum?1
f6f0: 3a 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  :0);.  return SQ
f700: 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a  LITE_OK;.#endif.
f710: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
f720: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
f730: 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70   'auto-vacuum' p
f740: 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f  roperty. If auto
f750: 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65  -vacuum is .** e
f760: 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65 74 75  nabled 1 is retu
f770: 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
f780: 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  0..*/.int sqlite
f790: 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61 63  3BtreeGetAutoVac
f7a0: 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23  uum(Btree *p){.#
f7b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
f7c0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72  T_AUTOVACUUM.  r
f7d0: 65 74 75 72 6e 20 30 3b 0a 23 65 6c 73 65 0a 20  eturn 0;.#else. 
f7e0: 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e   return p->pBt->
f7f0: 61 75 74 6f 56 61 63 75 75 6d 3b 0a 23 65 6e 64  autoVacuum;.#end
f800: 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  if.}.../*.** Get
f810: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
f820: 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64 61  pPage1 of the da
f830: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
f840: 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20  is will.** also 
f850: 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f  acquire a readlo
f860: 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e  ck on that file.
f870: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
f880: 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
f890: 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65  success.  If the
f8a0: 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a   file is not a.*
f8b0: 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  * well-formed da
f8c0: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
f8d0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
f8e0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
f8f0: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
f900: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
f910: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
f920: 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ed.  SQLITE_NOME
f930: 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  M.** is returned
f940: 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f   if we run out o
f950: 66 20 6d 65 6d 6f 72 79 2e 20 20 53 51 4c 49 54  f memory.  SQLIT
f960: 45 5f 50 52 4f 54 4f 43 4f 4c 20 69 73 20 72 65  E_PROTOCOL is re
f970: 74 75 72 6e 65 64 0a 2a 2a 20 69 66 20 74 68 65  turned.** if the
f980: 72 65 20 69 73 20 61 20 6c 6f 63 6b 69 6e 67 20  re is a locking 
f990: 70 72 6f 74 6f 63 6f 6c 20 76 69 6f 6c 61 74 69  protocol violati
f9a0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
f9b0: 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68  t lockBtree(BtSh
f9c0: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e  ared *pBt){.  in
f9d0: 74 20 72 63 2c 20 70 61 67 65 53 69 7a 65 3b 0a  t rc, pageSize;.
f9e0: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
f9f0: 31 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 50  1;.  if( pBt->pP
fa00: 61 67 65 31 20 29 20 72 65 74 75 72 6e 20 53 51  age1 ) return SQ
fa10: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 72 63 20 3d 20  LITE_OK;.  rc = 
fa20: 67 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20  getPage(pBt, 1, 
fa30: 26 70 50 61 67 65 31 29 3b 0a 20 20 69 66 28 20  &pPage1);.  if( 
fa40: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
fa50: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 0a 0a 20  return rc;.  .. 
fa60: 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63   /* Do some chec
fa70: 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73  king to help ins
fa80: 75 72 65 20 74 68 65 20 66 69 6c 65 20 77 65 20  ure the file we 
fa90: 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73  opened really is
faa0: 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61  .  ** a valid da
fab0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20  tabase file. .  
fac0: 2a 2f 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45  */.  rc = SQLITE
fad0: 5f 4e 4f 54 41 44 42 3b 0a 20 20 69 66 28 20 73  _NOTADB;.  if( s
fae0: 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65  qlite3pager_page
faf0: 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
fb00: 72 29 3e 30 20 29 7b 0a 20 20 20 20 75 38 20 2a  r)>0 ){.    u8 *
fb10: 70 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e  page1 = pPage1->
fb20: 61 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20 6d  aData;.    if( m
fb30: 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61  emcmp(page1, zMa
fb40: 67 69 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d  gicHeader, 16)!=
fb50: 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
fb60: 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
fb70: 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  d;.    }.    if(
fb80: 20 70 61 67 65 31 5b 31 38 5d 3e 31 20 7c 7c 20   page1[18]>1 || 
fb90: 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20  page1[19]>1 ){. 
fba0: 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
fbb0: 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
fbc0: 20 7d 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20   }.    pageSize 
fbd0: 3d 20 67 65 74 32 62 79 74 65 28 26 70 61 67 65  = get2byte(&page
fbe0: 31 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66 28 20  1[16]);.    if( 
fbf0: 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61  ((pageSize-1)&pa
fc00: 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20  geSize)!=0 ){.  
fc10: 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
fc20: 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
fc30: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  }.    assert( (p
fc40: 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
fc50: 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  );.    pBt->page
fc60: 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b  Size = pageSize;
fc70: 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  .    pBt->usable
fc80: 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 20  Size = pageSize 
fc90: 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20  - page1[20];.   
fca0: 20 69 66 28 20 70 42 74 2d 3e 75 73 61 62 6c 65   if( pBt->usable
fcb0: 53 69 7a 65 3c 35 30 30 20 29 7b 0a 20 20 20 20  Size<500 ){.    
fcc0: 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
fcd0: 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
fce0: 20 20 20 20 70 42 74 2d 3e 6d 61 78 45 6d 62 65      pBt->maxEmbe
fcf0: 64 46 72 61 63 20 3d 20 70 61 67 65 31 5b 32 31  dFrac = page1[21
fd00: 5d 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 69 6e 45  ];.    pBt->minE
fd10: 6d 62 65 64 46 72 61 63 20 3d 20 70 61 67 65 31  mbedFrac = page1
fd20: 5b 32 32 5d 3b 0a 20 20 20 20 70 42 74 2d 3e 6d  [22];.    pBt->m
fd30: 69 6e 4c 65 61 66 46 72 61 63 20 3d 20 70 61 67  inLeafFrac = pag
fd40: 65 31 5b 32 33 5d 3b 0a 23 69 66 6e 64 65 66 20  e1[23];.#ifndef 
fd50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
fd60: 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e  VACUUM.    pBt->
fd70: 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65  autoVacuum = (ge
fd80: 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36  t4byte(&page1[36
fd90: 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23   + 4*4])?1:0);.#
fda0: 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20  endif.  }..  /* 
fdb0: 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68 65 20  maxLocal is the 
fdc0: 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  maximum amount o
fdd0: 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f  f payload to sto
fde0: 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20  re locally for. 
fdf0: 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b   ** a cell.  Mak
fe00: 65 20 73 75 72 65 20 69 74 20 69 73 20 73 6d 61  e sure it is sma
fe10: 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61  ll enough so tha
fe20: 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 61  t at least minFa
fe30: 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20  nout.  ** cells 
fe40: 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20  can will fit on 
fe50: 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20 61 73  one page.  We as
fe60: 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65 20 70  sume a 10-byte p
fe70: 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a  age header..  **
fe80: 20 42 65 73 69 64 65 73 20 74 68 65 20 70 61 79   Besides the pay
fe90: 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d  load, the cell m
fea0: 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20  ust store:.  ** 
feb0: 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e 74      2-byte point
fec0: 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20  er to the cell. 
fed0: 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 63   **     4-byte c
fee0: 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a  hild pointer.  *
fef0: 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e 4b 65  *     9-byte nKe
ff00: 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20  y value.  **    
ff10: 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20 76 61   4-byte nData va
ff20: 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62  lue.  **     4-b
ff30: 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  yte overflow pag
ff40: 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53  e pointer.  ** S
ff50: 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74  o a cell consist
ff60: 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70 6f  s of a 2-byte po
ff70: 69 6e 65 72 2c 20 61 20 68 65 61 64 65 72 20 77  iner, a header w
ff80: 68 69 63 68 20 69 73 20 61 73 20 6d 75 63 68 20  hich is as much 
ff90: 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74 65 73  as.  ** 17 bytes
ffa0: 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79   long, 0 to N by
ffb0: 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20  tes of payload, 
ffc0: 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20  and an optional 
ffd0: 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a  4 byte overflow.
ffe0: 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74 65    ** page pointe
fff0: 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d  r..  */.  pBt->m
10000 61 78 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e  axLocal = (pBt->
10010 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 70  usableSize-12)*p
10020 42 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72 61 63  Bt->maxEmbedFrac
10030 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 70 42 74  /255 - 23;.  pBt
10040 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 70 42  ->minLocal = (pB
10050 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32  t->usableSize-12
10060 29 2a 70 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46  )*pBt->minEmbedF
10070 72 61 63 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20  rac/255 - 23;.  
10080 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 70  pBt->maxLeaf = p
10090 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
100a0 20 33 35 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c   35;.  pBt->minL
100b0 65 61 66 20 3d 20 28 70 42 74 2d 3e 75 73 61 62  eaf = (pBt->usab
100c0 6c 65 53 69 7a 65 2d 31 32 29 2a 70 42 74 2d 3e  leSize-12)*pBt->
100d0 6d 69 6e 4c 65 61 66 46 72 61 63 2f 32 35 35 20  minLeafFrac/255 
100e0 2d 20 32 33 3b 0a 20 20 69 66 28 20 70 42 74 2d  - 23;.  if( pBt-
100f0 3e 6d 69 6e 4c 6f 63 61 6c 3e 70 42 74 2d 3e 6d  >minLocal>pBt->m
10100 61 78 4c 6f 63 61 6c 20 7c 7c 20 70 42 74 2d 3e  axLocal || pBt->
10110 6d 61 78 4c 6f 63 61 6c 3c 30 20 29 7b 0a 20 20  maxLocal<0 ){.  
10120 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
10130 74 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 0a 20 20  t_failed;.  }.  
10140 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78  assert( pBt->max
10150 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f  Leaf + 23 <= MX_
10160 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29  CELL_SIZE(pBt) )
10170 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ;.  pBt->pPage1 
10180 3d 20 70 50 61 67 65 31 3b 0a 20 20 72 65 74 75  = pPage1;.  retu
10190 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70  rn SQLITE_OK;..p
101a0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
101b0 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  :.  releasePage(
101c0 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e  pPage1);.  pBt->
101d0 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65  pPage1 = 0;.  re
101e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
101f0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
10200 6f 72 6b 73 20 6c 69 6b 65 20 6c 6f 63 6b 42 74  orks like lockBt
10210 72 65 65 28 29 20 65 78 63 65 70 74 20 74 68 61  ree() except tha
10220 74 20 69 74 20 61 6c 73 6f 20 69 6e 76 6f 6b 65  t it also invoke
10230 73 20 74 68 65 0a 2a 2a 20 62 75 73 79 20 63 61  s the.** busy ca
10240 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 72 65 20  llback if there 
10250 69 73 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69  is lock contenti
10260 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
10270 74 20 6c 6f 63 6b 42 74 72 65 65 57 69 74 68 52  t lockBtreeWithR
10280 65 74 72 79 28 42 74 72 65 65 20 2a 70 52 65 66  etry(Btree *pRef
10290 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
102a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
102b0 52 65 66 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  Ref->inTrans==TR
102c0 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  ANS_NONE ){.    
102d0 75 38 20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  u8 inTransaction
102e0 20 3d 20 70 52 65 66 2d 3e 70 42 74 2d 3e 69 6e   = pRef->pBt->in
102f0 54 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20 20 20  Transaction;.   
10300 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
10310 70 52 65 66 29 3b 0a 20 20 20 20 72 63 20 3d 20  pRef);.    rc = 
10320 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69  sqlite3BtreeBegi
10330 6e 54 72 61 6e 73 28 70 52 65 66 2c 20 30 29 3b  nTrans(pRef, 0);
10340 0a 20 20 20 20 70 52 65 66 2d 3e 70 42 74 2d 3e  .    pRef->pBt->
10350 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
10360 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20  inTransaction;. 
10370 20 20 20 70 52 65 66 2d 3e 69 6e 54 72 61 6e 73     pRef->inTrans
10380 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
10390 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
103a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 52  E_OK ){.      pR
103b0 65 66 2d 3e 70 42 74 2d 3e 6e 54 72 61 6e 73 61  ef->pBt->nTransa
103c0 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20  ction--;.    }. 
103d0 20 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74     btreeIntegrit
103e0 79 28 70 52 65 66 29 3b 0a 20 20 7d 0a 20 20 72  y(pRef);.  }.  r
103f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 20 20 20  eturn rc;.}.    
10400 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68     ../*.** If th
10410 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74  ere are no outst
10420 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61  anding cursors a
10430 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e  nd we are not in
10440 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f   the middle.** o
10450 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
10460 62 75 74 20 74 68 65 72 65 20 69 73 20 61 20 72  but there is a r
10470 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead lock on the 
10480 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a  database, then.*
10490 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75  * this routine u
104a0 6e 72 65 66 73 20 74 68 65 20 66 69 72 73 74 20  nrefs the first 
104b0 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
104c0 62 61 73 65 20 66 69 6c 65 20 77 68 69 63 68 20  base file which 
104d0 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66 65  .** has the effe
104e0 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20  ct of releasing 
104f0 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a  the read lock..*
10500 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
10510 65 20 61 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e  e any outstandin
10520 67 20 63 75 72 73 6f 72 73 2c 20 74 68 69 73 20  g cursors, this 
10530 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
10540 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  op..**.** If the
10550 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63 74  re is a transact
10560 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c  ion in progress,
10570 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
10580 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
10590 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42  tic void unlockB
105a0 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74 53  treeIfUnused(BtS
105b0 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
105c0 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  f( pBt->inTransa
105d0 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  ction==TRANS_NON
105e0 45 20 26 26 20 70 42 74 2d 3e 70 43 75 72 73 6f  E && pBt->pCurso
105f0 72 3d 3d 30 20 26 26 20 70 42 74 2d 3e 70 50 61  r==0 && pBt->pPa
10600 67 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  ge1!=0 ){.    if
10610 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  ( pBt->pPage1->a
10620 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Data==0 ){.     
10630 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
10640 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20  = pBt->pPage1;. 
10650 20 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74       pPage->aDat
10660 61 20 3d 20 26 28 28 75 38 2a 29 70 50 61 67 65  a = &((u8*)pPage
10670 29 5b 2d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  )[-pBt->pageSize
10680 5d 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  ];.      pPage->
10690 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20  pBt = pBt;.     
106a0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 31   pPage->pgno = 1
106b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65  ;.    }.    rele
106c0 61 73 65 50 61 67 65 28 70 42 74 2d 3e 70 50 61  asePage(pBt->pPa
106d0 67 65 31 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  ge1);.    pBt->p
106e0 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 70  Page1 = 0;.    p
106f0 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a  Bt->inStmt = 0;.
10700 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65    }.}../*.** Cre
10710 61 74 65 20 61 20 6e 65 77 20 64 61 74 61 62 61  ate a new databa
10720 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69  se by initializi
10730 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ng the first pag
10740 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65  e of the.** file
10750 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10760 6e 65 77 44 61 74 61 62 61 73 65 28 42 74 53 68  newDatabase(BtSh
10770 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65  ared *pBt){.  Me
10780 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e  mPage *pP1;.  un
10790 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
107a0 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  a;.  int rc;.  i
107b0 66 28 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  f( sqlite3pager_
107c0 70 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  pagecount(pBt->p
107d0 50 61 67 65 72 29 3e 30 20 29 20 72 65 74 75 72  Pager)>0 ) retur
107e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  n SQLITE_OK;.  p
107f0 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  P1 = pBt->pPage1
10800 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 31 21  ;.  assert( pP1!
10810 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70  =0 );.  data = p
10820 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20  P1->aData;.  rc 
10830 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77  = sqlite3pager_w
10840 72 69 74 65 28 64 61 74 61 29 3b 0a 20 20 69 66  rite(data);.  if
10850 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
10860 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c  ;.  memcpy(data,
10870 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73   zMagicHeader, s
10880 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64  izeof(zMagicHead
10890 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er));.  assert( 
108a0 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61  sizeof(zMagicHea
108b0 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 70 75  der)==16 );.  pu
108c0 74 32 62 79 74 65 28 26 64 61 74 61 5b 31 36 5d  t2byte(&data[16]
108d0 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  , pBt->pageSize)
108e0 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31  ;.  data[18] = 1
108f0 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31  ;.  data[19] = 1
10900 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 70  ;.  data[20] = p
10910 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
10920 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
10930 20 20 64 61 74 61 5b 32 31 5d 20 3d 20 70 42 74    data[21] = pBt
10940 2d 3e 6d 61 78 45 6d 62 65 64 46 72 61 63 3b 0a  ->maxEmbedFrac;.
10950 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 70 42 74    data[22] = pBt
10960 2d 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63 3b 0a  ->minEmbedFrac;.
10970 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 70 42 74    data[23] = pBt
10980 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63 3b 0a 20  ->minLeafFrac;. 
10990 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34   memset(&data[24
109a0 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20  ], 0, 100-24);. 
109b0 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50   zeroPage(pP1, P
109c0 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
109d0 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20  AF|PTF_LEAFDATA 
109e0 29 3b 0a 20 20 70 42 74 2d 3e 70 61 67 65 53 69  );.  pBt->pageSi
109f0 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69 66  zeFixed = 1;.#if
10a00 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10a10 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66  _AUTOVACUUM.  if
10a20 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
10a30 6d 20 29 7b 0a 20 20 20 20 70 75 74 34 62 79 74  m ){.    put4byt
10a40 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34  e(&data[36 + 4*4
10a50 5d 2c 20 31 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  ], 1);.  }.#endi
10a60 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
10a70 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
10a80 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20  ttempt to start 
10a90 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
10aa0 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  n. A write-trans
10ab0 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61  action.** is sta
10ac0 72 74 65 64 20 69 66 20 74 68 65 20 73 65 63 6f  rted if the seco
10ad0 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  nd argument is n
10ae0 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73  onzero, otherwis
10af0 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61  e a read-.** tra
10b00 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68  nsaction.  If th
10b10 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
10b20 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61  t is 2 or more a
10b30 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20  nd exclusive.** 
10b40 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73  transaction is s
10b50 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20  tarted, meaning 
10b60 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72  that no other pr
10b70 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64  ocess is allowed
10b80 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68  .** to access th
10b90 65 20 64 61 74 61 62 61 73 65 2e 20 20 41 20 70  e database.  A p
10ba0 72 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73  reexisting trans
10bb0 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62  action may not b
10bc0 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f  e.** upgraded to
10bd0 20 65 78 63 6c 75 73 69 76 65 20 62 79 20 63 61   exclusive by ca
10be0 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
10bf0 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65  ne a second time
10c00 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73   - the.** exclus
10c10 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20  ivity flag only 
10c20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20  works for a new 
10c30 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
10c40 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  ** A write-trans
10c50 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73  action must be s
10c60 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 74  tarted before at
10c70 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a  tempting any .**
10c80 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
10c90 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20  database.  None 
10ca0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
10cb0 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69   routines .** wi
10cc0 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61  ll work unless a
10cd0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
10ce0 73 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a  started first:.*
10cf0 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  *.**      sqlite
10d00 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c  3BtreeCreateTabl
10d10 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
10d20 74 65 33 42 74 72 65 65 43 72 65 61 74 65 49 6e  te3BtreeCreateIn
10d30 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  dex().**      sq
10d40 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54  lite3BtreeClearT
10d50 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
10d60 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54  qlite3BtreeDropT
10d70 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
10d80 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72  qlite3BtreeInser
10d90 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  t().**      sqli
10da0 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 29  te3BtreeDelete()
10db0 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
10dc0 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28  BtreeUpdateMeta(
10dd0 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e  ).**.** If an in
10de0 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f  itial attempt to
10df0 20 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63   acquire the loc
10e00 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73 65 20  k fails because 
10e10 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69  of lock contenti
10e20 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61  on.** and the da
10e30 74 61 62 61 73 65 20 77 61 73 20 70 72 65 76 69  tabase was previ
10e40 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20  ously unlocked, 
10e50 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20  then invoke the 
10e60 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20  busy handler.** 
10e70 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e  if there is one.
10e80 20 20 42 75 74 20 69 66 20 74 68 65 72 65 20 77    But if there w
10e90 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20  as previously a 
10ea0 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f  read-lock, do no
10eb0 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20  t.** invoke the 
10ec0 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a  busy handler - j
10ed0 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ust return SQLIT
10ee0 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f  E_BUSY.  SQLITE_
10ef0 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75  BUSY is .** retu
10f00 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  rned when there 
10f10 69 73 20 61 6c 72 65 61 64 79 20 61 20 72 65 61  is already a rea
10f20 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20  d-lock in order 
10f30 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c  to avoid a deadl
10f40 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f  ock..**.** Suppo
10f50 73 65 20 74 68 65 72 65 20 61 72 65 20 74 77 6f  se there are two
10f60 20 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64   processes A and
10f70 20 42 2e 20 20 41 20 68 61 73 20 61 20 72 65 61   B.  A has a rea
10f80 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73  d lock and B has
10f90 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c  .** a reserved l
10fa0 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f  ock.  B tries to
10fb0 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c   promote to excl
10fc0 75 73 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f  usive but is blo
10fd0 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20  cked because.** 
10fe0 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b  of A's read lock
10ff0 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20 70 72  .  A tries to pr
11000 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65  omote to reserve
11010 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64  d but is blocked
11020 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72   by B..** One or
11030 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68   the other of th
11040 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20  e two processes 
11050 6d 75 73 74 20 67 69 76 65 20 77 61 79 20 6f 72  must give way or
11060 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a   there can be.**
11070 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42   no progress.  B
11080 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49  y returning SQLI
11090 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20  TE_BUSY and not 
110a0 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73  invoking the bus
110b0 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68  y callback.** wh
110c0 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61 73  en A already has
110d0 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65   a read lock, we
110e0 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20   encourage A to 
110f0 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20  give up and let 
11100 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f  B.** proceed..*/
11110 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
11120 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65  eBeginTrans(Btre
11130 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67  e *p, int wrflag
11140 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
11150 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
11160 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
11170 4b 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67  K;..  btreeInteg
11180 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  rity(p);..  /* I
11190 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61  f the btree is a
111a0 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72 69 74  lready in a writ
111b0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f  e-transaction, o
111c0 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72  r it.  ** is alr
111d0 65 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74  eady in a read-t
111e0 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61  ransaction and a
111f0 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
11200 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73  n.  ** is reques
11210 74 65 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e  ted, this is a n
11220 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o-op..  */.  if(
11230 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
11240 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e  NS_WRITE || (p->
11250 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52  inTrans==TRANS_R
11260 45 41 44 20 26 26 20 21 77 72 66 6c 61 67 29 20  EAD && !wrflag) 
11270 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
11280 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
11290 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61 63  /* Write transac
112a0 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f  tions are not po
112b0 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64  ssible on a read
112c0 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a  -only database *
112d0 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61  /.  if( pBt->rea
112e0 64 4f 6e 6c 79 20 26 26 20 77 72 66 6c 61 67 20  dOnly && wrflag 
112f0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
11300 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
11310 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74   }..  /* If anot
11320 68 65 72 20 64 61 74 61 62 61 73 65 20 68 61 6e  her database han
11330 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  dle has already 
11340 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65 20 74  opened a write t
11350 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a  ransaction .  **
11360 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64 2d   on this shared-
11370 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
11380 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77 72 69  and a second wri
11390 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
113a0 73 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64  s.  ** requested
113b0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
113c0 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  BUSY..  */.  if(
113d0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
113e0 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
113f0 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20   && wrflag ){.  
11400 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11410 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 64 6f 20  BUSY;.  }..  do 
11420 7b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  {.    if( pBt->p
11430 50 61 67 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20  Page1==0 ){.    
11440 20 20 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65    rc = lockBtree
11450 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  (pBt);.    }.  .
11460 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
11470 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20  TE_OK && wrflag 
11480 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
11490 6c 69 74 65 33 70 61 67 65 72 5f 62 65 67 69 6e  lite3pager_begin
114a0 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  (pBt->pPage1->aD
114b0 61 74 61 2c 20 77 72 66 6c 61 67 3e 31 29 3b 0a  ata, wrflag>1);.
114c0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
114d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
114e0 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62     rc = newDatab
114f0 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ase(pBt);.      
11500 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  }.    }.  .    i
11510 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
11520 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 77 72   ){.      if( wr
11530 66 6c 61 67 20 29 20 70 42 74 2d 3e 69 6e 53 74  flag ) pBt->inSt
11540 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  mt = 0;.    }els
11550 65 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42  e{.      unlockB
11560 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
11570 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c  );.    }.  }whil
11580 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  e( rc==SQLITE_BU
11590 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61  SY && pBt->inTra
115a0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
115b0 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20  NONE &&.        
115c0 20 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42    sqlite3InvokeB
115d0 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74 2d 3e  usyHandler(pBt->
115e0 70 42 75 73 79 48 61 6e 64 6c 65 72 29 20 29 3b  pBusyHandler) );
115f0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
11600 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
11610 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
11620 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  NS_NONE ){.     
11630 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
11640 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  on++;.    }.    
11650 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72  p->inTrans = (wr
11660 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45  flag?TRANS_WRITE
11670 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20  :TRANS_READ);.  
11680 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
11690 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  >pBt->inTransact
116a0 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ion ){.      pBt
116b0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
116c0 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20  = p->inTrans;.  
116d0 20 20 7d 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65    }.  }..  btree
116e0 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20  Integrity(p);.  
116f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
11700 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11710 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a  T_AUTOVACUUM../*
11720 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e  .** Set the poin
11730 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20  ter-map entries 
11740 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e  for all children
11750 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 2e 20   of page pPage. 
11760 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67  Also, if.** pPag
11770 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73  e contains cells
11780 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
11790 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 73  verflow pages, s
117a0 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a  et the pointer.*
117b0 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  * map entries fo
117c0 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
117d0 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f  ages as well..*/
117e0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 43  .static int setC
117f0 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d 50  hildPtrmaps(MemP
11800 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
11810 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
11820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11830 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72    /* Counter var
11840 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  iable */.  int n
11850 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
11860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11870 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
11880 20 69 6e 20 70 61 67 65 20 70 50 61 67 65 20 2a   in page pPage *
11890 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
118a0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
118b0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
118c0 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68 61   code */.  BtSha
118d0 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
118e0 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 69 73 49  ->pBt;.  int isI
118f0 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d  nitOrig = pPage-
11900 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20  >isInit;.  Pgno 
11910 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67  pgno = pPage->pg
11920 6e 6f 3b 0a 0a 20 20 69 6e 69 74 50 61 67 65 28  no;..  initPage(
11930 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 6e 43 65  pPage, 0);.  nCe
11940 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ll = pPage->nCel
11950 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  l;..  for(i=0; i
11960 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
11970 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69    u8 *pCell = fi
11980 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29  ndCell(pPage, i)
11990 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d  ;..    rc = ptrm
119a0 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61  apPutOvflPtr(pPa
119b0 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  ge, pCell);.    
119c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
119d0 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
119e0 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70  set_child_ptrmap
119f0 73 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20  s_out;.    }..  
11a00 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
11a10 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  af ){.      Pgno
11a20 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74   childPgno = get
11a30 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20  4byte(pCell);.  
11a40 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
11a50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e  ut(pBt, childPgn
11a60 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
11a70 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66   pgno);.      if
11a80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11a90 29 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64  ) goto set_child
11aa0 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20  _ptrmaps_out;.  
11ab0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21    }.  }..  if( !
11ac0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
11ad0 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e     Pgno childPgn
11ae0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
11af0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
11b00 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
11b10 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
11b20 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67  Put(pBt, childPg
11b30 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
11b40 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 0a 73 65  , pgno);.  }..se
11b50 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
11b60 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73  out:.  pPage->is
11b70 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69  Init = isInitOri
11b80 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  g;.  return rc;.
11b90 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65  }../*.** Somewhe
11ba0 72 65 20 6f 6e 20 70 50 61 67 65 2c 20 77 68 69  re on pPage, whi
11bb0 63 68 20 69 73 20 67 75 61 72 65 6e 74 65 65 64  ch is guarenteed
11bc0 20 74 6f 20 62 65 20 61 20 62 74 72 65 65 20 70   to be a btree p
11bd0 61 67 65 2c 20 6e 6f 74 20 61 6e 20 6f 76 65 72  age, not an over
11be0 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 2c 20 69 73  flow.** page, is
11bf0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61   a pointer to pa
11c00 67 65 20 69 46 72 6f 6d 2e 20 4d 6f 64 69 66 79  ge iFrom. Modify
11c10 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f   this pointer so
11c20 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
11c30 74 6f 0a 2a 2a 20 69 54 6f 2e 20 50 61 72 61 6d  to.** iTo. Param
11c40 65 74 65 72 20 65 54 79 70 65 20 64 65 73 63 72  eter eType descr
11c50 69 62 65 73 20 74 68 65 20 74 79 70 65 20 6f 66  ibes the type of
11c60 20 70 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 6d   pointer to be m
11c70 6f 64 69 66 69 65 64 2c 20 61 73 20 0a 2a 2a 20  odified, as .** 
11c80 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50  follows:.**.** P
11c90 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20  TRMAP_BTREE:    
11ca0 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65   pPage is a btre
11cb0 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  e-page. The poin
11cc0 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20  ter points at a 
11cd0 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20  child .**       
11ce0 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
11cf0 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a   of pPage..**.**
11d00 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
11d10 31 3a 20 70 50 61 67 65 20 69 73 20 61 20 62 74  1: pPage is a bt
11d20 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f  ree-page. The po
11d30 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20  inter points at 
11d40 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20  an overflow.**  
11d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d60 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f   page pointed to
11d70 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63   by one of the c
11d80 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a  ells on pPage..*
11d90 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52  *.** PTRMAP_OVER
11da0 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20  FLOW2: pPage is 
11db0 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65  an overflow-page
11dc0 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f  . The pointer po
11dd0 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78 74  ints at the next
11de0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
11df0 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70        overflow p
11e00 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e  age in the list.
11e10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
11e20 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72  odifyPagePointer
11e30 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
11e40 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e   Pgno iFrom, Pgn
11e50 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29  o iTo, u8 eType)
11e60 7b 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50  {.  if( eType==P
11e70 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20  TRMAP_OVERFLOW2 
11e80 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 6f  ){.    /* The po
11e90 69 6e 74 65 72 20 69 73 20 61 6c 77 61 79 73 20  inter is always 
11ea0 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
11eb0 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e  s of the page in
11ec0 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a   this case.  */.
11ed0 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65      if( get4byte
11ee0 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 21 3d  (pPage->aData)!=
11ef0 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72  iFrom ){.      r
11f00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
11f10 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
11f20 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50  .    put4byte(pP
11f30 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29  age->aData, iTo)
11f40 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
11f50 6e 74 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20  nt isInitOrig = 
11f60 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20  pPage->isInit;. 
11f70 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
11f80 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 69 6e  t nCell;..    in
11f90 69 74 50 61 67 65 28 70 50 61 67 65 2c 20 30 29  itPage(pPage, 0)
11fa0 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50  ;.    nCell = pP
11fb0 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20  age->nCell;..   
11fc0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
11fd0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75  l; i++){.      u
11fe0 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  8 *pCell = findC
11ff0 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20  ell(pPage, i);. 
12000 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
12010 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
12020 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c   ){.        Cell
12030 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20  Info info;.     
12040 20 20 20 70 61 72 73 65 43 65 6c 6c 50 74 72 28     parseCellPtr(
12050 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
12060 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  nfo);.        if
12070 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  ( info.iOverflow
12080 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
12090 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74  ( iFrom==get4byt
120a0 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
120b0 76 65 72 66 6c 6f 77 5d 29 20 29 7b 0a 20 20 20  verflow]) ){.   
120c0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
120d0 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
120e0 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a  verflow], iTo);.
120f0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
12100 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
12110 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
12120 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
12130 28 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  ( get4byte(pCell
12140 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )==iFrom ){.    
12150 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
12160 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20  Cell, iTo);.    
12170 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12180 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
12190 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
121a0 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  i==nCell ){.    
121b0 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52    if( eType!=PTR
121c0 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20  MAP_BTREE || .  
121d0 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65          get4byte
121e0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
121f0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
12200 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  8])!=iFrom ){.  
12210 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
12220 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
12230 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12240 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
12250 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
12260 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29  rOffset+8], iTo)
12270 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61  ;.    }..    pPa
12280 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49  ge->isInit = isI
12290 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72  nitOrig;.  }.  r
122a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
122b0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  .}.../*.** Move 
122c0 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
122d0 65 20 70 61 67 65 20 70 44 62 50 61 67 65 20 74  e page pDbPage t
122e0 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65  o location iFree
122f0 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  Page in the .** 
12300 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 70 44  database. The pD
12310 62 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 20  bPage reference 
12320 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a  remains valid..*
12330 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c  /.static int rel
12340 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42 74 53  ocatePage(.  BtS
12350 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
12360 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a        /* Btree *
12370 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62  /.  MemPage *pDb
12380 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  Page,        /* 
12390 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76  Open page to mov
123a0 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c  e */.  u8 eType,
123b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123c0 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27  /* Pointer map '
123d0 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20  type' entry for 
123e0 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
123f0 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20 20 20  o iPtrPage,     
12400 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
12410 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65   map 'page-no' e
12420 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65  ntry for pDbPage
12430 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65   */.  Pgno iFree
12440 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20 2f  Page           /
12450 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74  * The location t
12460 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74  o move pDbPage t
12470 6f 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67  o */.){.  MemPag
12480 65 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f  e *pPtrPage;   /
12490 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
124a0 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
124b0 65 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f  er to pDbPage */
124c0 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20  .  Pgno iDbPage 
124d0 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b  = pDbPage->pgno;
124e0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
124f0 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a   = pBt->pPager;.
12500 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
12510 65 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52 4d  ert( eType==PTRM
12520 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20  AP_OVERFLOW2 || 
12530 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
12540 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20  ERFLOW1 || .    
12550 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f    eType==PTRMAP_
12560 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d  BTREE || eType==
12570 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
12580 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61  );..  /* Move pa
12590 67 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20  ge iDbPage from 
125a0 69 74 27 73 20 63 75 72 72 65 6e 74 20 6c 6f 63  it's current loc
125b0 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75  ation to page nu
125c0 6d 62 65 72 20 69 46 72 65 65 50 61 67 65 20 2a  mber iFreePage *
125d0 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55 54 4f  /.  TRACE(("AUTO
125e0 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25  VACUUM: Moving %
125f0 64 20 74 6f 20 66 72 65 65 20 70 61 67 65 20 25  d to free page %
12600 64 20 28 70 74 72 20 70 61 67 65 20 25 64 20 74  d (ptr page %d t
12610 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20  ype %d)\n", .   
12620 20 20 20 69 44 62 50 61 67 65 2c 20 69 46 72 65     iDbPage, iFre
12630 65 50 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c  ePage, iPtrPage,
12640 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d   eType));.  rc =
12650 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6d 6f   sqlite3pager_mo
12660 76 65 70 61 67 65 28 70 50 61 67 65 72 2c 20 70  vepage(pPager, p
12670 44 62 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69  DbPage->aData, i
12680 46 72 65 65 50 61 67 65 29 3b 0a 20 20 69 66 28  FreePage);.  if(
12690 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
126a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
126b0 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e  .  }.  pDbPage->
126c0 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65  pgno = iFreePage
126d0 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61  ;..  /* If pDbPa
126e0 67 65 20 77 61 73 20 61 20 62 74 72 65 65 2d 70  ge was a btree-p
126f0 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79  age, then it may
12700 20 68 61 76 65 20 63 68 69 6c 64 20 70 61 67 65   have child page
12710 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20  s and/or cells. 
12720 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74   ** that point t
12730 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
12740 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  . The pointer ma
12750 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c  p entries for al
12760 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67  l these.  ** pag
12770 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68  es need to be ch
12780 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  anged..  **.  **
12790 20 49 66 20 70 44 62 50 61 67 65 20 69 73 20 61   If pDbPage is a
127a0 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  n overflow page,
127b0 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   then the first 
127c0 34 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72  4 bytes may stor
127d0 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72  e a.  ** pointer
127e0 20 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74   to a subsequent
127f0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
12800 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
12810 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74  ase, then.  ** t
12820 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e  he pointer map n
12830 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74  eeds to be updat
12840 65 64 20 66 6f 72 20 74 68 65 20 73 75 62 73 65  ed for the subse
12850 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70  quent overflow p
12860 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  age..  */.  if( 
12870 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54  eType==PTRMAP_BT
12880 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  REE || eType==PT
12890 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
128a0 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69  .    rc = setChi
128b0 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50 61 67  ldPtrmaps(pDbPag
128c0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
128d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
128e0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
128f0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
12900 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d   Pgno nextOvfl =
12910 20 67 65 74 34 62 79 74 65 28 70 44 62 50 61 67   get4byte(pDbPag
12920 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69  e->aData);.    i
12930 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29  f( nextOvfl!=0 )
12940 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  {.      rc = ptr
12950 6d 61 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74  mapPut(pBt, next
12960 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45  Ovfl, PTRMAP_OVE
12970 52 46 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67  RFLOW2, iFreePag
12980 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
12990 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
129a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
129b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
129c0 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68    }..  /* Fix th
129d0 65 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74  e database point
129e0 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50  er on page iPtrP
129f0 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64  age that pointed
12a00 20 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20   at iDbPage so. 
12a10 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e   ** that it poin
12a20 74 73 20 61 74 20 69 46 72 65 65 50 61 67 65 2e  ts at iFreePage.
12a30 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f   Also fix the po
12a40 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
12a50 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67  for.  ** iPtrPag
12a60 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  e..  */.  if( eT
12a70 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype!=PTRMAP_ROOT
12a80 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  PAGE ){.    rc =
12a90 20 67 65 74 50 61 67 65 28 70 42 74 2c 20 69 50   getPage(pBt, iP
12aa0 74 72 50 61 67 65 2c 20 26 70 50 74 72 50 61 67  trPage, &pPtrPag
12ab0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
12ac0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12ad0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
12ae0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
12af0 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28  ite3pager_write(
12b00 70 50 74 72 50 61 67 65 2d 3e 61 44 61 74 61 29  pPtrPage->aData)
12b10 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
12b20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12b30 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74   releasePage(pPt
12b40 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65  rPage);.      re
12b50 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
12b60 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50 61     rc = modifyPa
12b70 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50 61  gePointer(pPtrPa
12b80 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46 72  ge, iDbPage, iFr
12b90 65 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b 0a  eePage, eType);.
12ba0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
12bb0 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69  pPtrPage);.    i
12bc0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
12bd0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
12be0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46  trmapPut(pBt, iF
12bf0 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20  reePage, eType, 
12c00 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 7d  iPtrPage);.    }
12c10 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
12c20 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
12c30 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71 75  declaration requ
12c40 69 72 65 64 20 62 79 20 61 75 74 6f 56 61 63 75  ired by autoVacu
12c50 75 6d 43 6f 6d 6d 69 74 28 29 2e 20 2a 2f 0a 73  umCommit(). */.s
12c60 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
12c70 74 65 50 61 67 65 28 42 74 53 68 61 72 65 64 20  tePage(BtShared 
12c80 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50  *, MemPage **, P
12c90 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29  gno *, Pgno, u8)
12ca0 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  ;../*.** This ro
12cb0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
12cc0 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33  prior to sqlite3
12cd0 70 61 67 65 72 5f 63 6f 6d 6d 69 74 20 77 68 65  pager_commit whe
12ce0 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  n a transaction.
12cf0 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 65 64 20 66  ** is commited f
12d00 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  or an auto-vacuu
12d10 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73  m database..*/.s
12d20 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61  tatic int autoVa
12d30 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61  cuumCommit(BtSha
12d40 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 2a  red *pBt, Pgno *
12d50 6e 54 72 75 6e 63 29 7b 0a 20 20 50 61 67 65 72  nTrunc){.  Pager
12d60 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e   *pPager = pBt->
12d70 70 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e  pPager;.  Pgno n
12d80 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20  FreeList;       
12d90 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
12da0 66 20 70 61 67 65 73 20 72 65 6d 61 69 6e 69 6e  f pages remainin
12db0 67 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  g on the free-li
12dc0 73 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 74  st. */.  int nPt
12dd0 72 4d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20  rMap;           
12de0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
12df0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
12e00 65 73 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 2a  es deallocated *
12e10 2f 0a 20 20 50 67 6e 6f 20 6f 72 69 67 53 69 7a  /.  Pgno origSiz
12e20 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
12e30 2a 20 50 61 67 65 73 20 69 6e 20 74 68 65 20 64  * Pages in the d
12e40 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
12e50 20 20 50 67 6e 6f 20 66 69 6e 53 69 7a 65 3b 20    Pgno finSize; 
12e60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12e70 50 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  Pages in the dat
12e80 61 62 61 73 65 20 66 69 6c 65 20 61 66 74 65 72  abase file after
12e90 20 74 72 75 6e 63 61 74 69 6f 6e 20 2a 2f 0a 20   truncation */. 
12ea0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
12eb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
12ec0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
12ed0 75 38 20 65 54 79 70 65 3b 0a 20 20 69 6e 74 20  u8 eType;.  int 
12ee0 70 67 73 7a 20 3d 20 70 42 74 2d 3e 70 61 67 65  pgsz = pBt->page
12ef0 53 69 7a 65 3b 20 20 2f 2a 20 50 61 67 65 20 73  Size;  /* Page s
12f00 69 7a 65 20 66 6f 72 20 74 68 69 73 20 64 61 74  ize for this dat
12f10 61 62 61 73 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  abase */.  Pgno 
12f20 69 44 62 50 61 67 65 3b 20 20 20 20 20 20 20 20  iDbPage;        
12f30 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
12f40 61 62 61 73 65 20 70 61 67 65 20 74 6f 20 6d 6f  abase page to mo
12f50 76 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ve */.  MemPage 
12f60 2a 70 44 62 4d 65 6d 50 61 67 65 20 3d 20 30 3b  *pDbMemPage = 0;
12f70 20 20 20 2f 2a 20 22 22 20 2a 2f 0a 20 20 50 67     /* "" */.  Pg
12f80 6e 6f 20 69 50 74 72 50 61 67 65 3b 20 20 20 20  no iPtrPage;    
12f90 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
12fa0 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
12fb0 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
12fc0 69 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  iDbPage */.  Pgn
12fd0 6f 20 69 46 72 65 65 50 61 67 65 3b 20 20 20 20  o iFreePage;    
12fe0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
12ff0 72 65 65 2d 6c 69 73 74 20 70 61 67 65 20 74 6f  ree-list page to
13000 20 6d 6f 76 65 20 69 44 62 50 61 67 65 20 74 6f   move iDbPage to
13010 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
13020 46 72 65 65 4d 65 6d 50 61 67 65 20 3d 20 30 3b  FreeMemPage = 0;
13030 20 2f 2a 20 22 22 20 2a 2f 0a 0a 23 69 66 6e 64   /* "" */..#ifnd
13040 65 66 20 4e 44 45 42 55 47 0a 20 20 69 6e 74 20  ef NDEBUG.  int 
13050 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 70 61  nRef = sqlite3pa
13060 67 65 72 5f 72 65 66 63 6f 75 6e 74 28 70 50 61  ger_refcount(pPa
13070 67 65 72 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ger);.#endif..  
13080 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
13090 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28  oVacuum );.  if(
130a0 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
130b0 42 74 2c 20 73 71 6c 69 74 65 33 70 61 67 65 72  Bt, sqlite3pager
130c0 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  _pagecount(pPage
130d0 72 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  r)) ){.    retur
130e0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
130f0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
13100 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
13110 6d 61 6e 79 20 66 72 65 65 2d 70 61 67 65 73 20  many free-pages 
13120 61 72 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  are in the datab
13130 61 73 65 2e 20 49 66 20 74 68 65 72 65 20 61 72  ase. If there ar
13140 65 20 6e 6f 0a 20 20 2a 2a 20 66 72 65 65 20 70  e no.  ** free p
13150 61 67 65 73 2c 20 74 68 65 6e 20 61 75 74 6f 2d  ages, then auto-
13160 76 61 63 75 75 6d 20 69 73 20 61 20 6e 6f 2d 6f  vacuum is a no-o
13170 70 2e 0a 20 20 2a 2f 0a 20 20 6e 46 72 65 65 4c  p..  */.  nFreeL
13180 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28 26  ist = get4byte(&
13190 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
131a0 74 61 5b 33 36 5d 29 3b 0a 20 20 69 66 28 20 6e  ta[36]);.  if( n
131b0 46 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  FreeList==0 ){. 
131c0 20 20 20 2a 6e 54 72 75 6e 63 20 3d 20 30 3b 0a     *nTrunc = 0;.
131d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
131e0 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
131f0 54 68 69 73 20 62 6c 6f 63 6b 20 66 69 67 75 72  This block figur
13200 65 73 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  es out how many 
13210 70 61 67 65 73 20 74 68 65 72 65 20 61 72 65 20  pages there are 
13220 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  in the database.
13230 20 20 2a 2a 20 6e 6f 77 20 28 76 61 72 69 61 62    ** now (variab
13240 6c 65 20 6f 72 69 67 53 69 7a 65 29 2c 20 61 6e  le origSize), an
13250 64 20 68 6f 77 20 6d 61 6e 79 20 74 68 65 72 65  d how many there
13260 20 77 69 6c 6c 20 62 65 20 61 66 74 65 72 20 74   will be after t
13270 68 65 0a 20 20 2a 2a 20 74 72 75 6e 63 61 74 69  he.  ** truncati
13280 6f 6e 20 28 76 61 72 69 61 62 6c 65 20 66 69 6e  on (variable fin
13290 53 69 7a 65 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  Size)..  **.  **
132a0 20 54 68 65 20 66 69 6e 61 6c 20 73 69 7a 65 20   The final size 
132b0 69 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  is the original 
132c0 73 69 7a 65 2c 20 6c 65 73 73 20 74 68 65 20 6e  size, less the n
132d0 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 70 61  umber of free pa
132e0 67 65 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ges.  ** in the 
132f0 64 61 74 61 62 61 73 65 2c 20 6c 65 73 73 20 61  database, less a
13300 6e 79 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  ny pointer-map p
13310 61 67 65 73 20 74 68 61 74 20 77 69 6c 6c 20 6e  ages that will n
13320 6f 20 6c 6f 6e 67 65 72 0a 20 20 2a 2a 20 62 65  o longer.  ** be
13330 20 72 65 71 75 69 72 65 64 2c 20 6c 65 73 73 20   required, less 
13340 31 20 69 66 20 74 68 65 20 70 65 6e 64 69 6e 67  1 if the pending
13350 2d 62 79 74 65 20 70 61 67 65 20 77 61 73 20 70  -byte page was p
13360 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  art of the datab
13370 61 73 65 0a 20 20 2a 2a 20 62 75 74 20 69 73 20  ase.  ** but is 
13380 6e 6f 74 20 61 66 74 65 72 20 74 68 65 20 74 72  not after the tr
13390 75 6e 63 61 74 69 6f 6e 2e 0a 20 20 2a 2a 2f 0a  uncation..  **/.
133a0 20 20 6f 72 69 67 53 69 7a 65 20 3d 20 73 71 6c    origSize = sql
133b0 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f  ite3pager_pageco
133c0 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  unt(pPager);.  i
133d0 66 28 20 6f 72 69 67 53 69 7a 65 3d 3d 50 45 4e  f( origSize==PEN
133e0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
133f0 42 74 29 20 29 7b 0a 20 20 20 20 6f 72 69 67 53  Bt) ){.    origS
13400 69 7a 65 2d 2d 3b 0a 20 20 7d 0a 20 20 6e 50 74  ize--;.  }.  nPt
13410 72 4d 61 70 20 3d 20 28 6e 46 72 65 65 4c 69 73  rMap = (nFreeLis
13420 74 2d 6f 72 69 67 53 69 7a 65 2b 50 54 52 4d 41  t-origSize+PTRMA
13430 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6f 72  P_PAGENO(pBt, or
13440 69 67 53 69 7a 65 29 2b 70 67 73 7a 2f 35 29 2f  igSize)+pgsz/5)/
13450 28 70 67 73 7a 2f 35 29 3b 0a 20 20 66 69 6e 53  (pgsz/5);.  finS
13460 69 7a 65 20 3d 20 6f 72 69 67 53 69 7a 65 20 2d  ize = origSize -
13470 20 6e 46 72 65 65 4c 69 73 74 20 2d 20 6e 50 74   nFreeList - nPt
13480 72 4d 61 70 3b 0a 20 20 69 66 28 20 6f 72 69 67  rMap;.  if( orig
13490 53 69 7a 65 3e 50 45 4e 44 49 4e 47 5f 42 59 54  Size>PENDING_BYT
134a0 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20 66  E_PAGE(pBt) && f
134b0 69 6e 53 69 7a 65 3c 3d 50 45 4e 44 49 4e 47 5f  inSize<=PENDING_
134c0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
134d0 7b 0a 20 20 20 20 66 69 6e 53 69 7a 65 2d 2d 3b  {.    finSize--;
134e0 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 50 54  .  }.  while( PT
134f0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
13500 20 66 69 6e 53 69 7a 65 29 20 7c 7c 20 66 69 6e   finSize) || fin
13510 53 69 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Size==PENDING_BY
13520 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
13530 20 20 20 20 66 69 6e 53 69 7a 65 2d 2d 3b 0a 20      finSize--;. 
13540 20 7d 0a 20 20 54 52 41 43 45 28 28 22 41 55 54   }.  TRACE(("AUT
13550 4f 56 41 43 55 55 4d 3a 20 42 65 67 69 6e 20 28  OVACUUM: Begin (
13560 64 62 20 73 69 7a 65 20 25 64 2d 3e 25 64 29 5c  db size %d->%d)\
13570 6e 22 2c 20 6f 72 69 67 53 69 7a 65 2c 20 66 69  n", origSize, fi
13580 6e 53 69 7a 65 29 29 3b 0a 0a 20 20 2f 2a 20 56  nSize));..  /* V
13590 61 72 69 61 62 6c 65 20 27 66 69 6e 53 69 7a 65  ariable 'finSize
135a0 27 20 77 69 6c 6c 20 62 65 20 74 68 65 20 73 69  ' will be the si
135b0 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ze of the file i
135c0 6e 20 70 61 67 65 73 20 61 66 74 65 72 0a 20 20  n pages after.  
135d0 2a 2a 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  ** the auto-vacu
135e0 75 6d 20 68 61 73 20 63 6f 6d 70 6c 65 74 65 64  um has completed
135f0 20 28 74 68 65 20 63 75 72 72 65 6e 74 20 66 69   (the current fi
13600 6c 65 20 73 69 7a 65 20 6d 69 6e 75 73 20 74 68  le size minus th
13610 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66  e number.  ** of
13620 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
13630 65 65 20 6c 69 73 74 29 2e 20 4c 6f 6f 70 20 74  ee list). Loop t
13640 68 72 6f 75 67 68 20 74 68 65 20 70 61 67 65 73  hrough the pages
13650 20 74 68 61 74 20 6c 69 65 20 62 65 79 6f 6e 64   that lie beyond
13660 0a 20 20 2a 2a 20 74 68 69 73 20 6d 61 72 6b 2c  .  ** this mark,
13670 20 61 6e 64 20 69 66 20 74 68 65 79 20 61 72 65   and if they are
13680 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 6e 20   not already on 
13690 74 68 65 20 66 72 65 65 20 6c 69 73 74 2c 20 6d  the free list, m
136a0 6f 76 65 20 74 68 65 6d 0a 20 20 2a 2a 20 74 6f  ove them.  ** to
136b0 20 61 20 66 72 65 65 20 70 61 67 65 20 65 61 72   a free page ear
136c0 6c 69 65 72 20 69 6e 20 74 68 65 20 66 69 6c 65  lier in the file
136d0 20 28 73 6f 6d 65 77 68 65 72 65 20 62 65 66 6f   (somewhere befo
136e0 72 65 20 66 69 6e 53 69 7a 65 29 2e 0a 20 20 2a  re finSize)..  *
136f0 2f 0a 20 20 66 6f 72 28 20 69 44 62 50 61 67 65  /.  for( iDbPage
13700 3d 66 69 6e 53 69 7a 65 2b 31 3b 20 69 44 62 50  =finSize+1; iDbP
13710 61 67 65 3c 3d 6f 72 69 67 53 69 7a 65 3b 20 69  age<=origSize; i
13720 44 62 50 61 67 65 2b 2b 20 29 7b 0a 20 20 20 20  DbPage++ ){.    
13730 2f 2a 20 49 66 20 69 44 62 50 61 67 65 20 69 73  /* If iDbPage is
13740 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70   a pointer map p
13750 61 67 65 2c 20 6f 72 20 74 68 65 20 70 65 6e 64  age, or the pend
13760 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2c 20 73  ing-byte page, s
13770 6b 69 70 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69  kip it. */.    i
13780 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  f( PTRMAP_ISPAGE
13790 28 70 42 74 2c 20 69 44 62 50 61 67 65 29 20 7c  (pBt, iDbPage) |
137a0 7c 20 69 44 62 50 61 67 65 3d 3d 50 45 4e 44 49  | iDbPage==PENDI
137b0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
137c0 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69  ) ){.      conti
137d0 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  nue;.    }..    
137e0 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
137f0 42 74 2c 20 69 44 62 50 61 67 65 2c 20 26 65 54  Bt, iDbPage, &eT
13800 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b  ype, &iPtrPage);
13810 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
13820 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 75  ITE_OK ) goto au
13830 74 6f 76 61 63 75 75 6d 5f 6f 75 74 3b 0a 20 20  tovacuum_out;.  
13840 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
13850 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
13860 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
13870 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
13880 20 20 20 20 20 20 67 6f 74 6f 20 61 75 74 6f 76        goto autov
13890 61 63 75 75 6d 5f 6f 75 74 3b 0a 20 20 20 20 7d  acuum_out;.    }
138a0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 69 44 62 50  ..    /* If iDbP
138b0 61 67 65 20 69 73 20 66 72 65 65 2c 20 64 6f 20  age is free, do 
138c0 6e 6f 74 20 73 77 61 70 20 69 74 2e 20 20 2a 2f  not swap it.  */
138d0 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d  .    if( eType==
138e0 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
138f0 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  ){.      continu
13900 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  e;.    }.    rc 
13910 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c 20 69  = getPage(pBt, i
13920 44 62 50 61 67 65 2c 20 26 70 44 62 4d 65 6d 50  DbPage, &pDbMemP
13930 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
13940 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
13950 74 6f 20 61 75 74 6f 76 61 63 75 75 6d 5f 6f 75  to autovacuum_ou
13960 74 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20  t;..    /* Find 
13970 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
13980 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 74   the free-list t
13990 68 61 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  hat is not alrea
139a0 64 79 20 61 74 20 74 68 65 20 65 6e 64 20 0a 20  dy at the end . 
139b0 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c     ** of the fil
139c0 65 2e 20 41 20 70 61 67 65 20 63 61 6e 20 62 65  e. A page can be
139d0 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20   pulled off the 
139e0 66 72 65 65 20 6c 69 73 74 20 75 73 69 6e 67 20  free list using 
139f0 74 68 65 20 0a 20 20 20 20 2a 2a 20 61 6c 6c 6f  the .    ** allo
13a00 63 61 74 65 50 61 67 65 28 29 20 72 6f 75 74 69  catePage() routi
13a10 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  ne..    */.    d
13a20 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46 72  o{.      if( pFr
13a30 65 65 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20 20  eeMemPage ){.   
13a40 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
13a50 28 70 46 72 65 65 4d 65 6d 50 61 67 65 29 3b 0a  (pFreeMemPage);.
13a60 20 20 20 20 20 20 20 20 70 46 72 65 65 4d 65 6d          pFreeMem
13a70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Page = 0;.      
13a80 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c  }.      rc = all
13a90 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 26  ocatePage(pBt, &
13aa0 70 46 72 65 65 4d 65 6d 50 61 67 65 2c 20 26 69  pFreeMemPage, &i
13ab0 46 72 65 65 50 61 67 65 2c 20 30 2c 20 30 29 3b  FreePage, 0, 0);
13ac0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
13ad0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13ae0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
13af0 70 44 62 4d 65 6d 50 61 67 65 29 3b 0a 20 20 20  pDbMemPage);.   
13b00 20 20 20 20 20 67 6f 74 6f 20 61 75 74 6f 76 61       goto autova
13b10 63 75 75 6d 5f 6f 75 74 3b 0a 20 20 20 20 20 20  cuum_out;.      
13b20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
13b30 69 46 72 65 65 50 61 67 65 3c 3d 6f 72 69 67 53  iFreePage<=origS
13b40 69 7a 65 20 29 3b 0a 20 20 20 20 7d 77 68 69 6c  ize );.    }whil
13b50 65 28 20 69 46 72 65 65 50 61 67 65 3e 66 69 6e  e( iFreePage>fin
13b60 53 69 7a 65 20 29 3b 0a 20 20 20 20 72 65 6c 65  Size );.    rele
13b70 61 73 65 50 61 67 65 28 70 46 72 65 65 4d 65 6d  asePage(pFreeMem
13b80 50 61 67 65 29 3b 0a 20 20 20 20 70 46 72 65 65  Page);.    pFree
13b90 4d 65 6d 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20  MemPage = 0;..  
13ba0 20 20 2f 2a 20 52 65 6c 6f 63 61 74 65 20 74 68    /* Relocate th
13bb0 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  e page into the 
13bc0 62 6f 64 79 20 6f 66 20 74 68 65 20 66 69 6c 65  body of the file
13bd0 2e 20 4e 6f 74 65 20 74 68 61 74 20 61 6c 74 68  . Note that alth
13be0 6f 75 67 68 20 74 68 65 20 0a 20 20 20 20 2a 2a  ough the .    **
13bf0 20 70 61 67 65 20 68 61 73 20 6d 6f 76 65 64 20   page has moved 
13c00 77 69 74 68 69 6e 20 74 68 65 20 64 61 74 61 62  within the datab
13c10 61 73 65 20 66 69 6c 65 2c 20 74 68 65 20 70 44  ase file, the pD
13c20 62 4d 65 6d 50 61 67 65 20 70 6f 69 6e 74 65 72  bMemPage pointer
13c30 20 0a 20 20 20 20 2a 2a 20 72 65 6d 61 69 6e 73   .    ** remains
13c40 20 76 61 6c 69 64 2e 20 54 68 69 73 20 6d 65 61   valid. This mea
13c50 6e 73 20 74 68 61 74 20 74 68 69 73 20 66 75 6e  ns that this fun
13c60 63 74 69 6f 6e 20 63 61 6e 20 72 75 6e 20 77 69  ction can run wi
13c70 74 68 6f 75 74 0a 20 20 20 20 2a 2a 20 69 6e 76  thout.    ** inv
13c80 61 6c 69 64 61 74 69 6e 67 20 63 75 72 73 6f 72  alidating cursor
13c90 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74  s open on the bt
13ca0 72 65 65 2e 20 54 68 69 73 20 69 73 20 69 6d 70  ree. This is imp
13cb0 6f 72 74 61 6e 74 20 69 6e 20 0a 20 20 20 20 2a  ortant in .    *
13cc0 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d  * shared-cache m
13cd0 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ode..    */.    
13ce0 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67  rc = relocatePag
13cf0 65 28 70 42 74 2c 20 70 44 62 4d 65 6d 50 61 67  e(pBt, pDbMemPag
13d00 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61  e, eType, iPtrPa
13d10 67 65 2c 20 69 46 72 65 65 50 61 67 65 29 3b 0a  ge, iFreePage);.
13d20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
13d30 70 44 62 4d 65 6d 50 61 67 65 29 3b 0a 20 20 20  pDbMemPage);.   
13d40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13d50 4f 4b 20 29 20 67 6f 74 6f 20 61 75 74 6f 76 61  OK ) goto autova
13d60 63 75 75 6d 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  cuum_out;.  }.. 
13d70 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20 66   /* The entire f
13d80 72 65 65 2d 6c 69 73 74 20 68 61 73 20 62 65 65  ree-list has bee
13d90 6e 20 73 77 61 70 70 65 64 20 74 6f 20 74 68 65  n swapped to the
13da0 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
13db0 2e 20 53 6f 0a 20 20 2a 2a 20 74 72 75 6e 63 61  . So.  ** trunca
13dc0 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
13dd0 66 69 6c 65 20 74 6f 20 66 69 6e 53 69 7a 65 20  file to finSize 
13de0 70 61 67 65 73 20 61 6e 64 20 63 6f 6e 73 69 64  pages and consid
13df0 65 72 20 74 68 65 0a 20 20 2a 2a 20 66 72 65 65  er the.  ** free
13e00 2d 6c 69 73 74 20 65 6d 70 74 79 2e 0a 20 20 2a  -list empty..  *
13e10 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
13e20 70 61 67 65 72 5f 77 72 69 74 65 28 70 42 74 2d  pager_write(pBt-
13e30 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b  >pPage1->aData);
13e40 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
13e50 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 75 74 6f  E_OK ) goto auto
13e60 76 61 63 75 75 6d 5f 6f 75 74 3b 0a 20 20 70 75  vacuum_out;.  pu
13e70 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
13e80 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
13e90 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  0);.  put4byte(&
13ea0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
13eb0 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 2a 6e  ta[36], 0);.  *n
13ec0 54 72 75 6e 63 20 3d 20 66 69 6e 53 69 7a 65 3b  Trunc = finSize;
13ed0 0a 20 20 61 73 73 65 72 74 28 20 66 69 6e 53 69  .  assert( finSi
13ee0 7a 65 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ze!=PENDING_BYTE
13ef0 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 61  _PAGE(pBt) );..a
13f00 75 74 6f 76 61 63 75 75 6d 5f 6f 75 74 3a 0a 20  utovacuum_out:. 
13f10 20 61 73 73 65 72 74 28 20 6e 52 65 66 3d 3d 73   assert( nRef==s
13f20 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65 66 63  qlite3pager_refc
13f30 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a  ount(pPager) );.
13f40 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
13f50 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
13f60 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  e3pager_rollback
13f70 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
13f80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
13f90 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  dif../*.** Commi
13fa0 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
13fb0 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70  n currently in p
13fc0 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  rogress..**.** T
13fd0 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  his will release
13fe0 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
13ff0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
14000 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a  file.  If there.
14010 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
14020 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73   cursors, it als
14030 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72  o releases the r
14040 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74  ead lock..*/.int
14050 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
14060 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  mit(Btree *p){. 
14070 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
14080 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 62 74 72 65   p->pBt;..  btre
14090 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a  eIntegrity(p);..
140a0 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64    /* If the hand
140b0 6c 65 20 68 61 73 20 61 20 77 72 69 74 65 2d 74  le has a write-t
140c0 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c  ransaction open,
140d0 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72   commit the shar
140e0 65 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20  ed-btrees .  ** 
140f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
14100 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73  set the shared s
14110 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45  tate to TRANS_RE
14120 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  AD..  */.  if( p
14130 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
14140 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e  _WRITE ){.    in
14150 74 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74  t rc;.    assert
14160 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
14170 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
14180 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
14190 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
141a0 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  on>0 );.    rc =
141b0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6f   sqlite3pager_co
141c0 6d 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72  mmit(pBt->pPager
141d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
141e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
141f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
14200 20 7d 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72   }.    pBt->inTr
14210 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
14220 53 5f 52 45 41 44 3b 0a 20 20 20 20 70 42 74 2d  S_READ;.    pBt-
14230 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d  >inStmt = 0;.  }
14240 0a 20 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c  .  unlockAllTabl
14250 65 73 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  es(p);..  /* If 
14260 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61  the handle has a
14270 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73  ny kind of trans
14280 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63  action open, dec
14290 72 65 6d 65 6e 74 20 74 68 65 20 74 72 61 6e 73  rement the trans
142a0 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 63 6f 75 6e  action.  ** coun
142b0 74 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20  t of the shared 
142c0 62 74 72 65 65 2e 20 49 66 20 74 68 65 20 74 72  btree. If the tr
142d0 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20  ansaction count 
142e0 72 65 61 63 68 65 73 20 30 2c 20 73 65 74 0a 20  reaches 0, set. 
142f0 20 2a 2a 20 74 68 65 20 73 68 61 72 65 64 20 73   ** the shared s
14300 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f  tate to TRANS_NO
14310 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74  NE. The unlockBt
14320 72 65 65 49 66 55 6e 75 73 65 64 28 29 20 63 61  reeIfUnused() ca
14330 6c 6c 20 62 65 6c 6f 77 0a 20 20 2a 2a 20 77 69  ll below.  ** wi
14340 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61  ll unlock the pa
14350 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ger..  */.  if( 
14360 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  p->inTrans!=TRAN
14370 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 70 42  S_NONE ){.    pB
14380 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d  t->nTransaction-
14390 2d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 70 42  -;.    if( 0==pB
143a0 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  t->nTransaction 
143b0 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  ){.      pBt->in
143c0 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
143d0 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ANS_NONE;.    }.
143e0 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
143f0 65 20 68 61 6e 64 6c 65 73 20 63 75 72 72 65 6e  e handles curren
14400 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74  t transaction st
14410 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e  ate to TRANS_NON
14420 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 0a 20 20 2a  E and unlock.  *
14430 2a 20 74 68 65 20 70 61 67 65 72 20 69 66 20 74  * the pager if t
14440 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20  his call closed 
14450 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72  the only read or
14460 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
14470 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69 6e  on..  */.  p->in
14480 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f  Trans = TRANS_NO
14490 4e 45 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65  NE;.  unlockBtre
144a0 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
144b0 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
144c0 79 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  y(p);.  return S
144d0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
144e0 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a  ndef NDEBUG./*.*
144f0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
14500 62 65 72 20 6f 66 20 77 72 69 74 65 2d 63 75 72  ber of write-cur
14510 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69  sors open on thi
14520 73 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20 69  s handle. This i
14530 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20  s for use.** in 
14540 61 73 73 65 72 74 28 29 20 65 78 70 72 65 73 73  assert() express
14550 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f  ions, so it is o
14560 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20  nly compiled if 
14570 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a  NDEBUG is not.**
14580 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61   defined..*/.sta
14590 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 57 72 69  tic int countWri
145a0 74 65 43 75 72 73 6f 72 73 28 42 74 53 68 61 72  teCursors(BtShar
145b0 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75  ed *pBt){.  BtCu
145c0 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e  rsor *pCur;.  in
145d0 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  t r = 0;.  for(p
145e0 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  Cur=pBt->pCursor
145f0 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75  ; pCur; pCur=pCu
14600 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  r->pNext){.    i
14610 66 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20  f( pCur->wrFlag 
14620 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65  ) r++; .  }.  re
14630 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66  turn r;.}.#endif
14640 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
14650 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65  LITE_TEST) || de
14660 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
14670 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  UG)./*.** Print 
14680 64 65 62 75 67 67 69 6e 67 20 69 6e 66 6f 72 6d  debugging inform
14690 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20  ation about all 
146a0 63 75 72 73 6f 72 73 20 74 6f 20 73 74 61 6e 64  cursors to stand
146b0 61 72 64 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 76  ard output..*/.v
146c0 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
146d0 43 75 72 73 6f 72 4c 69 73 74 28 42 74 72 65 65  CursorList(Btree
146e0 20 2a 70 29 7b 0a 20 20 42 74 43 75 72 73 6f 72   *p){.  BtCursor
146f0 20 2a 70 43 75 72 3b 0a 20 20 42 74 53 68 61 72   *pCur;.  BtShar
14700 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
14710 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74  ;.  for(pCur=pBt
14720 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b  ->pCursor; pCur;
14730 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78   pCur=pCur->pNex
14740 74 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  t){.    MemPage 
14750 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70  *pPage = pCur->p
14760 50 61 67 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  Page;.    char *
14770 7a 4d 6f 64 65 20 3d 20 70 43 75 72 2d 3e 77 72  zMode = pCur->wr
14780 46 6c 61 67 20 3f 20 22 72 77 22 20 3a 20 22 72  Flag ? "rw" : "r
14790 6f 22 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  o";.    sqlite3D
147a0 65 62 75 67 50 72 69 6e 74 66 28 22 43 55 52 53  ebugPrintf("CURS
147b0 4f 52 20 25 70 20 72 6f 6f 74 65 64 20 61 74 20  OR %p rooted at 
147c0 25 34 64 28 25 73 29 20 63 75 72 72 65 6e 74 6c  %4d(%s) currentl
147d0 79 20 61 74 20 25 64 2e 25 64 25 73 5c 6e 22 2c  y at %d.%d%s\n",
147e0 0a 20 20 20 20 20 20 20 70 43 75 72 2c 20 70 43  .       pCur, pC
147f0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 7a 4d  ur->pgnoRoot, zM
14800 6f 64 65 2c 0a 20 20 20 20 20 20 20 70 50 61 67  ode,.       pPag
14810 65 20 3f 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20  e ? pPage->pgno 
14820 3a 20 30 2c 20 70 43 75 72 2d 3e 69 64 78 2c 0a  : 0, pCur->idx,.
14830 20 20 20 20 20 20 20 28 70 43 75 72 2d 3e 65 53         (pCur->eS
14840 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
14850 49 44 29 20 3f 20 22 22 20 3a 20 22 20 65 6f 66  ID) ? "" : " eof
14860 22 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23  ".    );.  }.}.#
14870 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  endif../*.** Rol
14880 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
14890 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73  ction in progres
148a0 73 2e 20 20 41 6c 6c 20 63 75 72 73 6f 72 73 20  s.  All cursors 
148b0 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76 61 6c  will be.** inval
148c0 69 64 65 64 20 62 79 20 74 68 69 73 20 6f 70 65  ided by this ope
148d0 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74  ration.  Any att
148e0 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 63 75  empt to use a cu
148f0 72 73 6f 72 0a 2a 2a 20 74 68 61 74 20 77 61 73  rsor.** that was
14900 20 6f 70 65 6e 20 61 74 20 74 68 65 20 62 65 67   open at the beg
14910 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73 20 6f  inning of this o
14920 70 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20 72 65  peration will re
14930 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 65 72  sult.** in an er
14940 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ror..**.** This 
14950 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65  will release the
14960 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74   write lock on t
14970 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
14980 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61  .  If there.** a
14990 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72  re no active cur
149a0 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65  sors, it also re
149b0 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20  leases the read 
149c0 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lock..*/.int sql
149d0 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
149e0 6b 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  k(Btree *p){.  i
149f0 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
14a00 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
14a10 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
14a20 65 31 3b 0a 0a 20 20 72 63 20 3d 20 73 61 76 65  e1;..  rc = save
14a30 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
14a40 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53  0, 0);.#ifndef S
14a50 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
14a60 44 5f 43 41 43 48 45 0a 20 20 69 66 28 20 72 63  D_CACHE.  if( rc
14a70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
14a80 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20     /* This is a 
14a90 68 6f 72 72 69 62 6c 65 20 73 69 74 75 61 74 69  horrible situati
14aa0 6f 6e 2e 20 41 6e 20 49 4f 20 6f 72 20 6d 61 6c  on. An IO or mal
14ab0 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75  loc() error occu
14ac0 72 65 64 20 77 68 69 6c 73 74 0a 20 20 20 20 2a  red whilst.    *
14ad0 2a 20 74 72 79 69 6e 67 20 74 6f 20 73 61 76 65  * trying to save
14ae0 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
14af0 73 2e 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  s. If this is an
14b00 20 61 75 74 6f 6d 61 74 69 63 20 72 6f 6c 6c 62   automatic rollb
14b10 61 63 6b 20 28 61 73 0a 20 20 20 20 2a 2a 20 74  ack (as.    ** t
14b20 68 65 20 72 65 73 75 6c 74 20 6f 66 20 61 20 63  he result of a c
14b30 6f 6e 73 74 72 61 69 6e 74 2c 20 6d 61 6c 6c 6f  onstraint, mallo
14b40 63 28 29 20 66 61 69 6c 75 72 65 20 6f 72 20 49  c() failure or I
14b50 4f 20 65 72 72 6f 72 29 20 74 68 65 6e 20 0a 20  O error) then . 
14b60 20 20 20 2a 2a 20 74 68 65 20 63 61 63 68 65 20     ** the cache 
14b70 6d 61 79 20 62 65 20 69 6e 74 65 72 6e 61 6c 6c  may be internall
14b80 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 28  y inconsistent (
14b90 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 76 61 6c 69  not contain vali
14ba0 64 20 74 72 65 65 73 29 20 73 6f 0a 20 20 20 20  d trees) so.    
14bb0 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 73 69 6d  ** we cannot sim
14bc0 70 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 65  ply return the e
14bd0 72 72 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c  rror to the call
14be0 65 72 2e 20 49 6e 73 74 65 61 64 2c 20 61 62 6f  er. Instead, abo
14bf0 72 74 20 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 71  rt .    ** all q
14c00 75 65 72 69 65 73 20 74 68 61 74 20 6d 61 79 20  ueries that may 
14c10 62 65 20 75 73 69 6e 67 20 61 6e 79 20 6f 66 20  be using any of 
14c20 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74  the cursors that
14c30 20 66 61 69 6c 65 64 20 74 6f 20 73 61 76 65 2e   failed to save.
14c40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c  .    */.    whil
14c50 65 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  e( pBt->pCursor 
14c60 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
14c70 20 2a 64 62 20 3d 20 70 42 74 2d 3e 70 43 75 72   *db = pBt->pCur
14c80 73 6f 72 2d 3e 70 42 74 72 65 65 2d 3e 70 53 71  sor->pBtree->pSq
14c90 6c 69 74 65 3b 0a 20 20 20 20 20 20 69 66 28 20  lite;.      if( 
14ca0 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  db ){.        sq
14cb0 6c 69 74 65 33 41 62 6f 72 74 4f 74 68 65 72 41  lite3AbortOtherA
14cc0 63 74 69 76 65 56 64 62 65 73 28 64 62 2c 20 30  ctiveVdbes(db, 0
14cd0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
14ce0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 62 74  .  }.#endif.  bt
14cf0 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
14d00 0a 20 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c  .  unlockAllTabl
14d10 65 73 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d  es(p);..  if( p-
14d20 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
14d30 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74  WRITE ){.    int
14d40 20 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65 72   rc2;..    asser
14d50 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d  t( TRANS_WRITE==
14d60 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
14d70 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20  on );.    rc2 = 
14d80 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
14d90 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65  lback(pBt->pPage
14da0 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21  r);.    if( rc2!
14db0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14dc0 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
14dd0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
14de0 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76  rollback may hav
14df0 65 20 64 65 73 74 72 6f 79 65 64 20 74 68 65 20  e destroyed the 
14e00 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61  pPage1->aData va
14e10 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20  lue.  So.    ** 
14e20 63 61 6c 6c 20 67 65 74 50 61 67 65 28 29 20 6f  call getPage() o
14e30 6e 20 70 61 67 65 20 31 20 61 67 61 69 6e 20 74  n page 1 again t
14e40 6f 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67  o make sure pPag
14e50 65 31 2d 3e 61 44 61 74 61 20 69 73 0a 20 20 20  e1->aData is.   
14e60 20 2a 2a 20 73 65 74 20 63 6f 72 72 65 63 74 6c   ** set correctl
14e70 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65  y. */.    if( ge
14e80 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70  tPage(pBt, 1, &p
14e90 50 61 67 65 31 29 3d 3d 53 51 4c 49 54 45 5f 4f  Page1)==SQLITE_O
14ea0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
14eb0 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
14ec0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
14ed0 28 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73  ( countWriteCurs
14ee0 6f 72 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20  ors(pBt)==0 );. 
14ef0 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
14f00 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45  ction = TRANS_RE
14f10 41 44 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  AD;.  }..  if( p
14f20 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
14f30 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 61 73 73  _NONE ){.    ass
14f40 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73  ert( pBt->nTrans
14f50 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20  action>0 );.    
14f60 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
14f70 6e 2d 2d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  n--;.    if( 0==
14f80 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
14f90 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  n ){.      pBt->
14fa0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
14fb0 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20  TRANS_NONE;.    
14fc0 7d 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 6e 54 72  }.  }..  p->inTr
14fd0 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
14fe0 3b 0a 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20  ;.  pBt->inStmt 
14ff0 3d 20 30 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72  = 0;.  unlockBtr
15000 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
15010 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ..  btreeIntegri
15020 74 79 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ty(p);.  return 
15030 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61  rc;.}../*.** Sta
15040 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73  rt a statement s
15050 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  ubtransaction.  
15060 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69  The subtransacti
15070 6f 6e 20 63 61 6e 0a 2a 2a 20 63 61 6e 20 62 65  on can.** can be
15080 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 64   rolled back ind
15090 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68  ependently of th
150a0 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69  e main transacti
150b0 6f 6e 2e 0a 2a 2a 20 59 6f 75 20 6d 75 73 74 20  on..** You must 
150c0 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74  start a transact
150d0 69 6f 6e 20 62 65 66 6f 72 65 20 73 74 61 72 74  ion before start
150e0 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61 63  ing a subtransac
150f0 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 73 75 62  tion..** The sub
15100 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65  transaction is e
15110 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  nded automatical
15120 6c 79 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74  ly if the main t
15130 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 63 6f  ransaction.** co
15140 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62  mmits or rolls b
15150 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  ack..**.** Only 
15160 6f 6e 65 20 73 75 62 74 72 61 6e 73 61 63 74 69  one subtransacti
15170 6f 6e 20 6d 61 79 20 62 65 20 61 63 74 69 76 65  on may be active
15180 20 61 74 20 61 20 74 69 6d 65 2e 20 20 49 74 20   at a time.  It 
15190 69 73 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 74  is an error to t
151a0 72 79 0a 2a 2a 20 74 6f 20 73 74 61 72 74 20 61  ry.** to start a
151b0 20 6e 65 77 20 73 75 62 74 72 61 6e 73 61 63 74   new subtransact
151c0 69 6f 6e 20 69 66 20 61 6e 6f 74 68 65 72 20 73  ion if another s
151d0 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  ubtransaction is
151e0 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e   already active.
151f0 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74  .**.** Statement
15200 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73   subtransactions
15210 20 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64   are used around
15220 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20   individual SQL 
15230 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68  statements.** th
15240 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64  at are contained
15250 20 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e   within a BEGIN.
15260 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20  ..COMMIT block. 
15270 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74   If a constraint
15280 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73  .** error occurs
15290 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74   within the stat
152a0 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63  ement, the effec
152b0 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74  t of that one st
152c0 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62  atement.** can b
152d0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69  e rolled back wi
152e0 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
152f0 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74  rollback the ent
15300 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ire transaction.
15310 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
15320 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74  treeBeginStmt(Bt
15330 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
15340 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
15350 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
15360 66 28 20 28 70 2d 3e 69 6e 54 72 61 6e 73 21 3d  f( (p->inTrans!=
15370 54 52 41 4e 53 5f 57 52 49 54 45 29 20 7c 7c 20  TRANS_WRITE) || 
15380 70 42 74 2d 3e 69 6e 53 74 6d 74 20 29 7b 0a 20  pBt->inStmt ){. 
15390 20 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 72     return pBt->r
153a0 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45  eadOnly ? SQLITE
153b0 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49  _READONLY : SQLI
153c0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
153d0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
153e0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
153f0 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 72 63 20  S_WRITE );.  rc 
15400 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  = pBt->readOnly 
15410 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71  ? SQLITE_OK : sq
15420 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f  lite3pager_stmt_
15430 62 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65  begin(pBt->pPage
15440 72 29 3b 0a 20 20 70 42 74 2d 3e 69 6e 53 74 6d  r);.  pBt->inStm
15450 74 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  t = 1;.  return 
15460 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f  rc;.}.../*.** Co
15470 6d 6d 69 74 20 74 68 65 20 73 74 61 74 6d 65 6e  mmit the statmen
15480 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  t subtransaction
15490 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72   currently in pr
154a0 6f 67 72 65 73 73 2e 20 20 49 66 20 6e 6f 0a 2a  ogress.  If no.*
154b0 2a 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  * subtransaction
154c0 20 69 73 20 61 63 74 69 76 65 2c 20 74 68 69 73   is active, this
154d0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
154e0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
154f0 43 6f 6d 6d 69 74 53 74 6d 74 28 42 74 72 65 65  CommitStmt(Btree
15500 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
15510 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
15520 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20  = p->pBt;.  if( 
15530 70 42 74 2d 3e 69 6e 53 74 6d 74 20 26 26 20 21  pBt->inStmt && !
15540 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  pBt->readOnly ){
15550 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
15560 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d  3pager_stmt_comm
15570 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  it(pBt->pPager);
15580 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
15590 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
155a0 7d 0a 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20  }.  pBt->inStmt 
155b0 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
155c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
155d0 61 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 73  ack the active s
155e0 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e  tatement subtran
155f0 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 6e 6f 20  saction.  If no 
15600 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  subtransaction.*
15610 2a 20 69 73 20 61 63 74 69 76 65 20 74 68 69 73  * is active this
15620 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
15630 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63  -op..**.** All c
15640 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 20 69  ursors will be i
15650 6e 76 61 6c 69 64 61 74 65 64 20 62 79 20 74 68  nvalidated by th
15660 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41  is operation.  A
15670 6e 79 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f  ny attempt.** to
15680 20 75 73 65 20 61 20 63 75 72 73 6f 72 20 74 68   use a cursor th
15690 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74 20 74  at was open at t
156a0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
156b0 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 0a 2a  this operation.*
156c0 2a 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e  * will result in
156d0 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e   an error..*/.in
156e0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  t sqlite3BtreeRo
156f0 6c 6c 62 61 63 6b 53 74 6d 74 28 42 74 72 65 65  llbackStmt(Btree
15700 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d   *p){.  int rc =
15710 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74   SQLITE_OK;.  Bt
15720 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
15730 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 4d  >pBt;.  sqlite3M
15740 61 6c 6c 6f 63 44 69 73 61 6c 6c 6f 77 28 29 3b  allocDisallow();
15750 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 53 74  .  if( pBt->inSt
15760 6d 74 20 26 26 20 21 70 42 74 2d 3e 72 65 61 64  mt && !pBt->read
15770 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 63 20 3d  Only ){.    rc =
15780 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74   sqlite3pager_st
15790 6d 74 5f 72 6f 6c 6c 62 61 63 6b 28 70 42 74 2d  mt_rollback(pBt-
157a0 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73  >pPager);.    as
157b0 73 65 72 74 28 20 63 6f 75 6e 74 57 72 69 74 65  sert( countWrite
157c0 43 75 72 73 6f 72 73 28 70 42 74 29 3d 3d 30 20  Cursors(pBt)==0 
157d0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74  );.    pBt->inSt
157e0 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71  mt = 0;.  }.  sq
157f0 6c 69 74 65 33 4d 61 6c 6c 6f 63 41 6c 6c 6f 77  lite3MallocAllow
15800 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ();.  return rc;
15810 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c  .}../*.** Defaul
15820 74 20 6b 65 79 20 63 6f 6d 70 61 72 69 73 6f 6e  t key comparison
15830 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20   function to be 
15840 75 73 65 64 20 69 66 20 6e 6f 20 63 6f 6d 70 61  used if no compa
15850 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 0a 2a  rison function.*
15860 2a 20 69 73 20 73 70 65 63 69 66 69 65 64 20 6f  * is specified o
15870 6e 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72  n the sqlite3Btr
15880 65 65 43 75 72 73 6f 72 28 29 20 63 61 6c 6c 2e  eeCursor() call.
15890 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
158a0 66 6c 74 43 6f 6d 70 61 72 65 28 0a 20 20 76 6f  fltCompare(.  vo
158b0 69 64 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 20  id *NotUsed,    
158c0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 72           /* User
158d0 20 64 61 74 61 20 69 73 20 6e 6f 74 20 75 73 65   data is not use
158e0 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 31 2c 20 63  d */.  int n1, c
158f0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 31 2c 20 20  onst void *p1,  
15900 20 20 2f 2a 20 46 69 72 73 74 20 6b 65 79 20 74    /* First key t
15910 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 69  o compare */.  i
15920 6e 74 20 6e 32 2c 20 63 6f 6e 73 74 20 76 6f 69  nt n2, const voi
15930 64 20 2a 70 32 20 20 20 20 20 2f 2a 20 53 65 63  d *p2     /* Sec
15940 6f 6e 64 20 6b 65 79 20 74 6f 20 63 6f 6d 70 61  ond key to compa
15950 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 63  re */.){.  int c
15960 3b 0a 20 20 63 20 3d 20 6d 65 6d 63 6d 70 28 70  ;.  c = memcmp(p
15970 31 2c 20 70 32 2c 20 6e 31 3c 6e 32 20 3f 20 6e  1, p2, n1<n2 ? n
15980 31 20 3a 20 6e 32 29 3b 0a 20 20 69 66 28 20 63  1 : n2);.  if( c
15990 3d 3d 30 20 29 7b 0a 20 20 20 20 63 20 3d 20 6e  ==0 ){.    c = n
159a0 31 20 2d 20 6e 32 3b 0a 20 20 7d 0a 20 20 72 65  1 - n2;.  }.  re
159b0 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn c;.}../*.**
159c0 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 75   Create a new cu
159d0 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54 72  rsor for the BTr
159e0 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69 73  ee whose root is
159f0 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20   on the page.** 
15a00 69 54 61 62 6c 65 2e 20 20 54 68 65 20 61 63 74  iTable.  The act
15a10 20 6f 66 20 61 63 71 75 69 72 69 6e 67 20 61 20   of acquiring a 
15a20 63 75 72 73 6f 72 20 67 65 74 73 20 61 20 72 65  cursor gets a re
15a30 61 64 20 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a 20 74  ad lock on .** t
15a40 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15a50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61  ..**.** If wrFla
15a60 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 63  g==0, then the c
15a70 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62  ursor can only b
15a80 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69  e used for readi
15a90 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67  ng..** If wrFlag
15aa0 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63 75  ==1, then the cu
15ab0 72 73 6f 72 20 63 61 6e 20 62 65 20 75 73 65 64  rsor can be used
15ac0 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20   for reading or 
15ad0 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69  for.** writing i
15ae0 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f  f other conditio
15af0 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61  ns for writing a
15b00 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68  re also met.  Th
15b10 65 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 63  ese.** are the c
15b20 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d  onditions that m
15b30 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72  ust be met in or
15b40 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20  der for writing 
15b50 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64  to.** be allowed
15b60 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20  :.**.** 1:  The 
15b70 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65  cursor must have
15b80 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74   been opened wit
15b90 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a  h wrFlag==1.**.*
15ba0 2a 20 32 3a 20 20 4e 6f 20 6f 74 68 65 72 20 63  * 2:  No other c
15bb0 75 72 73 6f 72 73 20 6d 61 79 20 62 65 20 6f 70  ursors may be op
15bc0 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d  en with wrFlag==
15bd0 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61  0 on the same ta
15be0 62 6c 65 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68  ble.**.** 3:  Th
15bf0 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
15c00 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74  be writable (not
15c10 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65   on read-only me
15c20 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54  dia).**.** 4:  T
15c30 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20  here must be an 
15c40 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
15c50 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 64 69 74  on..**.** Condit
15c60 69 6f 6e 20 32 20 77 61 72 72 61 6e 74 73 20 66  ion 2 warrants f
15c70 75 72 74 68 65 72 20 64 69 73 63 75 73 73 69 6f  urther discussio
15c80 6e 2e 20 20 49 66 20 61 6e 79 20 63 75 72 73 6f  n.  If any curso
15c90 72 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f  r is opened.** o
15ca0 6e 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 77  n a table with w
15cb0 72 46 6c 61 67 3d 3d 30 2c 20 74 68 61 74 20 70  rFlag==0, that p
15cc0 72 65 76 65 6e 74 73 20 61 6c 6c 20 6f 74 68 65  revents all othe
15cd0 72 20 63 75 72 73 6f 72 73 20 66 72 6f 6d 0a 2a  r cursors from.*
15ce0 2a 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 61  * writing to tha
15cf0 74 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69  t table.  This i
15d00 73 20 61 20 6b 69 6e 64 20 6f 66 20 22 72 65 61  s a kind of "rea
15d10 64 2d 6c 6f 63 6b 22 2e 20 20 57 68 65 6e 20 61  d-lock".  When a
15d20 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6f 70   cursor.** is op
15d30 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67  ened with wrFlag
15d40 3d 3d 30 20 69 74 20 69 73 20 67 75 61 72 61 6e  ==0 it is guaran
15d50 74 65 65 64 20 74 68 61 74 20 74 68 65 20 74 61  teed that the ta
15d60 62 6c 65 20 77 69 6c 6c 20 6e 6f 74 0a 2a 2a 20  ble will not.** 
15d70 63 68 61 6e 67 65 20 61 73 20 6c 6f 6e 67 20 61  change as long a
15d80 73 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  s the cursor is 
15d90 6f 70 65 6e 2e 20 20 54 68 69 73 20 61 6c 6c 6f  open.  This allo
15da0 77 73 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ws the cursor to
15db0 0a 2a 2a 20 64 6f 20 61 20 73 65 71 75 65 6e 74  .** do a sequent
15dc0 69 61 6c 20 73 63 61 6e 20 6f 66 20 74 68 65 20  ial scan of the 
15dd0 74 61 62 6c 65 20 77 69 74 68 6f 75 74 20 68 61  table without ha
15de0 76 69 6e 67 20 74 6f 20 77 6f 72 72 79 20 61 62  ving to worry ab
15df0 6f 75 74 0a 2a 2a 20 65 6e 74 72 69 65 73 20 62  out.** entries b
15e00 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20 6f 72  eing inserted or
15e10 20 64 65 6c 65 74 65 64 20 64 75 72 69 6e 67 20   deleted during 
15e20 74 68 65 20 73 63 61 6e 2e 20 20 43 75 72 73 6f  the scan.  Curso
15e30 72 73 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  rs should.** be 
15e40 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c  opened with wrFl
15e50 61 67 3d 3d 30 20 6f 6e 6c 79 20 69 66 20 74 68  ag==0 only if th
15e60 69 73 20 72 65 61 64 2d 6c 6f 63 6b 20 70 72 6f  is read-lock pro
15e70 70 65 72 74 79 20 69 73 20 6e 65 65 64 65 64 2e  perty is needed.
15e80 0a 2a 2a 20 54 68 61 74 20 69 73 20 74 6f 20 73  .** That is to s
15e90 61 79 2c 20 63 75 72 73 6f 72 73 20 73 68 6f 75  ay, cursors shou
15ea0 6c 64 20 62 65 20 6f 70 65 6e 65 64 20 77 69 74  ld be opened wit
15eb0 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 6c 79  h wrFlag==0 only
15ec0 20 69 66 20 74 68 65 79 0a 2a 2a 20 69 6e 74 65   if they.** inte
15ed0 6e 64 20 74 6f 20 75 73 65 20 74 68 65 20 73 71  nd to use the sq
15ee0 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29  lite3BtreeNext()
15ef0 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 41   system call.  A
15f00 6c 6c 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73  ll other cursors
15f10 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 6f 70  .** should be op
15f20 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67  ened with wrFlag
15f30 3d 3d 31 20 65 76 65 6e 20 69 66 20 74 68 65 79  ==1 even if they
15f40 20 6e 65 76 65 72 20 72 65 61 6c 6c 79 20 69 6e   never really in
15f50 74 65 6e 64 0a 2a 2a 20 74 6f 20 77 72 69 74 65  tend.** to write
15f60 2e 0a 2a 2a 20 0a 2a 2a 20 4e 6f 20 63 68 65 63  ..** .** No chec
15f70 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20  king is done to 
15f80 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 70  make sure that p
15f90 61 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c  age iTable reall
15fa0 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74  y is the.** root
15fb0 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65   page of a b-tre
15fc0 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74  e.  If it is not
15fd0 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
15fe0 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69  r acquired.** wi
15ff0 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72  ll not work corr
16000 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ectly..**.** The
16010 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
16020 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6c 6f 67  tion must be log
16030 69 63 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20  ically the same 
16040 66 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f 72  for every cursor
16050 0a 2a 2a 20 6f 6e 20 61 20 70 61 72 74 69 63 75  .** on a particu
16060 6c 61 72 20 74 61 62 6c 65 2e 20 20 43 68 61 6e  lar table.  Chan
16070 67 69 6e 67 20 74 68 65 20 63 6f 6d 70 61 72 69  ging the compari
16080 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  son function wil
16090 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 69  l result.** in i
160a0 6e 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69  ncorrect operati
160b0 6f 6e 73 2e 20 20 49 66 20 74 68 65 20 63 6f 6d  ons.  If the com
160c0 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
160d0 20 69 73 20 4e 55 4c 4c 2c 20 61 0a 2a 2a 20 64   is NULL, a.** d
160e0 65 66 61 75 6c 74 20 63 6f 6d 70 61 72 69 73 6f  efault compariso
160f0 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  n function is us
16100 65 64 2e 20 20 54 68 65 20 63 6f 6d 70 61 72 69  ed.  The compari
16110 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a  son function is.
16120 2a 2a 20 61 6c 77 61 79 73 20 69 67 6e 6f 72 65  ** always ignore
16130 64 20 66 6f 72 20 49 4e 54 4b 45 59 20 74 61 62  d for INTKEY tab
16140 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  les..*/.int sqli
16150 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a  te3BtreeCursor(.
16160 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
16170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16190 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
161a0 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
161b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
161d0 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c  oot page of tabl
161e0 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
161f0 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20  nt wrFlag,      
16200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16210 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
16220 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64  to write. 0 read
16230 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 28  -only */.  int (
16240 2a 78 43 6d 70 29 28 76 6f 69 64 2a 2c 69 6e 74  *xCmp)(void*,int
16250 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74  ,const void*,int
16260 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 20 2f  ,const void*), /
16270 2a 20 4b 65 79 20 43 6f 6d 70 61 72 69 73 6f 6e  * Key Comparison
16280 20 66 75 6e 63 20 2a 2f 0a 20 20 76 6f 69 64 20   func */.  void 
16290 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20 20 20  *pArg,          
162a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162b0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
162c0 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28  arg to xCompare(
162d0 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  ) */.  BtCursor 
162e0 2a 2a 70 70 43 75 72 20 20 20 20 20 20 20 20 20  **ppCur         
162f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16300 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20     /* Write new 
16310 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29  cursor here */.)
16320 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
16330 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20  Cursor *pCur;.  
16340 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
16350 70 2d 3e 70 42 74 3b 0a 0a 20 20 2a 70 70 43 75  p->pBt;..  *ppCu
16360 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 77 72 46  r = 0;.  if( wrF
16370 6c 61 67 20 29 7b 0a 20 20 20 20 69 66 28 20 70  lag ){.    if( p
16380 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  Bt->readOnly ){.
16390 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
163a0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
163b0 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68 65 63    }.    if( chec
163c0 6b 52 65 61 64 4c 6f 63 6b 73 28 70 2c 20 69 54  kReadLocks(p, iT
163d0 61 62 6c 65 2c 20 30 29 20 29 7b 0a 20 20 20 20  able, 0) ){.    
163e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
163f0 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 7d 0a 20 20  LOCKED;.    }.  
16400 7d 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 50  }..  if( pBt->pP
16410 61 67 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72  age1==0 ){.    r
16420 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 57 69 74  c = lockBtreeWit
16430 68 52 65 74 72 79 28 70 29 3b 0a 20 20 20 20 69  hRetry(p);.    i
16440 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
16450 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
16460 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   rc;.    }.  }. 
16470 20 70 43 75 72 20 3d 20 73 71 6c 69 74 65 4d 61   pCur = sqliteMa
16480 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43  lloc( sizeof(*pC
16490 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75  ur) );.  if( pCu
164a0 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  r==0 ){.    rc =
164b0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
164c0 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 63     goto create_c
164d0 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b  ursor_exception;
164e0 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70 67 6e  .  }.  pCur->pgn
164f0 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54  oRoot = (Pgno)iT
16500 61 62 6c 65 3b 0a 20 20 69 66 28 20 69 54 61 62  able;.  if( iTab
16510 6c 65 3d 3d 31 20 26 26 20 73 71 6c 69 74 65 33  le==1 && sqlite3
16520 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28  pager_pagecount(
16530 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 30 20  pBt->pPager)==0 
16540 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
16550 54 45 5f 45 4d 50 54 59 3b 0a 20 20 20 20 67 6f  TE_EMPTY;.    go
16560 74 6f 20 63 72 65 61 74 65 5f 63 75 72 73 6f 72  to create_cursor
16570 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a  _exception;.  }.
16580 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69    rc = getAndIni
16590 74 50 61 67 65 28 70 42 74 2c 20 70 43 75 72 2d  tPage(pBt, pCur-
165a0 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72  >pgnoRoot, &pCur
165b0 2d 3e 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 69  ->pPage, 0);.  i
165c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
165d0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65   ){.    goto cre
165e0 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70  ate_cursor_excep
165f0 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  tion;.  }..  /* 
16600 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  Now that no othe
16610 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63 63  r errors can occ
16620 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c 69  ur, finish filli
16630 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75 72 73  ng in the BtCurs
16640 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  or.  ** variable
16650 73 2c 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73  s, link the curs
16660 6f 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68  or into the BtSh
16670 61 72 65 64 20 6c 69 73 74 20 61 6e 64 20 73 65  ared list and se
16680 74 20 2a 70 70 43 75 72 20 28 74 68 65 0a 20 20  t *ppCur (the.  
16690 2a 2a 20 6f 75 74 70 75 74 20 61 72 67 75 6d 65  ** output argume
166a0 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
166b0 69 6f 6e 29 2e 0a 20 20 2a 2f 0a 20 20 70 43 75  ion)..  */.  pCu
166c0 72 2d 3e 78 43 6f 6d 70 61 72 65 20 3d 20 78 43  r->xCompare = xC
166d0 6d 70 20 3f 20 78 43 6d 70 20 3a 20 64 66 6c 74  mp ? xCmp : dflt
166e0 43 6f 6d 70 61 72 65 3b 0a 20 20 70 43 75 72 2d  Compare;.  pCur-
166f0 3e 70 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  >pArg = pArg;.  
16700 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70  pCur->pBtree = p
16710 3b 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67  ;.  pCur->wrFlag
16720 20 3d 20 77 72 46 6c 61 67 3b 0a 20 20 70 43 75   = wrFlag;.  pCu
16730 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  r->pNext = pBt->
16740 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70  pCursor;.  if( p
16750 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  Cur->pNext ){.  
16760 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70    pCur->pNext->p
16770 50 72 65 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d  Prev = pCur;.  }
16780 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  .  pBt->pCursor 
16790 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e  = pCur;.  pCur->
167a0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
167b0 49 4e 56 41 4c 49 44 3b 0a 20 20 2a 70 70 43 75  INVALID;.  *ppCu
167c0 72 20 3d 20 70 43 75 72 3b 0a 0a 20 20 72 65 74  r = pCur;..  ret
167d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 63  urn SQLITE_OK;.c
167e0 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63  reate_cursor_exc
167f0 65 70 74 69 6f 6e 3a 0a 20 20 69 66 28 20 70 43  eption:.  if( pC
16800 75 72 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  ur ){.    releas
16810 65 50 61 67 65 28 70 43 75 72 2d 3e 70 50 61 67  ePage(pCur->pPag
16820 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  e);.    sqliteFr
16830 65 65 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20  ee(pCur);.  }.  
16840 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
16850 73 65 64 28 70 42 74 29 3b 0a 20 20 72 65 74 75  sed(pBt);.  retu
16860 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 30 20  rn rc;.}..#if 0 
16870 20 2f 2a 20 4e 6f 74 20 55 73 65 64 20 2a 2f 0a   /* Not Used */.
16880 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
16890 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63 6f   value of the co
168a0 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
168b0 6e 20 75 73 65 64 20 62 79 20 61 20 63 75 72 73  n used by a curs
168c0 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  or..*/.void sqli
168d0 74 65 33 42 74 72 65 65 53 65 74 43 6f 6d 70 61  te3BtreeSetCompa
168e0 72 65 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  re(.  BtCursor *
168f0 70 43 75 72 2c 20 20 20 20 20 2f 2a 20 54 68 65  pCur,     /* The
16900 20 63 75 72 73 6f 72 20 74 6f 20 77 68 6f 73 65   cursor to whose
16910 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
16920 74 69 6f 6e 20 69 73 20 63 68 61 6e 67 65 64 20  tion is changed 
16930 2a 2f 0a 20 20 69 6e 74 28 2a 78 43 6d 70 29 28  */.  int(*xCmp)(
16940 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
16950 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
16960 76 6f 69 64 2a 29 2c 20 2f 2a 20 4e 65 77 20 63  void*), /* New c
16970 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 20 2a  omparison func *
16980 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20  /.  void *pArg  
16990 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
169a0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6d   argument to xCm
169b0 70 28 29 20 2a 2f 0a 29 7b 0a 20 20 70 43 75 72  p() */.){.  pCur
169c0 2d 3e 78 43 6f 6d 70 61 72 65 20 3d 20 78 43 6d  ->xCompare = xCm
169d0 70 20 3f 20 78 43 6d 70 20 3a 20 64 66 6c 74 43  p ? xCmp : dfltC
169e0 6f 6d 70 61 72 65 3b 0a 20 20 70 43 75 72 2d 3e  ompare;.  pCur->
169f0 70 41 72 67 20 3d 20 70 41 72 67 3b 0a 7d 0a 23  pArg = pArg;.}.#
16a00 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  endif../*.** Clo
16a10 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68  se a cursor.  Th
16a20 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  e read lock on t
16a30 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
16a40 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20   is released.** 
16a50 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75  when the last cu
16a60 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a  rsor is closed..
16a70 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
16a80 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42  reeCloseCursor(B
16a90 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
16aa0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
16ab0 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  = pCur->pBtree->
16ac0 70 42 74 3b 0a 20 20 72 65 73 74 6f 72 65 4f 72  pBt;.  restoreOr
16ad0 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  ClearCursorPosit
16ae0 69 6f 6e 28 70 43 75 72 2c 20 30 29 3b 0a 20 20  ion(pCur, 0);.  
16af0 69 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76 20  if( pCur->pPrev 
16b00 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 50 72  ){.    pCur->pPr
16b10 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72  ev->pNext = pCur
16b20 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65  ->pNext;.  }else
16b30 7b 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73  {.    pBt->pCurs
16b40 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74  or = pCur->pNext
16b50 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72  ;.  }.  if( pCur
16b60 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
16b70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  Cur->pNext->pPre
16b80 76 20 3d 20 70 43 75 72 2d 3e 70 50 72 65 76 3b  v = pCur->pPrev;
16b90 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61  .  }.  releasePa
16ba0 67 65 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b  ge(pCur->pPage);
16bb0 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  .  unlockBtreeIf
16bc0 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 73  Unused(pBt);.  s
16bd0 71 6c 69 74 65 46 72 65 65 28 70 43 75 72 29 3b  qliteFree(pCur);
16be0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
16bf0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  _OK;.}../*.** Ma
16c00 6b 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63  ke a temporary c
16c10 75 72 73 6f 72 20 62 79 20 66 69 6c 6c 69 6e 67  ursor by filling
16c20 20 69 6e 20 74 68 65 20 66 69 65 6c 64 73 20 6f   in the fields o
16c30 66 20 70 54 65 6d 70 43 75 72 2e 0a 2a 2a 20 54  f pTempCur..** T
16c40 68 65 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72  he temporary cur
16c50 73 6f 72 20 69 73 20 6e 6f 74 20 6f 6e 20 74 68  sor is not on th
16c60 65 20 63 75 72 73 6f 72 20 6c 69 73 74 20 66 6f  e cursor list fo
16c70 72 20 74 68 65 20 42 74 72 65 65 2e 0a 2a 2f 0a  r the Btree..*/.
16c80 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 74 54  static void getT
16c90 65 6d 70 43 75 72 73 6f 72 28 42 74 43 75 72 73  empCursor(BtCurs
16ca0 6f 72 20 2a 70 43 75 72 2c 20 42 74 43 75 72 73  or *pCur, BtCurs
16cb0 6f 72 20 2a 70 54 65 6d 70 43 75 72 29 7b 0a 20  or *pTempCur){. 
16cc0 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 43 75 72   memcpy(pTempCur
16cd0 2c 20 70 43 75 72 2c 20 73 69 7a 65 6f 66 28 2a  , pCur, sizeof(*
16ce0 70 43 75 72 29 29 3b 0a 20 20 70 54 65 6d 70 43  pCur));.  pTempC
16cf0 75 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  ur->pNext = 0;. 
16d00 20 70 54 65 6d 70 43 75 72 2d 3e 70 50 72 65 76   pTempCur->pPrev
16d10 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 54 65 6d   = 0;.  if( pTem
16d20 70 43 75 72 2d 3e 70 50 61 67 65 20 29 7b 0a 20  pCur->pPage ){. 
16d30 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
16d40 72 65 66 28 70 54 65 6d 70 43 75 72 2d 3e 70 50  ref(pTempCur->pP
16d50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 7d  age->aData);.  }
16d60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
16d70 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72   a temporary cur
16d80 73 6f 72 20 73 75 63 68 20 61 73 20 77 61 73 20  sor such as was 
16d90 6d 61 64 65 20 62 79 20 74 68 65 20 43 72 65 61  made by the Crea
16da0 74 65 54 65 6d 70 6f 72 61 72 79 43 75 72 73 6f  teTemporaryCurso
16db0 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  r().** function 
16dc0 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  above..*/.static
16dd0 20 76 6f 69 64 20 72 65 6c 65 61 73 65 54 65 6d   void releaseTem
16de0 70 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72  pCursor(BtCursor
16df0 20 2a 70 43 75 72 29 7b 0a 20 20 69 66 28 20 70   *pCur){.  if( p
16e00 43 75 72 2d 3e 70 50 61 67 65 20 29 7b 0a 20 20  Cur->pPage ){.  
16e10 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75    sqlite3pager_u
16e20 6e 72 65 66 28 70 43 75 72 2d 3e 70 50 61 67 65  nref(pCur->pPage
16e30 2d 3e 61 44 61 74 61 29 3b 0a 20 20 7d 0a 7d 0a  ->aData);.  }.}.
16e40 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
16e50 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69 6e   the BtCursor.in
16e60 66 6f 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  fo field of the 
16e70 67 69 76 65 6e 20 63 75 72 73 6f 72 20 69 73 20  given cursor is 
16e80 76 61 6c 69 64 2e 0a 2a 2a 20 49 66 20 69 74 20  valid..** If it 
16e90 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76  is not already v
16ea0 61 6c 69 64 2c 20 63 61 6c 6c 20 70 61 72 73 65  alid, call parse
16eb0 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69  Cell() to fill i
16ec0 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75  t in..**.** BtCu
16ed0 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63  rsor.info is a c
16ee0 61 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f  ache of the info
16ef0 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63  rmation in the c
16f00 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20  urrent cell..** 
16f10 55 73 69 6e 67 20 74 68 69 73 20 63 61 63 68 65  Using this cache
16f20 20 72 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d   reduces the num
16f30 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20  ber of calls to 
16f40 70 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2f 0a  parseCell()..*/.
16f50 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 74 43  static void getC
16f60 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72  ellInfo(BtCursor
16f70 20 2a 70 43 75 72 29 7b 0a 20 20 69 66 28 20 70   *pCur){.  if( p
16f80 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
16f90 3d 30 20 29 7b 0a 20 20 20 20 70 61 72 73 65 43  =0 ){.    parseC
16fa0 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 2c  ell(pCur->pPage,
16fb0 20 70 43 75 72 2d 3e 69 64 78 2c 20 26 70 43 75   pCur->idx, &pCu
16fc0 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73  r->info);.  }els
16fd0 65 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  e{.#ifndef NDEBU
16fe0 47 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69  G.    CellInfo i
16ff0 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  nfo;.    memset(
17000 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66  &info, 0, sizeof
17010 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 70 61 72  (info));.    par
17020 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61  seCell(pCur->pPa
17030 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 26  ge, pCur->idx, &
17040 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  info);.    asser
17050 74 28 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c  t( memcmp(&info,
17060 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69   &pCur->info, si
17070 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29  zeof(info))==0 )
17080 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a  ;.#endif.  }.}..
17090 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65  /*.** Set *pSize
170a0 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20   to the size of 
170b0 74 68 65 20 62 75 66 66 65 72 20 6e 65 65 64 65  the buffer neede
170c0 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 76 61  d to hold the va
170d0 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65  lue of.** the ke
170e0 79 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  y for the curren
170f0 74 20 65 6e 74 72 79 2e 20 20 49 66 20 74 68 65  t entry.  If the
17100 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70   cursor is not p
17110 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20  ointing.** to a 
17120 76 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70 53  valid entry, *pS
17130 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e  ize is set to 0.
17140 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61   .**.** For a ta
17150 62 6c 65 20 77 69 74 68 20 74 68 65 20 49 4e 54  ble with the INT
17160 4b 45 59 20 66 6c 61 67 20 73 65 74 2c 20 74 68  KEY flag set, th
17170 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
17180 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74  ns the key.** it
17190 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75  self, not the nu
171a0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
171b0 20 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74   the key..*/.int
171c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
171d0 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70  Size(BtCursor *p
171e0 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a 65 29  Cur, i64 *pSize)
171f0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 72 65 73  {.  int rc = res
17200 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f  toreOrClearCurso
17210 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 2c 20  rPosition(pCur, 
17220 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  1);.  if( rc==SQ
17230 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
17240 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
17250 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
17260 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  LID || pCur->eSt
17270 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
17280 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75  D );.    if( pCu
17290 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
172a0 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
172b0 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20     *pSize = 0;. 
172c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
172d0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
172e0 29 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20  );.      *pSize 
172f0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  = pCur->info.nKe
17300 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  y;.    }.  }.  r
17310 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17320 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f  ** Set *pSize to
17330 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
17340 79 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e 20  ytes of data in 
17350 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a  the entry the.**
17360 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c   cursor currentl
17370 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41 6c  y points to.  Al
17380 77 61 79 73 20 72 65 74 75 72 6e 20 53 51 4c 49  ways return SQLI
17390 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 61 69 6c 75 72  TE_OK..** Failur
173a0 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  e is not possibl
173b0 65 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  e.  If the curso
173c0 72 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74  r is not current
173d0 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74  ly.** pointing t
173e0 6f 20 61 6e 20 65 6e 74 72 79 20 28 77 68 69 63  o an entry (whic
173f0 68 20 63 61 6e 20 68 61 70 70 65 6e 2c 20 66 6f  h can happen, fo
17400 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a  r example, if.**
17410 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
17420 20 65 6d 70 74 79 29 20 74 68 65 6e 20 2a 70 53   empty) then *pS
17430 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e  ize is set to 0.
17440 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
17450 74 72 65 65 44 61 74 61 53 69 7a 65 28 42 74 43  treeDataSize(BtC
17460 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
17470 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20   *pSize){.  int 
17480 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c  rc = restoreOrCl
17490 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  earCursorPositio
174a0 6e 28 70 43 75 72 2c 20 31 29 3b 0a 20 20 69 66  n(pCur, 1);.  if
174b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
174c0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
174d0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
174e0 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70  SOR_INVALID || p
174f0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
17500 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
17510 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
17520 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
17530 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f  D ){.      /* No
17540 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20  t pointing at a 
17550 76 61 6c 69 64 20 65 6e 74 72 79 20 2d 20 73 65  valid entry - se
17560 74 20 2a 70 53 69 7a 65 20 74 6f 20 30 2e 20 2a  t *pSize to 0. *
17570 2f 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d  /.      *pSize =
17580 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
17590 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f       getCellInfo
175a0 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70  (pCur);.      *p
175b0 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66  Size = pCur->inf
175c0 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20  o.nData;.    }. 
175d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
175e0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61  }../*.** Read pa
175f0 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f  yload informatio
17600 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79  n from the entry
17610 20 74 68 61 74 20 74 68 65 20 70 43 75 72 20 63   that the pCur c
17620 75 72 73 6f 72 20 69 73 0a 2a 2a 20 70 6f 69 6e  ursor is.** poin
17630 74 69 6e 67 20 74 6f 2e 20 20 42 65 67 69 6e 20  ting to.  Begin 
17640 72 65 61 64 69 6e 67 20 74 68 65 20 70 61 79 6c  reading the payl
17650 6f 61 64 20 61 74 20 22 6f 66 66 73 65 74 22 20  oad at "offset" 
17660 61 6e 64 20 72 65 61 64 0a 2a 2a 20 61 20 74 6f  and read.** a to
17670 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74  tal of "amt" byt
17680 65 73 2e 20 20 50 75 74 20 74 68 65 20 72 65 73  es.  Put the res
17690 75 6c 74 20 69 6e 20 7a 42 75 66 2e 0a 2a 2a 0a  ult in zBuf..**.
176a0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
176b0 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 61 20  does not make a 
176c0 64 69 73 74 69 6e 63 74 69 6f 6e 20 62 65 74 77  distinction betw
176d0 65 65 6e 20 6b 65 79 20 61 6e 64 20 64 61 74 61  een key and data
176e0 2e 0a 2a 2a 20 49 74 20 6a 75 73 74 20 72 65 61  ..** It just rea
176f0 64 73 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68  ds bytes from th
17700 65 20 70 61 79 6c 6f 61 64 20 61 72 65 61 2e 20  e payload area. 
17710 20 44 61 74 61 20 6d 69 67 68 74 20 61 70 70 65   Data might appe
17720 61 72 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 61 69  ar.** on the mai
17730 6e 20 70 61 67 65 20 6f 72 20 62 65 20 73 63 61  n page or be sca
17740 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75  ttered out on mu
17750 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20  ltiple overflow 
17760 70 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  pages..*/.static
17770 20 69 6e 74 20 67 65 74 50 61 79 6c 6f 61 64 28   int getPayload(
17780 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
17790 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
177a0 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e  r pointing to en
177b0 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  try to read from
177c0 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74   */.  int offset
177d0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65  ,          /* Be
177e0 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73  gin reading this
177f0 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61   far into payloa
17800 64 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20  d */.  int amt, 
17810 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
17820 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79  ead this many by
17830 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  tes */.  unsigne
17840 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a  d char *pBuf, /*
17850 20 57 72 69 74 65 20 74 68 65 20 62 79 74 65 73   Write the bytes
17860 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65   into this buffe
17870 72 20 2a 2f 20 0a 20 20 69 6e 74 20 73 6b 69 70  r */ .  int skip
17880 4b 65 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Key          /* 
17890 6f 66 66 73 65 74 20 62 65 67 69 6e 73 20 61 74  offset begins at
178a0 20 64 61 74 61 20 69 66 20 74 68 69 73 20 69 73   data if this is
178b0 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e   true */.){.  un
178c0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61  signed char *aPa
178d0 79 6c 6f 61 64 3b 0a 20 20 50 67 6e 6f 20 6e 65  yload;.  Pgno ne
178e0 78 74 50 61 67 65 3b 0a 20 20 69 6e 74 20 72 63  xtPage;.  int rc
178f0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
17900 67 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge;.  BtShared *
17910 70 42 74 3b 0a 20 20 69 6e 74 20 6f 76 66 6c 53  pBt;.  int ovflS
17920 69 7a 65 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b  ize;.  u32 nKey;
17930 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ..  assert( pCur
17940 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 70 50 61  !=0 && pCur->pPa
17950 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ge!=0 );.  asser
17960 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
17970 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
17980 0a 20 20 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  .  pBt = pCur->p
17990 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20 70 50  Btree->pBt;.  pP
179a0 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
179b0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  e;.  assert( pCu
179c0 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75  r->idx>=0 && pCu
179d0 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43  r->idx<pPage->nC
179e0 65 6c 6c 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c  ell );.  getCell
179f0 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50  Info(pCur);.  aP
17a00 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69  ayload = pCur->i
17a10 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20 70 43 75 72  nfo.pCell + pCur
17a20 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a  ->info.nHeader;.
17a30 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
17a40 4b 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65 79 20  Key ){.    nKey 
17a50 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
17a60 20 20 6e 4b 65 79 20 3d 20 70 43 75 72 2d 3e 69    nKey = pCur->i
17a70 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20  nfo.nKey;.  }.  
17a80 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d  assert( offset>=
17a90 30 20 29 3b 0a 20 20 69 66 28 20 73 6b 69 70 4b  0 );.  if( skipK
17aa0 65 79 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74  ey ){.    offset
17ab0 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20   += nKey;.  }.  
17ac0 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3e  if( offset+amt >
17ad0 20 6e 4b 65 79 2b 70 43 75 72 2d 3e 69 6e 66 6f   nKey+pCur->info
17ae0 2e 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 72 65  .nData ){.    re
17af0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
17b00 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 66 66  R;.  }.  if( off
17b10 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  set<pCur->info.n
17b20 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  Local ){.    int
17b30 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66   a = amt;.    if
17b40 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d  ( a+offset>pCur-
17b50 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
17b60 20 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e        a = pCur->
17b70 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66  info.nLocal - of
17b80 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  fset;.    }.    
17b90 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26 61 50  memcpy(pBuf, &aP
17ba0 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20  ayload[offset], 
17bb0 61 29 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 61  a);.    if( a==a
17bc0 6d 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  mt ){.      retu
17bd0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
17be0 20 20 7d 0a 20 20 20 20 6f 66 66 73 65 74 20 3d    }.    offset =
17bf0 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20   0;.    pBuf += 
17c00 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b  a;.    amt -= a;
17c10 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66  .  }else{.    of
17c20 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e  fset -= pCur->in
17c30 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20  fo.nLocal;.  }. 
17c40 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d   ovflSize = pBt-
17c50 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
17c60 0a 20 20 69 66 28 20 61 6d 74 3e 30 20 29 7b 0a  .  if( amt>0 ){.
17c70 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67      nextPage = g
17c80 65 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61  et4byte(&aPayloa
17c90 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d[pCur->info.nLo
17ca0 63 61 6c 5d 29 3b 0a 20 20 20 20 77 68 69 6c 65  cal]);.    while
17cb0 28 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50  ( amt>0 && nextP
17cc0 61 67 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20  age ){.      rc 
17cd0 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67  = sqlite3pager_g
17ce0 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
17cf0 6e 65 78 74 50 61 67 65 2c 20 28 76 6f 69 64 2a  nextPage, (void*
17d00 2a 29 26 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20  *)&aPayload);.  
17d10 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b      if( rc!=0 ){
17d20 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
17d30 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
17d40 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
17d50 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b  4byte(aPayload);
17d60 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66 73 65  .      if( offse
17d70 74 3c 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20  t<ovflSize ){.  
17d80 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d        int a = am
17d90 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  t;.        if( a
17da0 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c   + offset > ovfl
17db0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
17dc0 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d    a = ovflSize -
17dd0 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20   offset;.       
17de0 20 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70   }.        memcp
17df0 79 28 70 42 75 66 2c 20 26 61 50 61 79 6c 6f 61  y(pBuf, &aPayloa
17e00 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 61 29 3b  d[offset+4], a);
17e10 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20  .        offset 
17e20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61 6d 74  = 0;.        amt
17e30 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 70   -= a;.        p
17e40 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20  Buf += a;.      
17e50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6f  }else{.        o
17e60 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a  ffset -= ovflSiz
17e70 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
17e80 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
17e90 72 65 66 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20  ref(aPayload);. 
17ea0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
17eb0 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  amt>0 ){.    ret
17ec0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
17ed0 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
17ee0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17ef0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70  .}../*.** Read p
17f00 61 72 74 20 6f 66 20 74 68 65 20 6b 65 79 20 61  art of the key a
17f10 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63  ssociated with c
17f20 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61  ursor pCur.  Exa
17f30 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79  ctly.** "amt" by
17f40 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e  tes will be tran
17f50 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66  sfered into pBuf
17f60 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65  [].  The transfe
17f70 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22  r.** begins at "
17f80 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52  offset"..**.** R
17f90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
17fa0 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
17fb0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
17fc0 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
17fd0 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72  wrong.  An error
17fe0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
17ff0 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20  "offset+amt" is 
18000 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74  larger than.** t
18010 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79  he available pay
18020 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  load..*/.int sql
18030 69 74 65 33 42 74 72 65 65 4b 65 79 28 42 74 43  ite3BtreeKey(BtC
18040 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
18050 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
18060 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20  , void *pBuf){. 
18070 20 69 6e 74 20 72 63 20 3d 20 72 65 73 74 6f 72   int rc = restor
18080 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f  eOrClearCursorPo
18090 73 69 74 69 6f 6e 28 70 43 75 72 2c 20 31 29 3b  sition(pCur, 1);
180a0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
180b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
180c0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
180d0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
180e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
180f0 75 72 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a  ur->pPage!=0 );.
18100 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50      if( pCur->pP
18110 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
18120 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
18130 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
18140 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
18150 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  t( pCur->pPage->
18160 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 20  intKey==0 );.   
18170 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
18180 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69  dx>=0 && pCur->i
18190 64 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  dx<pCur->pPage->
181a0 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20  nCell );.    rc 
181b0 3d 20 67 65 74 50 61 79 6c 6f 61 64 28 70 43 75  = getPayload(pCu
181c0 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20  r, offset, amt, 
181d0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
181e0 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  pBuf, 0);.  }.  
181f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
18200 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66  .** Read part of
18210 20 74 68 65 20 64 61 74 61 20 61 73 73 6f 63 69   the data associ
18220 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72  ated with cursor
18230 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a   pCur.  Exactly.
18240 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77  ** "amt" bytes w
18250 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65  ill be transfere
18260 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20  d into pBuf[].  
18270 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20  The transfer.** 
18280 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65  begins at "offse
18290 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  t"..**.** Return
182a0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
182b0 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
182c0 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69  r code if anythi
182d0 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67  ng goes.** wrong
182e0 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72  .  An error is r
182f0 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73  eturned if "offs
18300 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65  et+amt" is large
18310 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76  r than.** the av
18320 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e  ailable payload.
18330 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
18340 74 72 65 65 44 61 74 61 28 42 74 43 75 72 73 6f  treeData(BtCurso
18350 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66  r *pCur, u32 off
18360 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f  set, u32 amt, vo
18370 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74  id *pBuf){.  int
18380 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43   rc = restoreOrC
18390 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
183a0 6f 6e 28 70 43 75 72 2c 20 31 29 3b 0a 20 20 69  on(pCur, 1);.  i
183b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
183c0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
183d0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
183e0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
183f0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
18400 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 20 20  pPage!=0 );.    
18410 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64  assert( pCur->id
18420 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64  x>=0 && pCur->id
18430 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  x<pCur->pPage->n
18440 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d  Cell );.    rc =
18450 20 67 65 74 50 61 79 6c 6f 61 64 28 70 43 75 72   getPayload(pCur
18460 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70  , offset, amt, p
18470 42 75 66 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72  Buf, 1);.  }.  r
18480 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
18490 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
184a0 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69  ter to payload i
184b0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
184c0 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
184d0 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73  he .** pCur curs
184e0 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
184f0 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20  o.  The pointer 
18500 69 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  is to the beginn
18510 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65  ing of.** the ke
18520 79 20 69 66 20 73 6b 69 70 4b 65 79 3d 3d 30 20  y if skipKey==0 
18530 61 6e 64 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  and it points to
18540 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
18550 66 20 64 61 74 61 20 69 66 0a 2a 2a 20 73 6b 69  f data if.** ski
18560 70 4b 65 79 3d 3d 31 2e 20 20 54 68 65 20 6e 75  pKey==1.  The nu
18570 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
18580 20 61 76 61 69 6c 61 62 6c 65 20 6b 65 79 2f 64   available key/d
18590 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  ata is written.*
185a0 2a 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49  * into *pAmt.  I
185b0 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e  f *pAmt==0, then
185c0 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
185d0 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 0a  ned will not be.
185e0 2a 2a 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74  ** a valid point
185f0 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  er..**.** This r
18600 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74  outine is an opt
18610 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69  imization.  It i
18620 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65  s common for the
18630 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61   entire key.** a
18640 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f  nd data to fit o
18650 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
18660 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74   and for there t
18670 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77  o be no overflow
18680 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e  .** pages.  When
18690 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69   that is so, thi
186a0 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65  s routine can be
186b0 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
186c0 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64  the.** key and d
186d0 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69  ata without maki
186e0 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74  ng a copy.  If t
186f0 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61  he key and/or da
18700 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74  ta spills.** ont
18710 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
18720 2c 20 74 68 65 6e 20 67 65 74 50 61 79 6c 6f 61  , then getPayloa
18730 64 28 29 20 6d 75 73 74 20 62 65 20 75 73 65 64  d() must be used
18740 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 79 0a 2a   to reassembly.*
18750 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61  * the key/data a
18760 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20  nd copy it into 
18770 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62  a preallocated b
18780 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uffer..**.** The
18790 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
187a0 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  d by this routin
187b0 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79  e looks directly
187c0 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64   into the cached
187d0 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20  .** page of the 
187e0 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 64  database.  The d
187f0 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65  ata might change
18800 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78   or move the nex
18810 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74  t time.** any bt
18820 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63  ree routine is c
18830 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  alled..*/.static
18840 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
18850 63 68 61 72 20 2a 66 65 74 63 68 50 61 79 6c 6f  char *fetchPaylo
18860 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  ad(.  BtCursor *
18870 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75  pCur,      /* Cu
18880 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f  rsor pointing to
18890 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66   entry to read f
188a0 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41  rom */.  int *pA
188b0 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  mt,           /*
188c0 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
188d0 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62  r of available b
188e0 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 20 20 69  ytes here */.  i
188f0 6e 74 20 73 6b 69 70 4b 65 79 20 20 20 20 20 20  nt skipKey      
18900 20 20 20 20 2f 2a 20 72 65 61 64 20 62 65 67 69      /* read begi
18910 6e 6e 69 6e 67 20 61 74 20 64 61 74 61 20 69 66  nning at data if
18920 20 74 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f   this is true */
18930 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  .){.  unsigned c
18940 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20  har *aPayload;. 
18950 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
18960 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69  .  u32 nKey;.  i
18970 6e 74 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73  nt nLocal;..  as
18980 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 26 26  sert( pCur!=0 &&
18990 20 70 43 75 72 2d 3e 70 50 61 67 65 21 3d 30 20   pCur->pPage!=0 
189a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
189b0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
189c0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70 50 61  R_VALID );.  pPa
189d0 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
189e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
189f0 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72  ->idx>=0 && pCur
18a00 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65  ->idx<pPage->nCe
18a10 6c 6c 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49  ll );.  getCellI
18a20 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61  nfo(pCur);.  aPa
18a30 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e  yload = pCur->in
18a40 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61 50 61 79  fo.pCell;.  aPay
18a50 6c 6f 61 64 20 2b 3d 20 70 43 75 72 2d 3e 69 6e  load += pCur->in
18a60 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69 66  fo.nHeader;.  if
18a70 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
18a80 29 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30 3b  ){.    nKey = 0;
18a90 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4b  .  }else{.    nK
18aa0 65 79 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ey = pCur->info.
18ab0 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20  nKey;.  }.  if( 
18ac0 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20 20 61  skipKey ){.    a
18ad0 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b  Payload += nKey;
18ae0 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43  .    nLocal = pC
18af0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
18b00 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73 65 7b  - nKey;.  }else{
18b10 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43  .    nLocal = pC
18b20 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b  ur->info.nLocal;
18b30 0a 20 20 20 20 69 66 28 20 6e 4c 6f 63 61 6c 3e  .    if( nLocal>
18b40 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 6e 4c  nKey ){.      nL
18b50 6f 63 61 6c 20 3d 20 6e 4b 65 79 3b 0a 20 20 20  ocal = nKey;.   
18b60 20 7d 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d   }.  }.  *pAmt =
18b70 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75 72   nLocal;.  retur
18b80 6e 20 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a  n aPayload;.}...
18b90 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e  /*.** For the en
18ba0 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20  try that cursor 
18bb0 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f  pCur is point to
18bc0 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d  , return as.** m
18bd0 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68 65  any bytes of the
18be0 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73 20   key or data as 
18bf0 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  are available on
18c00 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d   the local.** b-
18c10 74 72 65 65 20 70 61 67 65 2e 20 20 57 72 69 74  tree page.  Writ
18c20 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
18c30 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20  available bytes 
18c40 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a  into *pAmt..**.*
18c50 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65  * The pointer re
18c60 74 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65  turned is epheme
18c70 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61  ral.  The key/da
18c80 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f  ta may move.** o
18c90 72 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f  r be destroyed o
18ca0 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20  n the next call 
18cb0 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75  to any Btree rou
18cc0 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73  tine..**.** Thes
18cd0 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73  e routines is us
18ce0 65 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20  ed to get quick 
18cf0 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e  access to key an
18d00 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65  d data.** in the
18d10 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
18d20 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70  re no overflow p
18d30 61 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a  ages are used..*
18d40 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71  /.const void *sq
18d50 6c 69 74 65 33 42 74 72 65 65 4b 65 79 46 65 74  lite3BtreeKeyFet
18d60 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ch(BtCursor *pCu
18d70 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20  r, int *pAmt){. 
18d80 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
18d90 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
18da0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 63  ){.    return (c
18db0 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68  onst void*)fetch
18dc0 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41  Payload(pCur, pA
18dd0 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  mt, 0);.  }.  re
18de0 74 75 72 6e 20 30 3b 0a 7d 0a 63 6f 6e 73 74 20  turn 0;.}.const 
18df0 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72  void *sqlite3Btr
18e00 65 65 44 61 74 61 46 65 74 63 68 28 42 74 43 75  eeDataFetch(BtCu
18e10 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
18e20 2a 70 41 6d 74 29 7b 0a 20 20 69 66 28 20 70 43  *pAmt){.  if( pC
18e30 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
18e40 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
18e50 72 65 74 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f  return (const vo
18e60 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64  id*)fetchPayload
18e70 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 31 29 3b  (pCur, pAmt, 1);
18e80 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
18e90 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  .}.../*.** Move 
18ea0 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20  the cursor down 
18eb0 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70  to a new child p
18ec0 61 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67 6e  age.  The newPgn
18ed0 6f 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  o argument is th
18ee0 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72  e.** page number
18ef0 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61   of the child pa
18f00 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a  ge to move to..*
18f10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
18f20 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f  eToChild(BtCurso
18f30 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77  r *pCur, u32 new
18f40 50 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Pgno){.  int rc;
18f50 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77  .  MemPage *pNew
18f60 50 61 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20  Page;.  MemPage 
18f70 2a 70 4f 6c 64 50 61 67 65 3b 0a 20 20 42 74 53  *pOldPage;.  BtS
18f80 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75  hared *pBt = pCu
18f90 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a  r->pBtree->pBt;.
18fa0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
18fb0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
18fc0 56 41 4c 49 44 20 29 3b 0a 20 20 72 63 20 3d 20  VALID );.  rc = 
18fd0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
18fe0 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 4e  Bt, newPgno, &pN
18ff0 65 77 50 61 67 65 2c 20 70 43 75 72 2d 3e 70 50  ewPage, pCur->pP
19000 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
19010 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 4e   return rc;.  pN
19020 65 77 50 61 67 65 2d 3e 69 64 78 50 61 72 65 6e  ewPage->idxParen
19030 74 20 3d 20 70 43 75 72 2d 3e 69 64 78 3b 0a 20  t = pCur->idx;. 
19040 20 70 4f 6c 64 50 61 67 65 20 3d 20 70 43 75 72   pOldPage = pCur
19050 2d 3e 70 50 61 67 65 3b 0a 20 20 70 4f 6c 64 50  ->pPage;.  pOldP
19060 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20  age->idxShift = 
19070 30 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  0;.  releasePage
19080 28 70 4f 6c 64 50 61 67 65 29 3b 0a 20 20 70 43  (pOldPage);.  pC
19090 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 4e 65 77  ur->pPage = pNew
190a0 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 69 64  Page;.  pCur->id
190b0 78 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69  x = 0;.  pCur->i
190c0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
190d0 20 69 66 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e   if( pNewPage->n
190e0 43 65 6c 6c 3c 31 20 29 7b 0a 20 20 20 20 72 65  Cell<1 ){.    re
190f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
19100 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
19110 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19120 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
19130 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 70 61  n true if the pa
19140 67 65 20 69 73 20 74 68 65 20 76 69 72 74 75 61  ge is the virtua
19150 6c 20 72 6f 6f 74 20 6f 66 20 69 74 73 20 74 61  l root of its ta
19160 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76  ble..**.** The v
19170 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
19180 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67   is the root pag
19190 65 20 66 6f 72 20 6d 6f 73 74 20 74 61 62 6c 65  e for most table
191a0 73 2e 20 20 42 75 74 0a 2a 2a 20 66 6f 72 20 74  s.  But.** for t
191b0 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20  he table rooted 
191c0 6f 6e 20 70 61 67 65 20 31 2c 20 73 6f 6d 65 74  on page 1, somet
191d0 69 6d 65 20 74 68 65 20 72 65 61 6c 20 72 6f 6f  ime the real roo
191e0 74 20 70 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70  t page.** is emp
191f0 74 79 20 65 78 63 65 70 74 20 66 6f 72 20 74 68  ty except for th
19200 65 20 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 2e  e right-pointer.
19210 20 20 49 6e 20 73 75 63 68 20 63 61 73 65 73 20    In such cases 
19220 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72  the.** virtual r
19230 6f 6f 74 20 70 61 67 65 20 69 73 20 74 68 65 20  oot page is the 
19240 70 61 67 65 20 74 68 61 74 20 74 68 65 20 72 69  page that the ri
19250 67 68 74 2d 70 6f 69 6e 74 65 72 20 6f 66 20 70  ght-pointer of p
19260 61 67 65 0a 2a 2a 20 31 20 69 73 20 70 6f 69 6e  age.** 1 is poin
19270 74 69 6e 67 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74  ting to..*/.stat
19280 69 63 20 69 6e 74 20 69 73 52 6f 6f 74 50 61 67  ic int isRootPag
19290 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
192a0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
192b0 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70  arent = pPage->p
192c0 50 61 72 65 6e 74 3b 0a 20 20 69 66 28 20 70 50  Parent;.  if( pP
192d0 61 72 65 6e 74 3d 3d 30 20 29 20 72 65 74 75 72  arent==0 ) retur
192e0 6e 20 31 3b 0a 20 20 69 66 28 20 70 50 61 72 65  n 1;.  if( pPare
192f0 6e 74 2d 3e 70 67 6e 6f 3e 31 20 29 20 72 65 74  nt->pgno>1 ) ret
19300 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 67 65 74  urn 0;.  if( get
19310 32 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e  2byte(&pParent->
19320 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
19330 64 72 4f 66 66 73 65 74 2b 33 5d 29 3d 3d 30 20  drOffset+3])==0 
19340 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65  ) return 1;.  re
19350 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
19360 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
19370 20 75 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e   up to the paren
19380 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43  t page..**.** pC
19390 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74  ur->idx is set t
193a0 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78  o the cell index
193b0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
193c0 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f  he pointer.** to
193d0 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65   the page we are
193e0 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49   coming from.  I
193f0 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20  f we are coming 
19400 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68  from the.** righ
19410 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67  t-most child pag
19420 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78  e then pCur->idx
19430 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d   is set to one m
19440 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20  ore than.** the 
19450 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64  largest cell ind
19460 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ex..*/.static vo
19470 69 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28  id moveToParent(
19480 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
19490 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  .  MemPage *pPar
194a0 65 6e 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ent;.  MemPage *
194b0 70 50 61 67 65 3b 0a 20 20 69 6e 74 20 69 64 78  pPage;.  int idx
194c0 50 61 72 65 6e 74 3b 0a 0a 20 20 61 73 73 65 72  Parent;..  asser
194d0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
194e0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
194f0 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
19500 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74  >pPage;.  assert
19510 28 20 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20  ( pPage!=0 );.  
19520 61 73 73 65 72 74 28 20 21 69 73 52 6f 6f 74 50  assert( !isRootP
19530 61 67 65 28 70 50 61 67 65 29 20 29 3b 0a 20 20  age(pPage) );.  
19540 70 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d  pParent = pPage-
19550 3e 70 50 61 72 65 6e 74 3b 0a 20 20 61 73 73 65  >pParent;.  asse
19560 72 74 28 20 70 50 61 72 65 6e 74 21 3d 30 20 29  rt( pParent!=0 )
19570 3b 0a 20 20 69 64 78 50 61 72 65 6e 74 20 3d 20  ;.  idxParent = 
19580 70 50 61 67 65 2d 3e 69 64 78 50 61 72 65 6e 74  pPage->idxParent
19590 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72  ;.  sqlite3pager
195a0 5f 72 65 66 28 70 50 61 72 65 6e 74 2d 3e 61 44  _ref(pParent->aD
195b0 61 74 61 29 3b 0a 20 20 72 65 6c 65 61 73 65 50  ata);.  releaseP
195c0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 70 43  age(pPage);.  pC
195d0 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 50 61 72  ur->pPage = pPar
195e0 65 6e 74 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  ent;.  pCur->inf
195f0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 61  o.nSize = 0;.  a
19600 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
19610 69 64 78 53 68 69 66 74 3d 3d 30 20 29 3b 0a 20  idxShift==0 );. 
19620 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 69 64 78   pCur->idx = idx
19630 50 61 72 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Parent;.}../*.**
19640 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
19650 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67   to the root pag
19660 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
19670 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72  moveToRoot(BtCur
19680 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65  sor *pCur){.  Me
19690 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20  mPage *pRoot;.  
196a0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
196b0 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  OK;.  BtShared *
196c0 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 72  pBt = pCur->pBtr
196d0 65 65 2d 3e 70 42 74 3b 0a 0a 20 20 72 65 73 74  ee->pBt;..  rest
196e0 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72  oreOrClearCursor
196f0 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 2c 20 30  Position(pCur, 0
19700 29 3b 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75  );.  pRoot = pCu
19710 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66 28 20  r->pPage;.  if( 
19720 70 52 6f 6f 74 20 26 26 20 70 52 6f 6f 74 2d 3e  pRoot && pRoot->
19730 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f  pgno==pCur->pgno
19740 52 6f 6f 74 20 29 7b 0a 20 20 20 20 61 73 73 65  Root ){.    asse
19750 72 74 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69  rt( pRoot->isIni
19760 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t );.  }else{.  
19770 20 20 69 66 28 20 0a 20 20 20 20 20 20 53 51 4c    if( .      SQL
19780 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 67 65  ITE_OK!=(rc = ge
19790 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
197a0 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
197b0 2c 20 26 70 52 6f 6f 74 2c 20 30 29 29 0a 20 20  , &pRoot, 0)).  
197c0 20 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d    ){.      pCur-
197d0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
197e0 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
197f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
19800 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
19810 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20  (pCur->pPage);. 
19820 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d     pCur->pPage =
19830 20 70 52 6f 6f 74 3b 0a 20 20 7d 0a 20 20 70 43   pRoot;.  }.  pC
19840 75 72 2d 3e 69 64 78 20 3d 20 30 3b 0a 20 20 70  ur->idx = 0;.  p
19850 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
19860 3d 20 30 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74  = 0;.  if( pRoot
19870 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 21 70  ->nCell==0 && !p
19880 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Root->leaf ){.  
19890 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a    Pgno subpage;.
198a0 20 20 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f      assert( pRoo
198b0 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20  t->pgno==1 );.  
198c0 20 20 73 75 62 70 61 67 65 20 3d 20 67 65 74 34    subpage = get4
198d0 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61  byte(&pRoot->aDa
198e0 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66  ta[pRoot->hdrOff
198f0 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73  set+8]);.    ass
19900 65 72 74 28 20 73 75 62 70 61 67 65 3e 30 20 29  ert( subpage>0 )
19910 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  ;.    pCur->eSta
19920 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
19930 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  D;.    rc = move
19940 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75  ToChild(pCur, su
19950 62 70 61 67 65 29 3b 0a 20 20 7d 0a 20 20 70 43  bpage);.  }.  pC
19960 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 28 28 70  ur->eState = ((p
19970 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
19980 6c 3e 30 29 3f 43 55 52 53 4f 52 5f 56 41 4c 49  l>0)?CURSOR_VALI
19990 44 3a 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  D:CURSOR_INVALID
199a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
199b0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
199c0 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
199d0 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c   the left-most l
199e0 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74  eaf entry beneat
199f0 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74  h the.** entry t
19a00 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75  o which it is cu
19a10 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
19a20 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74  ..**.** The left
19a30 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68  -most leaf is th
19a40 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73  e one with the s
19a50 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68  mallest key - th
19a60 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73  e first.** in as
19a70 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a  cending order..*
19a80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
19a90 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75  eToLeftmost(BtCu
19aa0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50  rsor *pCur){.  P
19ab0 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20  gno pgno;.  int 
19ac0 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  rc;.  MemPage *p
19ad0 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
19ae0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
19af0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
19b00 20 77 68 69 6c 65 28 20 21 28 70 50 61 67 65 20   while( !(pPage 
19b10 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e  = pCur->pPage)->
19b20 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65  leaf ){.    asse
19b30 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30  rt( pCur->idx>=0
19b40 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 50   && pCur->idx<pP
19b50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
19b60 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
19b70 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
19b80 2c 20 70 43 75 72 2d 3e 69 64 78 29 29 3b 0a 20  , pCur->idx));. 
19b90 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
19ba0 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b  ild(pCur, pgno);
19bb0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
19bc0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72  turn rc;.  }.  r
19bd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
19be0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
19bf0 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
19c00 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
19c10 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65   leaf entry bene
19c20 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  ath the.** page 
19c30 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63  to which it is c
19c40 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
19c50 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64  g.  Notice the d
19c60 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74  ifference.** bet
19c70 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  ween moveToLeftm
19c80 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f  ost() and moveTo
19c90 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f  Rightmost().  mo
19ca0 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a  veToLeftmost().*
19cb0 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74  * finds the left
19cc0 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65  -most entry bene
19cd0 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20  ath the *entry* 
19ce0 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69  whereas moveToRi
19cf0 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e  ghtmost().** fin
19d00 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  ds the right-mos
19d10 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  t entry beneath 
19d20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a  the *page*..**.*
19d30 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
19d40 20 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e   entry is the on
19d50 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65  e with the large
19d60 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73  st key - the las
19d70 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65  t.** key in asce
19d80 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a  nding order..*/.
19d90 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
19da0 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72  oRightmost(BtCur
19db0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67  sor *pCur){.  Pg
19dc0 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  no pgno;.  int r
19dd0 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  c;.  MemPage *pP
19de0 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
19df0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
19e00 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
19e10 77 68 69 6c 65 28 20 21 28 70 50 61 67 65 20 3d  while( !(pPage =
19e20 20 70 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c   pCur->pPage)->l
19e30 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20  eaf ){.    pgno 
19e40 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
19e50 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
19e60 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
19e70 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 70     pCur->idx = p
19e80 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20  Page->nCell;.   
19e90 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
19ea0 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20  d(pCur, pgno);. 
19eb0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
19ec0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75  rn rc;.  }.  pCu
19ed0 72 2d 3e 69 64 78 20 3d 20 70 50 61 67 65 2d 3e  r->idx = pPage->
19ee0 6e 43 65 6c 6c 20 2d 20 31 3b 0a 20 20 70 43 75  nCell - 1;.  pCu
19ef0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
19f00 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  0;.  return SQLI
19f10 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  TE_OK;.}../* Mov
19f20 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
19f30 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
19f40 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  in the table.  R
19f50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
19f60 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ** on success.  
19f70 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69  Set *pRes to 0 i
19f80 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74  f the cursor act
19f90 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ually points to 
19fa0 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20  something.** or 
19fb0 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69  set *pRes to 1 i
19fc0 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
19fd0 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
19fe0 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28 42  ite3BtreeFirst(B
19ff0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
1a000 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
1a010 20 72 63 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65   rc;.  rc = move
1a020 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
1a030 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1a040 72 63 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  rc;.  if( pCur->
1a050 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
1a060 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 61 73  NVALID ){.    as
1a070 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67  sert( pCur->pPag
1a080 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  e->nCell==0 );. 
1a090 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
1a0a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a0b0 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  OK;.  }.  assert
1a0c0 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  ( pCur->pPage->n
1a0d0 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 2a 70 52 65  Cell>0 );.  *pRe
1a0e0 73 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6d 6f  s = 0;.  rc = mo
1a0f0 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
1a100 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
1a110 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
1a120 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61  cursor to the la
1a130 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
1a140 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53  table.  Return S
1a150 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
1a160 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52  uccess.  Set *pR
1a170 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63  es to 0 if the c
1a180 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70  ursor actually p
1a190 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69  oints to somethi
1a1a0 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52  ng.** or set *pR
1a1b0 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74  es to 1 if the t
1a1c0 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
1a1d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1a1e0 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20  eeLast(BtCursor 
1a1f0 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
1a200 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72  ){.  int rc;.  r
1a210 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
1a220 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cur);.  if( rc )
1a230 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66   return rc;.  if
1a240 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
1a250 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
1a260 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
1a270 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
1a280 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 52 65 73  ==0 );.    *pRes
1a290 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
1a2a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1a2b0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1a2c0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1a2d0 41 4c 49 44 20 29 3b 0a 20 20 2a 70 52 65 73 20  ALID );.  *pRes 
1a2e0 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65  = 0;.  rc = move
1a2f0 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72  ToRightmost(pCur
1a300 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1a310 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
1a320 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74  ursor so that it
1a330 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e   points to an en
1a340 74 72 79 20 6e 65 61 72 20 70 4b 65 79 2f 6e 4b  try near pKey/nK
1a350 65 79 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ey..** Return a 
1a360 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a  success code..**
1a370 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74  .** For INTKEY t
1a380 61 62 6c 65 73 2c 20 6f 6e 6c 79 20 74 68 65 20  ables, only the 
1a390 6e 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20 69  nKey parameter i
1a3a0 73 20 75 73 65 64 2e 20 20 70 4b 65 79 20 69 73  s used.  pKey is
1a3b0 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20 46 6f  .** ignored.  Fo
1a3c0 72 20 6f 74 68 65 72 20 74 61 62 6c 65 73 2c 20  r other tables, 
1a3d0 6e 4b 65 79 20 69 73 20 74 68 65 20 6e 75 6d 62  nKey is the numb
1a3e0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64  er of bytes of d
1a3f0 61 74 61 0a 2a 2a 20 69 6e 20 70 4b 65 79 2e 20  ata.** in pKey. 
1a400 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   The comparison 
1a410 66 75 6e 63 74 69 6f 6e 20 73 70 65 63 69 66 69  function specifi
1a420 65 64 20 77 68 65 6e 20 74 68 65 20 63 75 72 73  ed when the curs
1a430 6f 72 20 77 61 73 0a 2a 2a 20 63 72 65 61 74 65  or was.** create
1a440 64 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d  d is used to com
1a450 70 61 72 65 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a  pare keys..**.**
1a460 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74   If an exact mat
1a470 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c  ch is not found,
1a480 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
1a490 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65   is always.** le
1a4a0 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
1a4b0 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68   leaf page which
1a4c0 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20   would hold the 
1a4d0 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77  entry if it.** w
1a4e0 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68  ere present.  Th
1a4f0 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70  e cursor might p
1a500 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79  oint to an entry
1a510 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62   that comes.** b
1a520 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74  efore or after t
1a530 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  he key..**.** Th
1a540 65 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70  e result of comp
1a550 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69  aring the key wi
1a560 74 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20  th the entry to 
1a570 77 68 69 63 68 20 74 68 65 0a 2a 2a 20 63 75 72  which the.** cur
1a580 73 6f 72 20 69 73 20 77 72 69 74 74 65 6e 20 74  sor is written t
1a590 6f 20 2a 70 52 65 73 20 69 66 20 70 52 65 73 21  o *pRes if pRes!
1a5a0 3d 4e 55 4c 4c 2e 20 20 54 68 65 20 6d 65 61 6e  =NULL.  The mean
1a5b0 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 69 73 20 76  ing of.** this v
1a5c0 61 6c 75 65 20 69 73 20 61 73 20 66 6f 6c 6c 6f  alue is as follo
1a5d0 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ws:.**.**     *p
1a5e0 52 65 73 3c 30 20 20 20 20 20 20 54 68 65 20 63  Res<0      The c
1a5f0 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
1a600 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
1a610 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
1a620 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 73              is s
1a630 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 4b 65 79  maller than pKey
1a640 20 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c 65   or if the table
1a650 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20   is empty.**    
1a660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e                an
1a670 64 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  d the cursor is 
1a680 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70  therefore left p
1a690 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e  oint to nothing.
1a6a0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
1a6b0 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75 72 73  ==0     The curs
1a6c0 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
1a6d0 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
1a6e0 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
1a6f0 20 20 20 20 20 20 20 20 20 65 78 61 63 74 6c 79           exactly
1a700 20 6d 61 74 63 68 65 73 20 70 4b 65 79 2e 0a 2a   matches pKey..*
1a710 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30  *.**     *pRes>0
1a720 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72        The cursor
1a730 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
1a740 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
1a750 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
1a760 20 20 20 20 20 20 20 69 73 20 6c 61 72 67 65 72         is larger
1a770 20 74 68 61 6e 20 70 4b 65 79 2e 0a 2a 2f 0a 69   than pKey..*/.i
1a780 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  nt sqlite3BtreeM
1a790 6f 76 65 74 6f 28 42 74 43 75 72 73 6f 72 20 2a  oveto(BtCursor *
1a7a0 70 43 75 72 2c 20 63 6f 6e 73 74 20 76 6f 69 64  pCur, const void
1a7b0 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79   *pKey, i64 nKey
1a7c0 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
1a7d0 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 74 72  int rc;.  int tr
1a7e0 79 52 69 67 68 74 6d 6f 73 74 3b 0a 20 20 72 63  yRightmost;.  rc
1a7f0 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
1a800 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ur);.  if( rc ) 
1a810 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 61 73 73  return rc;.  ass
1a820 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
1a830 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1a840 75 72 2d 3e 70 50 61 67 65 2d 3e 69 73 49 6e 69  ur->pPage->isIni
1a850 74 20 29 3b 0a 20 20 74 72 79 52 69 67 68 74 6d  t );.  tryRightm
1a860 6f 73 74 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  ost = pCur->pPag
1a870 65 2d 3e 69 6e 74 4b 65 79 3b 0a 20 20 69 66 28  e->intKey;.  if(
1a880 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1a890 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
1a8a0 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b  .    *pRes = -1;
1a8b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
1a8c0 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  r->pPage->nCell=
1a8d0 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =0 );.    return
1a8e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1a8f0 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69    for(;;){.    i
1a900 6e 74 20 6c 77 72 2c 20 75 70 72 3b 0a 20 20 20  nt lwr, upr;.   
1a910 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20   Pgno chldPg;.  
1a920 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1a930 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
1a940 20 20 20 20 69 6e 74 20 63 20 3d 20 2d 31 3b 20      int c = -1; 
1a950 20 2f 2a 20 70 52 65 73 20 72 65 74 75 72 6e 20   /* pRes return 
1a960 69 66 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  if table is empt
1a970 79 20 6d 75 73 74 20 62 65 20 2d 31 20 2a 2f 0a  y must be -1 */.
1a980 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20      lwr = 0;.   
1a990 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43   upr = pPage->nC
1a9a0 65 6c 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 21  ell-1;.    if( !
1a9b0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
1a9c0 20 70 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20   pKey==0 ){.    
1a9d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a9e0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1a9f0 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 6c    }.    while( l
1aa00 77 72 3c 3d 75 70 72 20 29 7b 0a 20 20 20 20 20  wr<=upr ){.     
1aa10 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b   void *pCellKey;
1aa20 0a 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c  .      i64 nCell
1aa30 4b 65 79 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  Key;.      pCur-
1aa40 3e 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29  >idx = (lwr+upr)
1aa50 2f 32 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  /2;.      pCur->
1aa60 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
1aa70 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
1aa80 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  >intKey ){.     
1aa90 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20     u8 *pCell;.  
1aaa0 20 20 20 20 20 20 69 66 28 20 74 72 79 52 69 67        if( tryRig
1aab0 68 74 6d 6f 73 74 20 29 7b 0a 20 20 20 20 20 20  htmost ){.      
1aac0 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20      pCur->idx = 
1aad0 75 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  upr;.        }. 
1aae0 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66         pCell = f
1aaf0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
1ab00 43 75 72 2d 3e 69 64 78 29 20 2b 20 70 50 61 67  Cur->idx) + pPag
1ab10 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
1ab20 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
1ab30 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20  ge->hasData ){. 
1ab40 20 20 20 20 20 20 20 20 20 75 33 32 20 64 75 6d           u32 dum
1ab50 6d 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43  my;.          pC
1ab60 65 6c 6c 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ell += getVarint
1ab70 33 32 28 70 43 65 6c 6c 2c 20 26 64 75 6d 6d 79  32(pCell, &dummy
1ab80 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1ab90 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 28 70       getVarint(p
1aba0 43 65 6c 6c 2c 20 28 75 36 34 20 2a 29 26 6e 43  Cell, (u64 *)&nC
1abb0 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
1abc0 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 6e 4b   if( nCellKey<nK
1abd0 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
1abe0 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  c = -1;.        
1abf0 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b  }else if( nCellK
1ac00 65 79 3e 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20  ey>nKey ){.     
1ac10 20 20 20 20 20 63 20 3d 20 2b 31 3b 0a 20 20 20       c = +1;.   
1ac20 20 20 20 20 20 20 20 74 72 79 52 69 67 68 74 6d         tryRightm
1ac30 6f 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ost = 0;.       
1ac40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1ac50 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20    c = 0;.       
1ac60 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
1ac70 20 20 20 20 20 20 20 20 69 6e 74 20 61 76 61 69          int avai
1ac80 6c 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 70  lable;.        p
1ac90 43 65 6c 6c 4b 65 79 20 3d 20 28 76 6f 69 64 20  CellKey = (void 
1aca0 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70  *)fetchPayload(p
1acb0 43 75 72 2c 20 26 61 76 61 69 6c 61 62 6c 65 2c  Cur, &available,
1acc0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 65   0);.        nCe
1acd0 6c 6c 4b 65 79 20 3d 20 70 43 75 72 2d 3e 69 6e  llKey = pCur->in
1ace0 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20  fo.nKey;.       
1acf0 20 69 66 28 20 61 76 61 69 6c 61 62 6c 65 3e 3d   if( available>=
1ad00 6e 43 65 6c 6c 4b 65 79 20 29 7b 0a 20 20 20 20  nCellKey ){.    
1ad10 20 20 20 20 20 20 63 20 3d 20 70 43 75 72 2d 3e        c = pCur->
1ad20 78 43 6f 6d 70 61 72 65 28 70 43 75 72 2d 3e 70  xCompare(pCur->p
1ad30 41 72 67 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 70  Arg, nCellKey, p
1ad40 43 65 6c 6c 4b 65 79 2c 20 6e 4b 65 79 2c 20 70  CellKey, nKey, p
1ad50 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Key);.        }e
1ad60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
1ad70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65  CellKey = sqlite
1ad80 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 43 65 6c 6c  MallocRaw( nCell
1ad90 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Key );.         
1ada0 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30   if( pCellKey==0
1adb0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1adc0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
1add0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1ade0 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c 20  reeKey(pCur, 0, 
1adf0 6e 43 65 6c 6c 4b 65 79 2c 20 28 76 6f 69 64 20  nCellKey, (void 
1ae00 2a 29 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  *)pCellKey);.   
1ae10 20 20 20 20 20 20 20 63 20 3d 20 70 43 75 72 2d         c = pCur-
1ae20 3e 78 43 6f 6d 70 61 72 65 28 70 43 75 72 2d 3e  >xCompare(pCur->
1ae30 70 41 72 67 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20  pArg, nCellKey, 
1ae40 70 43 65 6c 6c 4b 65 79 2c 20 6e 4b 65 79 2c 20  pCellKey, nKey, 
1ae50 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  pKey);.         
1ae60 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 65 6c   sqliteFree(pCel
1ae70 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  lKey);.         
1ae80 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1ae90 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
1aea0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1aeb0 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   c==0 ){.       
1aec0 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
1aed0 44 61 74 61 20 26 26 20 21 70 50 61 67 65 2d 3e  Data && !pPage->
1aee0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
1aef0 20 20 6c 77 72 20 3d 20 70 43 75 72 2d 3e 69 64    lwr = pCur->id
1af00 78 3b 0a 20 20 20 20 20 20 20 20 20 20 75 70 72  x;.          upr
1af10 20 3d 20 6c 77 72 20 2d 20 31 3b 0a 20 20 20 20   = lwr - 1;.    
1af20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1af30 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1af40 20 20 20 20 20 20 69 66 28 20 70 52 65 73 20 29        if( pRes )
1af50 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
1af60 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1af70 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
1af80 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1af90 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20  if( c<0 ){.     
1afa0 20 20 20 6c 77 72 20 3d 20 70 43 75 72 2d 3e 69     lwr = pCur->i
1afb0 64 78 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  dx+1;.      }els
1afc0 65 7b 0a 20 20 20 20 20 20 20 20 75 70 72 20 3d  e{.        upr =
1afd0 20 70 43 75 72 2d 3e 69 64 78 2d 31 3b 0a 20 20   pCur->idx-1;.  
1afe0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1aff0 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70 72  assert( lwr==upr
1b000 2b 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +1 );.    assert
1b010 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
1b020 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
1b030 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
1b040 63 68 6c 64 50 67 20 3d 20 30 3b 0a 20 20 20 20  chldPg = 0;.    
1b050 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d 70  }else if( lwr>=p
1b060 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  Page->nCell ){. 
1b070 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65       chldPg = ge
1b080 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
1b090 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
1b0a0 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d  ffset+8]);.    }
1b0b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64  else{.      chld
1b0c0 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 66 69  Pg = get4byte(fi
1b0d0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77  ndCell(pPage, lw
1b0e0 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  r));.    }.    i
1b0f0 66 28 20 63 68 6c 64 50 67 3d 3d 30 20 29 7b 0a  f( chldPg==0 ){.
1b100 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
1b110 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43  ur->idx>=0 && pC
1b120 75 72 2d 3e 69 64 78 3c 70 43 75 72 2d 3e 70 50  ur->idx<pCur->pP
1b130 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
1b140 20 20 20 20 69 66 28 20 70 52 65 73 20 29 20 2a      if( pRes ) *
1b150 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20  pRes = c;.      
1b160 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1b170 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72  ;.    }.    pCur
1b180 2d 3e 69 64 78 20 3d 20 6c 77 72 3b 0a 20 20 20  ->idx = lwr;.   
1b190 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
1b1a0 65 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  e = 0;.    rc = 
1b1b0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
1b1c0 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69  , chldPg);.    i
1b1d0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
1b1e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1b1f0 20 20 7d 0a 20 20 2f 2a 20 4e 4f 54 20 52 45 41    }.  /* NOT REA
1b200 43 48 45 44 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a  CHED */.}../*.**
1b210 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
1b220 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
1b230 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
1b240 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61   entry of the ta
1b250 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20  ble..**.** TRUE 
1b260 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
1b270 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
1b280 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
1b290 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73  t() moves.** pas
1b2a0 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  t the last entry
1b2b0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72   in the table or
1b2c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
1b2d0 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a  v() moves past.*
1b2e0 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  * the first entr
1b2f0 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f  y.  TRUE is also
1b300 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
1b310 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
1b320 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1b330 74 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72  treeEof(BtCursor
1b340 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f   *pCur){.  /* TO
1b350 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65 20  DO: What if the 
1b360 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52  cursor is in CUR
1b370 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
1b380 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e  but all table en
1b390 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20  tries.  ** have 
1b3a0 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68  been deleted? Th
1b3b0 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64  is API will need
1b3c0 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65   to change to re
1b3d0 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
1b3e0 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20  de.  ** as well 
1b3f0 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72  as the boolean r
1b400 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a  esult value..  *
1b410 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52 53  /.  return (CURS
1b420 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e  OR_VALID!=pCur->
1b430 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  eState);.}../*.*
1b440 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 63 75  * Advance the cu
1b450 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  rsor to the next
1b460 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
1b470 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73  tabase.  If.** s
1b480 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73  uccessful then s
1b490 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20  et *pRes=0.  If 
1b4a0 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61  the cursor.** wa
1b4b0 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69  s already pointi
1b4c0 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  ng to the last e
1b4d0 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
1b4e0 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74  base before.** t
1b4f0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
1b500 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74  called, then set
1b510 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74   *pRes=1..*/.int
1b520 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
1b530 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
1b540 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
1b550 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67  int rc;.  MemPag
1b560 65 20 2a 70 50 61 67 65 3b 0a 0a 23 69 66 6e 64  e *pPage;..#ifnd
1b570 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1b580 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 72 63  HARED_CACHE.  rc
1b590 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61   = restoreOrClea
1b5a0 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
1b5b0 70 43 75 72 2c 20 31 29 3b 0a 20 20 69 66 28 20  pCur, 1);.  if( 
1b5c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1b5d0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1b5e0 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e    }.  if( pCur->
1b5f0 73 6b 69 70 3e 30 20 29 7b 0a 20 20 20 20 70 43  skip>0 ){.    pC
1b600 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 20 20  ur->skip = 0;.  
1b610 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
1b620 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1b630 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73  K;.  }.  pCur->s
1b640 6b 69 70 20 3d 20 30 3b 0a 23 65 6e 64 69 66 20  kip = 0;.#endif 
1b650 0a 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73  ..  assert( pRes
1b660 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 20 3d  !=0 );.  pPage =
1b670 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
1b680 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  if( CURSOR_INVAL
1b690 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
1b6a0 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
1b6b0 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
1b6c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61  LITE_OK;.  }.  a
1b6d0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
1b6e0 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74  Init );.  assert
1b6f0 28 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67  ( pCur->idx<pPag
1b700 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 70  e->nCell );..  p
1b710 43 75 72 2d 3e 69 64 78 2b 2b 3b 0a 20 20 70 43  Cur->idx++;.  pC
1b720 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
1b730 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   0;.  if( pCur->
1b740 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  idx>=pPage->nCel
1b750 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50  l ){.    if( !pP
1b760 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
1b770 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
1b780 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79  ild(pCur, get4by
1b790 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
1b7a0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
1b7b0 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66  t+8]));.      if
1b7c0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1b7d0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  ;.      rc = mov
1b7e0 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
1b7f0 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
1b800 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
1b810 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64   rc;.    }.    d
1b820 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 52  o{.      if( isR
1b830 6f 6f 74 50 61 67 65 28 70 50 61 67 65 29 20 29  ootPage(pPage) )
1b840 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20  {.        *pRes 
1b850 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75  = 1;.        pCu
1b860 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
1b870 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
1b880 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1b890 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
1b8a0 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74      moveToParent
1b8b0 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50  (pCur);.      pP
1b8c0 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
1b8d0 65 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70  e;.    }while( p
1b8e0 43 75 72 2d 3e 69 64 78 3e 3d 70 50 61 67 65 2d  Cur->idx>=pPage-
1b8f0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 2a 70  >nCell );.    *p
1b900 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  Res = 0;.    if(
1b910 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61   pPage->leafData
1b920 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1b930 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
1b940 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20  pCur, pRes);.   
1b950 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
1b960 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1b970 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
1b980 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d  c;.  }.  *pRes =
1b990 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   0;.  if( pPage-
1b9a0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74  >leaf ){.    ret
1b9b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1b9c0 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f   }.  rc = moveTo
1b9d0 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
1b9e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1b9f0 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63  /*.** Step the c
1ba00 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63  ursor to the bac
1ba10 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75  k to the previou
1ba20 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  s entry in the d
1ba30 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20  atabase.  If.** 
1ba40 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20  successful then 
1ba50 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66  set *pRes=0.  If
1ba60 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77   the cursor.** w
1ba70 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  as already point
1ba80 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73 74  ing to the first
1ba90 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
1baa0 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a  tabase before.**
1bab0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
1bac0 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73  s called, then s
1bad0 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69  et *pRes=1..*/.i
1bae0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  nt sqlite3BtreeP
1baf0 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72  revious(BtCursor
1bb00 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
1bb10 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
1bb20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 4d 65 6d  Pgno pgno;.  Mem
1bb30 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 23 69  Page *pPage;..#i
1bb40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1bb50 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
1bb60 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43   rc = restoreOrC
1bb70 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
1bb80 6f 6e 28 70 43 75 72 2c 20 31 29 3b 0a 20 20 69  on(pCur, 1);.  i
1bb90 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1bba0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
1bbb0 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75  c;.  }.  if( pCu
1bbc0 72 2d 3e 73 6b 69 70 3c 30 20 29 7b 0a 20 20 20  r->skip<0 ){.   
1bbd0 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b   pCur->skip = 0;
1bbe0 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  .    *pRes = 0;.
1bbf0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1bc00 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72  E_OK;.  }.  pCur
1bc10 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 23 65 6e 64  ->skip = 0;.#end
1bc20 69 66 0a 0a 20 20 69 66 28 20 43 55 52 53 4f 52  if..  if( CURSOR
1bc30 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
1bc40 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70  eState ){.    *p
1bc50 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Res = 1;.    ret
1bc60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1bc70 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43   }..  pPage = pC
1bc80 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73  ur->pPage;.  ass
1bc90 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
1bca0 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  it );.  assert( 
1bcb0 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 29 3b 0a  pCur->idx>=0 );.
1bcc0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
1bcd0 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d  af ){.    pgno =
1bce0 20 67 65 74 34 62 79 74 65 28 20 66 69 6e 64 43   get4byte( findC
1bcf0 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
1bd00 3e 69 64 78 29 20 29 3b 0a 20 20 20 20 72 63 20  >idx) );.    rc 
1bd10 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
1bd20 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69  ur, pgno);.    i
1bd30 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1bd40 63 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  c;.    rc = move
1bd50 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72  ToRightmost(pCur
1bd60 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1bd70 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 64 78  while( pCur->idx
1bd80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
1bd90 20 69 73 52 6f 6f 74 50 61 67 65 28 70 50 61 67   isRootPage(pPag
1bda0 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  e) ){.        pC
1bdb0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
1bdc0 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
1bdd0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
1bde0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
1bdf0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
1be00 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61  }.      moveToPa
1be10 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20  rent(pCur);.    
1be20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
1be30 70 50 61 67 65 3b 0a 20 20 20 20 7d 0a 20 20 20  pPage;.    }.   
1be40 20 70 43 75 72 2d 3e 69 64 78 2d 2d 3b 0a 20 20   pCur->idx--;.  
1be50 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
1be60 7a 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ze = 0;.    if( 
1be70 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20  pPage->leafData 
1be80 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  && !pPage->leaf 
1be90 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
1bea0 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
1beb0 75 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  us(pCur, pRes);.
1bec0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1bed0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1bee0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 52  .    }.  }.  *pR
1bef0 65 73 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  es = 0;.  return
1bf00 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c   rc;.}../*.** Al
1bf10 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
1bf20 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  e from the datab
1bf30 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
1bf40 54 68 65 20 6e 65 77 20 70 61 67 65 20 69 73 20  The new page is 
1bf50 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e  marked as dirty.
1bf60 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64    (In other word
1bf70 73 2c 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  s, sqlite3pager_
1bf80 77 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61  write().** has a
1bf90 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c  lready been call
1bfa0 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61  ed on the new pa
1bfb0 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61  ge.)  The new pa
1bfc0 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62  ge has also.** b
1bfd0 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61  een referenced a
1bfe0 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72  nd the calling r
1bff0 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e  outine is respon
1c000 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e  sible for callin
1c010 67 0a 2a 2a 20 73 71 6c 69 74 65 33 70 61 67 65  g.** sqlite3page
1c020 72 5f 75 6e 72 65 66 28 29 20 6f 6e 20 74 68 65  r_unref() on the
1c030 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20 69   new page when i
1c040 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a  t is done..**.**
1c050 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1c060 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73  turned on succes
1c070 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65  s.  Any other re
1c080 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63  turn value indic
1c090 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  ates.** an error
1c0a0 2e 20 20 2a 70 70 50 61 67 65 20 61 6e 64 20 2a  .  *ppPage and *
1c0b0 70 50 67 6e 6f 20 61 72 65 20 75 6e 64 65 66 69  pPgno are undefi
1c0c0 6e 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74  ned in the event
1c0d0 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a   of an error..**
1c0e0 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73   Do not invoke s
1c0f0 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
1c100 66 28 29 20 6f 6e 20 2a 70 70 50 61 67 65 20 69  f() on *ppPage i
1c110 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65  f an error is re
1c120 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
1c130 20 74 68 65 20 22 6e 65 61 72 62 79 22 20 70 61   the "nearby" pa
1c140 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30  rameter is not 0
1c150 2c 20 74 68 65 6e 20 61 20 28 66 65 65 62 6c 65  , then a (feeble
1c160 29 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65  ) effort is made
1c170 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61   to .** locate a
1c180 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74   page close to t
1c190 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22  he page number "
1c1a0 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73 20 63  nearby".  This c
1c1b0 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e  an be used in an
1c1c0 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b  .** attempt to k
1c1d0 65 65 70 20 72 65 6c 61 74 65 64 20 70 61 67 65  eep related page
1c1e0 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20  s close to each 
1c1f0 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64 61 74  other in the dat
1c200 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77  abase file,.** w
1c210 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e  hich in turn can
1c220 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20 61   make database a
1c230 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a  ccess faster..**
1c240 0a 2a 2a 20 49 66 20 74 68 65 20 22 65 78 61 63  .** If the "exac
1c250 74 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  t" parameter is 
1c260 6e 6f 74 20 30 2c 20 61 6e 64 20 74 68 65 20 70  not 0, and the p
1c270 61 67 65 2d 6e 75 6d 62 65 72 20 6e 65 61 72 62  age-number nearb
1c280 79 20 65 78 69 73 74 73 20 0a 2a 2a 20 61 6e 79  y exists .** any
1c290 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65  where on the fre
1c2a0 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20  e-list, then it 
1c2b0 69 73 20 67 75 61 72 65 6e 74 65 65 64 20 74 6f  is guarenteed to
1c2c0 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68   be returned. Th
1c2d0 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 75 73  is.** is only us
1c2e0 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75  ed by auto-vacuu
1c2f0 6d 20 64 61 74 61 62 61 73 65 73 20 77 68 65 6e  m databases when
1c300 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65   allocating a ne
1c310 77 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  w table..*/.stat
1c320 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 50  ic int allocateP
1c330 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
1c340 2a 70 42 74 2c 20 0a 20 20 4d 65 6d 50 61 67 65  *pBt, .  MemPage
1c350 20 2a 2a 70 70 50 61 67 65 2c 20 0a 20 20 50 67   **ppPage, .  Pg
1c360 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a 20 20 50 67  no *pPgno, .  Pg
1c370 6e 6f 20 6e 65 61 72 62 79 2c 0a 20 20 75 38 20  no nearby,.  u8 
1c380 65 78 61 63 74 0a 29 7b 0a 20 20 4d 65 6d 50 61  exact.){.  MemPa
1c390 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e  ge *pPage1;.  in
1c3a0 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 3b 20 20  t rc;.  int n;  
1c3b0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1c3c0 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
1c3d0 65 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6b  elist */.  int k
1c3e0 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
1c3f0 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 65  of leaves on the
1c400 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66 72   trunk of the fr
1c410 65 65 6c 69 73 74 20 2a 2f 0a 0a 20 20 70 50 61  eelist */..  pPa
1c420 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
1c430 31 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74  1;.  n = get4byt
1c440 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1c450 5b 33 36 5d 29 3b 0a 20 20 69 66 28 20 6e 3e 30  [36]);.  if( n>0
1c460 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65   ){.    /* There
1c470 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74 68   are pages on th
1c480 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 75  e freelist.  Reu
1c490 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20  se one of those 
1c4a0 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 4d 65  pages. */.    Me
1c4b0 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20  mPage *pTrunk = 
1c4c0 30 3b 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75  0;.    Pgno iTru
1c4d0 6e 6b 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  nk;.    MemPage 
1c4e0 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b  *pPrevTrunk = 0;
1c4f0 0a 20 20 20 20 75 38 20 73 65 61 72 63 68 4c 69  .    u8 searchLi
1c500 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68  st = 0; /* If th
1c510 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74  e free-list must
1c520 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72   be searched for
1c530 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20   'nearby' */.   
1c540 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20   .    /* If the 
1c550 27 65 78 61 63 74 27 20 70 61 72 61 6d 65 74 65  'exact' paramete
1c560 72 20 77 61 73 20 74 72 75 65 20 61 6e 64 20 61  r was true and a
1c570 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 70 6f   query of the po
1c580 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a  inter-map.    **
1c590 20 73 68 6f 77 73 20 74 68 61 74 20 74 68 65 20   shows that the 
1c5a0 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73  page 'nearby' is
1c5b0 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74 68   somewhere on th
1c5c0 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65  e free-list, the
1c5d0 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74  n.    ** the ent
1c5e0 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65  ire-list will be
1c5f0 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68   searched for th
1c600 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  at page..    */.
1c610 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1c620 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1c630 20 20 20 69 66 28 20 65 78 61 63 74 20 29 7b 0a     if( exact ){.
1c640 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a        u8 eType;.
1c650 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 65        assert( ne
1c660 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20  arby>0 );.      
1c670 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
1c680 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20  oVacuum );.     
1c690 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
1c6a0 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54  pBt, nearby, &eT
1c6b0 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ype, 0);.      i
1c6c0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1c6d0 63 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  c;.      if( eTy
1c6e0 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe==PTRMAP_FREEP
1c6f0 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 73  AGE ){.        s
1c700 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20  earchList = 1;. 
1c710 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 50       }.      *pP
1c720 67 6e 6f 20 3d 20 6e 65 61 72 62 79 3b 0a 20 20  gno = nearby;.  
1c730 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
1c740 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
1c750 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74   free-list count
1c760 20 62 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e   by 1. Set iTrun
1c770 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  k to the index o
1c780 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72  f the.    ** fir
1c790 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  st free-list tru
1c7a0 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54 72  nk page. iPrevTr
1c7b0 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  unk is initially
1c7c0 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72   1..    */.    r
1c7d0 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
1c7e0 5f 77 72 69 74 65 28 70 50 61 67 65 31 2d 3e 61  _write(pPage1->a
1c7f0 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 72  Data);.    if( r
1c800 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1c810 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
1c820 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
1c830 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  n-1);..    /* Th
1c840 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68  e code within th
1c850 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f  is loop is run o
1c860 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20  nly once if the 
1c870 27 73 65 61 72 63 68 4c 69 73 74 27 20 76 61 72  'searchList' var
1c880 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20  iable.    ** is 
1c890 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77  not true. Otherw
1c8a0 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63  ise, it runs onc
1c8b0 65 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b  e for each trunk
1c8c0 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20 20  -page on the.   
1c8d0 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 6e   ** free-list un
1c8e0 74 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e 65  til the page 'ne
1c8f0 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64  arby' is located
1c900 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20  ..    */.    do 
1c910 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75  {.      pPrevTru
1c920 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  nk = pTrunk;.   
1c930 20 20 20 69 66 28 20 70 50 72 65 76 54 72 75 6e     if( pPrevTrun
1c940 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54 72  k ){.        iTr
1c950 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
1c960 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
1c970 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  a[0]);.      }el
1c980 73 65 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75  se{.        iTru
1c990 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
1c9a0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
1c9b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1c9c0 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70 42   rc = getPage(pB
1c9d0 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75  t, iTrunk, &pTru
1c9e0 6e 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  nk);.      if( r
1c9f0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  c ){.        rel
1ca00 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72  easePage(pPrevTr
1ca10 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 72 65  unk);.        re
1ca20 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1ca30 0a 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a  ..      /* TODO:
1ca40 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6d 6f 76   This should mov
1ca50 65 20 74 6f 20 61 66 74 65 72 20 74 68 65 20 6c  e to after the l
1ca60 6f 6f 70 3f 20 2a 2f 0a 20 20 20 20 20 20 72 63  oop? */.      rc
1ca70 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
1ca80 77 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 61 44  write(pTrunk->aD
1ca90 61 74 61 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ata);.      if( 
1caa0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  rc ){.        re
1cab0 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b  leasePage(pTrunk
1cac0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
1cad0 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e  sePage(pPrevTrun
1cae0 6b 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  k);.        retu
1caf0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a  rn rc;.      }..
1cb00 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79        k = get4by
1cb10 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
1cb20 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  a[4]);.      if(
1cb30 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68   k==0 && !search
1cb40 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
1cb50 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73  /* The trunk has
1cb60 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74   no leaves and t
1cb70 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62  he list is not b
1cb80 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a  eing searched. .
1cb90 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78          ** So ex
1cba0 74 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20  tract the trunk 
1cbb0 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20  page itself and 
1cbc0 75 73 65 20 69 74 20 61 73 20 74 68 65 20 6e 65  use it as the ne
1cbd0 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  wly .        ** 
1cbe0 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a  allocated page *
1cbf0 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
1cc00 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20  ( pPrevTrunk==0 
1cc10 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e  );.        *pPgn
1cc20 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  o = iTrunk;.    
1cc30 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
1cc40 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26  e1->aData[32], &
1cc50 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
1cc60 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70  , 4);.        *p
1cc70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a  pPage = pTrunk;.
1cc80 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
1cc90 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43   0;.        TRAC
1cca0 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
1ccb0 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65   trunk - %d free
1ccc0 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20   pages left\n", 
1ccd0 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20  *pPgno, n-1));. 
1cce0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b       }else if( k
1ccf0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
1cd00 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20  /4 - 8 ){.      
1cd10 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20    /* Value of k 
1cd20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  is out of range.
1cd30 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75    Database corru
1cd40 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ption */.       
1cd50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1cd60 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 23 69 66  ORRUPT_BKPT;.#if
1cd70 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1cd80 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
1cd90 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72    }else if( sear
1cda0 63 68 4c 69 73 74 20 26 26 20 6e 65 61 72 62 79  chList && nearby
1cdb0 3d 3d 69 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  ==iTrunk ){.    
1cdc0 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20      /* The list 
1cdd0 69 73 20 62 65 69 6e 67 20 73 65 61 72 63 68 65  is being searche
1cde0 64 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b  d and this trunk
1cdf0 20 70 61 67 65 20 69 73 20 74 68 65 20 70 61 67   page is the pag
1ce00 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  e.        ** to 
1ce10 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64  allocate, regard
1ce20 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
1ce30 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20  it has leaves.. 
1ce40 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1ce50 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
1ce60 3d 3d 69 54 72 75 6e 6b 20 29 3b 0a 20 20 20 20  ==iTrunk );.    
1ce70 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54      *ppPage = pT
1ce80 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73 65  runk;.        se
1ce90 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20  archList = 0;.  
1cea0 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29        if( k==0 )
1ceb0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
1cec0 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
1ced0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
1cee0 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
1cef0 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
1cf00 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
1cf10 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1cf20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
1cf30 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
1cf40 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[0], &pTrunk-
1cf50 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
1cf60 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1cf70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1cf80 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
1cf90 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65   page is require
1cfa0 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
1cfb0 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  but it contains 
1cfc0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  .          ** po
1cfd0 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c  inters to free-l
1cfe0 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20  ist leaves. The 
1cff0 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d  first leaf becom
1d000 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20  es a trunk.     
1d010 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20       ** page in 
1d020 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20  this case..     
1d030 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1d040 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54    MemPage *pNewT
1d050 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  runk;.          
1d060 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d  Pgno iNewTrunk =
1d070 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
1d080 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20  k->aData[8]);.  
1d090 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74          rc = get
1d0a0 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77 54 72  Page(pBt, iNewTr
1d0b0 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b 29  unk, &pNewTrunk)
1d0c0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1d0d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1d0e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c  .            rel
1d0f0 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29  easePage(pTrunk)
1d100 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
1d110 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54  leasePage(pPrevT
1d120 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
1d130 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1d140 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d150 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1d160 70 61 67 65 72 5f 77 72 69 74 65 28 70 4e 65 77  pager_write(pNew
1d170 54 72 75 6e 6b 2d 3e 61 44 61 74 61 29 3b 0a 20  Trunk->aData);. 
1d180 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1d190 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d1a0 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
1d1b0 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29  ePage(pNewTrunk)
1d1c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
1d1d0 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b  leasePage(pTrunk
1d1e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
1d1f0 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76  eleasePage(pPrev
1d200 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
1d210 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1d220 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1d230 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65       memcpy(&pNe
1d240 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  wTrunk->aData[0]
1d250 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
1d260 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
1d270 20 20 20 70 75 74 34 62 79 74 65 28 26 70 4e 65     put4byte(&pNe
1d280 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  wTrunk->aData[4]
1d290 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  , k-1);.        
1d2a0 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72    memcpy(&pNewTr
1d2b0 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26  unk->aData[8], &
1d2c0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32  pTrunk->aData[12
1d2d0 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20  ], (k-1)*4);.   
1d2e0 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65         if( !pPre
1d2f0 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  vTrunk ){.      
1d300 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1d310 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
1d320 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ], iNewTrunk);. 
1d330 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
1d340 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34              put4
1d350 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b  byte(&pPrevTrunk
1d360 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77  ->aData[0], iNew
1d370 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
1d380 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 65    }.          re
1d390 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72  leasePage(pNewTr
1d3a0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  unk);.        }.
1d3b0 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
1d3c0 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43   0;.        TRAC
1d3d0 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
1d3e0 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65   trunk - %d free
1d3f0 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20   pages left\n", 
1d400 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23  *pPgno, n-1));.#
1d410 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73  endif.      }els
1d420 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78  e{.        /* Ex
1d430 74 72 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f  tract a leaf fro
1d440 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20  m the trunk */. 
1d450 20 20 20 20 20 20 20 69 6e 74 20 63 6c 6f 73 65         int close
1d460 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f  st;.        Pgno
1d470 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
1d480 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
1d490 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61  Data = pTrunk->a
1d4a0 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 69 66  Data;.        if
1d4b0 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20  ( nearby>0 ){.  
1d4c0 20 20 20 20 20 20 20 20 69 6e 74 20 69 2c 20 64          int i, d
1d4d0 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ist;.          c
1d4e0 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20  losest = 0;.    
1d4f0 20 20 20 20 20 20 64 69 73 74 20 3d 20 67 65 74        dist = get
1d500 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29  4byte(&aData[8])
1d510 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20   - nearby;.     
1d520 20 20 20 20 20 69 66 28 20 64 69 73 74 3c 30 20       if( dist<0 
1d530 29 20 64 69 73 74 20 3d 20 2d 64 69 73 74 3b 0a  ) dist = -dist;.
1d540 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
1d550 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20  1; i<k; i++){.  
1d560 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 32            int d2
1d570 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61   = get4byte(&aDa
1d580 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61  ta[8+i*4]) - nea
1d590 72 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rby;.           
1d5a0 20 69 66 28 20 64 32 3c 30 20 29 20 64 32 20 3d   if( d2<0 ) d2 =
1d5b0 20 2d 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20   -d2;.          
1d5c0 20 20 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b    if( d2<dist ){
1d5d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
1d5e0 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20  losest = i;.    
1d5f0 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
1d600 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20   d2;.           
1d610 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
1d620 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1d630 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
1d640 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  = 0;.        }..
1d650 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20          iPage = 
1d660 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
1d670 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20  8+closest*4]);. 
1d680 20 20 20 20 20 20 20 69 66 28 20 21 73 65 61 72         if( !sear
1d690 63 68 4c 69 73 74 20 7c 7c 20 69 50 61 67 65 3d  chList || iPage=
1d6a0 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20  =nearby ){.     
1d6b0 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50       *pPgno = iP
1d6c0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69  age;.          i
1d6d0 66 28 20 2a 70 50 67 6e 6f 3e 73 71 6c 69 74 65  f( *pPgno>sqlite
1d6e0 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74  3pager_pagecount
1d6f0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b  (pBt->pPager) ){
1d700 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
1d710 46 72 65 65 20 70 61 67 65 20 6f 66 66 20 74 68  Free page off th
1d720 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
1d730 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
1d740 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1d750 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1d760 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1d770 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
1d780 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66  ATE: %d was leaf
1d790 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75   %d of %d on tru
1d7a0 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20 20  nk %d".         
1d7b0 20 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f          ": %d mo
1d7c0 72 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22  re free pages\n"
1d7d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1d7e0 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65     *pPgno, close
1d7f0 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d  st+1, k, pTrunk-
1d800 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20  >pgno, n-1));.  
1d810 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73          if( clos
1d820 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20  est<k-1 ){.     
1d830 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61         memcpy(&a
1d840 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34  Data[8+closest*4
1d850 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d  ], &aData[4+k*4]
1d860 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
1d870 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  }.          put4
1d880 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20  byte(&aData[4], 
1d890 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  k-1);.          
1d8a0 72 63 20 3d 20 67 65 74 50 61 67 65 28 70 42 74  rc = getPage(pBt
1d8b0 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65  , *pPgno, ppPage
1d8c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1d8d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1d8e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
1d8f0 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f  lite3pager_dont_
1d900 72 6f 6c 6c 62 61 63 6b 28 28 2a 70 70 50 61 67  rollback((*ppPag
1d910 65 29 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  e)->aData);.    
1d920 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1d930 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28  ite3pager_write(
1d940 28 2a 70 70 50 61 67 65 29 2d 3e 61 44 61 74 61  (*ppPage)->aData
1d950 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
1d960 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1d970 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1d980 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
1d990 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
1d9a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1d9b0 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72  }.          sear
1d9c0 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  chList = 0;.    
1d9d0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1d9e0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1d9f0 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20  pPrevTrunk);.   
1da00 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c   }while( searchL
1da10 69 73 74 20 29 3b 0a 20 20 20 20 72 65 6c 65 61  ist );.    relea
1da20 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a  sePage(pTrunk);.
1da30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1da40 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61 67  There are no pag
1da50 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
1da60 73 74 2c 20 73 6f 20 63 72 65 61 74 65 20 61 20  st, so create a 
1da70 6e 65 77 20 70 61 67 65 20 61 74 20 74 68 65 0a  new page at the.
1da80 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68      ** end of th
1da90 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 2a 70  e file */.    *p
1daa0 50 67 6e 6f 20 3d 20 73 71 6c 69 74 65 33 70 61  Pgno = sqlite3pa
1dab0 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 42  ger_pagecount(pB
1dac0 74 2d 3e 70 50 61 67 65 72 29 20 2b 20 31 3b 0a  t->pPager) + 1;.
1dad0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1dae0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1daf0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
1db00 6f 56 61 63 75 75 6d 20 26 26 20 50 54 52 4d 41  oVacuum && PTRMA
1db10 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 2a 70  P_ISPAGE(pBt, *p
1db20 50 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 2f  Pgno) ){.      /
1db30 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65  * If *pPgno refe
1db40 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d  rs to a pointer-
1db50 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61  map page, alloca
1db60 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73  te two new pages
1db70 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65  .      ** at the
1db80 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
1db90 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e   instead of one.
1dba0 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63   The first alloc
1dbb0 61 74 65 64 20 70 61 67 65 0a 20 20 20 20 20 20  ated page.      
1dbc0 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77  ** becomes a new
1dbd0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
1dbe0 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73  e, the second is
1dbf0 20 75 73 65 64 20 62 79 20 74 68 65 20 63 61 6c   used by the cal
1dc00 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ler..      */.  
1dc10 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
1dc20 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e  CATE: %d from en
1dc30 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74  d of file (point
1dc40 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c  er-map page)\n",
1dc50 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20   *pPgno));.     
1dc60 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21   assert( *pPgno!
1dc70 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1dc80 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20  GE(pBt) );.     
1dc90 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20   (*pPgno)++;.   
1dca0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 61   }.#endif..    a
1dcb0 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50  ssert( *pPgno!=P
1dcc0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1dcd0 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63 20  (pBt) );.    rc 
1dce0 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c 20 2a  = getPage(pBt, *
1dcf0 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 29 3b 0a  pPgno, ppPage);.
1dd00 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
1dd10 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  urn rc;.    rc =
1dd20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
1dd30 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 61  ite((*ppPage)->a
1dd40 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 72  Data);.    if( r
1dd50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1dd60 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1dd70 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
1dd80 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 41 4c  }.    TRACE(("AL
1dd90 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
1dda0 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20  end of file\n", 
1ddb0 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20  *pPgno));.  }.. 
1ddc0 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21   assert( *pPgno!
1ddd0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1dde0 47 45 28 70 42 74 29 20 29 3b 0a 20 20 72 65 74  GE(pBt) );.  ret
1ddf0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1de00 20 41 64 64 20 61 20 70 61 67 65 20 6f 66 20 74   Add a page of t
1de10 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1de20 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
1de30 2e 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 70  ..**.** sqlite3p
1de40 61 67 65 72 5f 75 6e 72 65 66 28 29 20 69 73 20  ager_unref() is 
1de50 4e 4f 54 20 63 61 6c 6c 65 64 20 66 6f 72 20 70  NOT called for p
1de60 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Page..*/.static 
1de70 69 6e 74 20 66 72 65 65 50 61 67 65 28 4d 65 6d  int freePage(Mem
1de80 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
1de90 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1dea0 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 4d 65  pPage->pBt;.  Me
1deb0 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
1dec0 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 69  pBt->pPage1;.  i
1ded0 6e 74 20 72 63 2c 20 6e 2c 20 6b 3b 0a 0a 20 20  nt rc, n, k;..  
1dee0 2f 2a 20 50 72 65 70 61 72 65 20 74 68 65 20 70  /* Prepare the p
1def0 61 67 65 20 66 6f 72 20 66 72 65 65 69 6e 67 20  age for freeing 
1df00 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
1df10 67 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20 20  ge->pgno>1 );.  
1df20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
1df30 30 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  0;.  releasePage
1df40 28 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 29  (pPage->pParent)
1df50 3b 0a 20 20 70 50 61 67 65 2d 3e 70 50 61 72 65  ;.  pPage->pPare
1df60 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 6e  nt = 0;..  /* In
1df70 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65  crement the free
1df80 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70   page count on p
1df90 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20  Page1 */.  rc = 
1dfa0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
1dfb0 74 65 28 70 50 61 67 65 31 2d 3e 61 44 61 74 61  te(pPage1->aData
1dfc0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
1dfd0 74 75 72 6e 20 72 63 3b 0a 20 20 6e 20 3d 20 67  turn rc;.  n = g
1dfe0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
1dff0 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70  >aData[36]);.  p
1e000 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
1e010 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2b 31 29  >aData[36], n+1)
1e020 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
1e030 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20  _SECURE_DELETE. 
1e040 20 2f 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54   /* If the SQLIT
1e050 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  E_SECURE_DELETE 
1e060 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
1e070 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20  ion is enabled, 
1e080 74 68 65 6e 0a 20 20 2a 2a 20 61 6c 77 61 79 73  then.  ** always
1e090 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65   fully overwrite
1e0a0 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61   deleted informa
1e0b0 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e  tion with zeros.
1e0c0 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
1e0d0 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28  ite3pager_write(
1e0e0 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20  pPage->aData);. 
1e0f0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1e100 20 72 63 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50   rc;.  memset(pP
1e110 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70  age->aData, 0, p
1e120 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53  Page->pBt->pageS
1e130 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  ize);.#endif..#i
1e140 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1e150 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f  T_AUTOVACUUM.  /
1e160 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
1e170 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d  e supports auto-
1e180 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61 6e  vacuum, write an
1e190 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f   entry in the po
1e1a0 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74  inter-map.  ** t
1e1b0 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  o indicate that 
1e1c0 74 68 65 20 70 61 67 65 20 69 73 20 66 72 65 65  the page is free
1e1d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
1e1e0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
1e1f0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
1e200 75 74 28 70 42 74 2c 20 70 50 61 67 65 2d 3e 70  ut(pBt, pPage->p
1e210 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 46 52 45 45  gno, PTRMAP_FREE
1e220 50 41 47 45 2c 20 30 29 3b 0a 20 20 20 20 69 66  PAGE, 0);.    if
1e230 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1e240 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
1e250 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  if( n==0 ){.    
1e260 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 66  /* This is the f
1e270 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20 2a  irst free page *
1e280 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
1e290 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 70 50  e3pager_write(pP
1e2a0 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  age->aData);.   
1e2b0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1e2c0 20 72 63 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28   rc;.    memset(
1e2d0 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c  pPage->aData, 0,
1e2e0 20 38 29 3b 0a 20 20 20 20 70 75 74 34 62 79 74   8);.    put4byt
1e2f0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1e300 5b 33 32 5d 2c 20 70 50 61 67 65 2d 3e 70 67 6e  [32], pPage->pgn
1e310 6f 29 3b 0a 20 20 20 20 54 52 41 43 45 28 28 22  o);.    TRACE(("
1e320 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 66 69  FREE-PAGE: %d fi
1e330 72 73 74 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70  rst\n", pPage->p
1e340 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  gno));.  }else{.
1e350 20 20 20 20 2f 2a 20 4f 74 68 65 72 20 66 72 65      /* Other fre
1e360 65 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20  e pages already 
1e370 65 78 69 73 74 2e 20 20 52 65 74 72 69 76 65 20  exist.  Retrive 
1e380 74 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b 20  the first trunk 
1e390 70 61 67 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74  page.    ** of t
1e3a0 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e 64 20  he freelist and 
1e3b0 66 69 6e 64 20 6f 75 74 20 68 6f 77 20 6d 61 6e  find out how man
1e3c0 79 20 6c 65 61 76 65 73 20 69 74 20 68 61 73 2e  y leaves it has.
1e3d0 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   */.    MemPage 
1e3e0 2a 70 54 72 75 6e 6b 3b 0a 20 20 20 20 72 63 20  *pTrunk;.    rc 
1e3f0 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c 20 67  = getPage(pBt, g
1e400 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
1e410 3e 61 44 61 74 61 5b 33 32 5d 29 2c 20 26 70 54  >aData[32]), &pT
1e420 72 75 6e 6b 29 3b 0a 20 20 20 20 69 66 28 20 72  runk);.    if( r
1e430 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1e440 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28     k = get4byte(
1e450 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
1e460 5d 29 3b 0a 20 20 20 20 69 66 28 20 6b 3e 3d 70  ]);.    if( k>=p
1e470 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34  Bt->usableSize/4
1e480 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a   - 8 ){.      /*
1e490 20 54 68 65 20 74 72 75 6e 6b 20 69 73 20 66 75   The trunk is fu
1e4a0 6c 6c 2e 20 20 54 75 72 6e 20 74 68 65 20 70 61  ll.  Turn the pa
1e4b0 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 20 69  ge being freed i
1e4c0 6e 74 6f 20 61 20 6e 65 77 0a 20 20 20 20 20 20  nto a new.      
1e4d0 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 77 69  ** trunk page wi
1e4e0 74 68 20 6e 6f 20 6c 65 61 76 65 73 2e 20 2a 2f  th no leaves. */
1e4f0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1e500 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 70  te3pager_write(p
1e510 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20  Page->aData);.  
1e520 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
1e530 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 75  urn rc;.      pu
1e540 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
1e550 61 74 61 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e  ata, pTrunk->pgn
1e560 6f 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  o);.      put4by
1e570 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
1e580 5b 34 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  [4], 0);.      p
1e590 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
1e5a0 3e 61 44 61 74 61 5b 33 32 5d 2c 20 70 50 61 67  >aData[32], pPag
1e5b0 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  e->pgno);.      
1e5c0 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47  TRACE(("FREE-PAG
1e5d0 45 3a 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20  E: %d new trunk 
1e5e0 70 61 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25  page replacing %
1e5f0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
1e600 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c      pPage->pgno,
1e610 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b   pTrunk->pgno));
1e620 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e630 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77    /* Add the new
1e640 6c 79 20 66 72 65 65 64 20 70 61 67 65 20 61 73  ly freed page as
1e650 20 61 20 6c 65 61 66 20 6f 6e 20 74 68 65 20 63   a leaf on the c
1e660 75 72 72 65 6e 74 20 74 72 75 6e 6b 20 2a 2f 0a  urrent trunk */.
1e670 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1e680 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 70 54  e3pager_write(pT
1e690 72 75 6e 6b 2d 3e 61 44 61 74 61 29 3b 0a 20 20  runk->aData);.  
1e6a0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
1e6b0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 75  urn rc;.      pu
1e6c0 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
1e6d0 61 44 61 74 61 5b 34 5d 2c 20 6b 2b 31 29 3b 0a  aData[4], k+1);.
1e6e0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1e6f0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b  pTrunk->aData[8+
1e700 6b 2a 34 5d 2c 20 70 50 61 67 65 2d 3e 70 67 6e  k*4], pPage->pgn
1e710 6f 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  o);.#ifndef SQLI
1e720 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
1e730 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61  .      sqlite3pa
1e740 67 65 72 5f 64 6f 6e 74 5f 77 72 69 74 65 28 70  ger_dont_write(p
1e750 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 50 61 67  Bt->pPager, pPag
1e760 65 2d 3e 70 67 6e 6f 29 3b 0a 23 65 6e 64 69 66  e->pgno);.#endif
1e770 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46  .      TRACE(("F
1e780 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61  REE-PAGE: %d lea
1e790 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20  f on trunk page 
1e7a0 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e  %d\n",pPage->pgn
1e7b0 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29  o,pTrunk->pgno))
1e7c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65  ;.    }.    rele
1e7d0 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b  asePage(pTrunk);
1e7e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1e7f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
1e800 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
1e810 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
1e820 74 68 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c  th the given Cel
1e830 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
1e840 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50 61   clearCell(MemPa
1e850 67 65 20 2a 70 50 61 67 65 2c 20 75 6e 73 69 67  ge *pPage, unsig
1e860 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 29  ned char *pCell)
1e870 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
1e880 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
1e890 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
1e8a0 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f  .  Pgno ovflPgno
1e8b0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 70  ;.  int rc;..  p
1e8c0 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
1e8d0 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
1e8e0 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76  ;.  if( info.iOv
1e8f0 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20  erflow==0 ){.   
1e900 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1e910 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c  K;  /* No overfl
1e920 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e  ow pages. Return
1e930 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
1e940 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20  nything */.  }. 
1e950 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34   ovflPgno = get4
1e960 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
1e970 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20  .iOverflow]);.  
1e980 77 68 69 6c 65 28 20 6f 76 66 6c 50 67 6e 6f 21  while( ovflPgno!
1e990 3d 30 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  =0 ){.    MemPag
1e9a0 65 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20 69 66  e *pOvfl;.    if
1e9b0 28 20 6f 76 66 6c 50 67 6e 6f 3e 73 71 6c 69 74  ( ovflPgno>sqlit
1e9c0 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e  e3pager_pagecoun
1e9d0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29  t(pBt->pPager) )
1e9e0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
1e9f0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1ea00 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  PT;.    }.    rc
1ea10 20 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c 20   = getPage(pBt, 
1ea20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c  ovflPgno, &pOvfl
1ea30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
1ea40 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f  return rc;.    o
1ea50 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  vflPgno = get4by
1ea60 74 65 28 70 4f 76 66 6c 2d 3e 61 44 61 74 61 29  te(pOvfl->aData)
1ea70 3b 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65 50  ;.    rc = freeP
1ea80 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20  age(pOvfl);.    
1ea90 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72  sqlite3pager_unr
1eaa0 65 66 28 70 4f 76 66 6c 2d 3e 61 44 61 74 61 29  ef(pOvfl->aData)
1eab0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
1eac0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
1ead0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1eae0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
1eaf0 65 20 74 68 65 20 62 79 74 65 20 73 65 71 75 65  e the byte seque
1eb00 6e 63 65 20 75 73 65 64 20 74 6f 20 72 65 70 72  nce used to repr
1eb10 65 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20  esent a cell on 
1eb20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e  page pPage.** an
1eb30 64 20 77 72 69 74 65 20 74 68 61 74 20 62 79 74  d write that byt
1eb40 65 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20  e sequence into 
1eb50 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c  pCell[].  Overfl
1eb60 6f 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20  ow pages are.** 
1eb70 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69  allocated and fi
1eb80 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73  lled in as neces
1eb90 73 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69  sary.  The calli
1eba0 6e 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20  ng procedure.** 
1ebb0 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
1ebc0 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73  or making sure s
1ebd0 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
1ebe0 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
1ebf0 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b  ed.** for pCell[
1ec00 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  ]..**.** Note th
1ec10 61 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f  at pCell does no
1ec20 74 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64  t necessary need
1ec30 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
1ec40 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a   pPage->aData.**
1ec50 20 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69   area.  pCell mi
1ec60 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d  ght point to som
1ec70 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72  e temporary stor
1ec80 61 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77  age.  The cell w
1ec90 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72  ill.** be constr
1eca0 75 63 74 65 64 20 69 6e 20 74 68 69 73 20 74 65  ucted in this te
1ecb0 6d 70 6f 72 61 72 79 20 61 72 65 61 20 74 68 65  mporary area the
1ecc0 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50  n copied into pP
1ecd0 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61  age->aData.** la
1ece0 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ter..*/.static i
1ecf0 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20  nt fillInCell(. 
1ed00 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
1ed10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74  /* The page that
1ed30 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65   contains the ce
1ed40 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ll */.  unsigned
1ed50 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20   char *pCell,   
1ed60 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65         /* Comple
1ed70 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 63  te text of the c
1ed80 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  ell */.  const v
1ed90 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e  oid *pKey, i64 n
1eda0 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b  Key,    /* The k
1edb0 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  ey */.  const vo
1edc0 69 64 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44  id *pData,int nD
1edd0 61 74 61 2c 20 20 20 2f 2a 20 54 68 65 20 64 61  ata,   /* The da
1ede0 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53  ta */.  int *pnS
1edf0 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ize             
1ee00 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
1ee10 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a  cell size here *
1ee20 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c  /.){.  int nPayl
1ee30 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20  oad;.  const u8 
1ee40 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72  *pSrc;.  int nSr
1ee50 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20  c, n, rc;.  int 
1ee60 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d  spaceLeft;.  Mem
1ee70 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b  Page *pOvfl = 0;
1ee80 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52  .  MemPage *pToR
1ee90 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e  elease = 0;.  un
1eea0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72  signed char *pPr
1eeb0 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  ior;.  unsigned 
1eec0 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a  char *pPayload;.
1eed0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1eee0 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
1eef0 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20  Pgno pgnoOvfl = 
1ef00 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72  0;.  int nHeader
1ef10 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  ;.  CellInfo inf
1ef20 6f 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  o;..  /* Fill in
1ef30 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a   the header. */.
1ef40 20 20 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a 20    nHeader = 0;. 
1ef50 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
1ef60 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72  f ){.    nHeader
1ef70 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66 28   += 4;.  }.  if(
1ef80 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
1ef90 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b  ){.    nHeader +
1efa0 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65  = putVarint(&pCe
1efb0 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44 61  ll[nHeader], nDa
1efc0 74 61 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ta);.  }else{.  
1efd0 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d    nData = 0;.  }
1efe0 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75  .  nHeader += pu
1eff0 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e  tVarint(&pCell[n
1f000 48 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29  Header], *(u64*)
1f010 26 6e 4b 65 79 29 3b 0a 20 20 70 61 72 73 65 43  &nKey);.  parseC
1f020 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
1f030 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61  ell, &info);.  a
1f040 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65 61  ssert( info.nHea
1f050 64 65 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b 0a  der==nHeader );.
1f060 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e    assert( info.n
1f070 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 61  Key==nKey );.  a
1f080 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61 74  ssert( info.nDat
1f090 61 3d 3d 6e 44 61 74 61 20 29 3b 0a 20 20 0a 20  a==nData );.  . 
1f0a0 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
1f0b0 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50 61  payload */.  nPa
1f0c0 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61 3b 0a 20  yload = nData;. 
1f0d0 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
1f0e0 65 79 20 29 7b 0a 20 20 20 20 70 53 72 63 20 3d  ey ){.    pSrc =
1f0f0 20 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63   pData;.    nSrc
1f100 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44   = nData;.    nD
1f110 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ata = 0;.  }else
1f120 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b  {.    nPayload +
1f130 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63  = nKey;.    pSrc
1f140 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72   = pKey;.    nSr
1f150 63 20 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20  c = nKey;.  }.  
1f160 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e  *pnSize = info.n
1f170 53 69 7a 65 3b 0a 20 20 73 70 61 63 65 4c 65 66  Size;.  spaceLef
1f180 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b  t = info.nLocal;
1f190 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70  .  pPayload = &p
1f1a0 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 20  Cell[nHeader];. 
1f1b0 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c   pPrior = &pCell
1f1c0 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
1f1d0 3b 0a 0a 20 20 77 68 69 6c 65 28 20 6e 50 61 79  ;..  while( nPay
1f1e0 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20 69 66  load>0 ){.    if
1f1f0 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29  ( spaceLeft==0 )
1f200 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
1f210 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1f220 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  .      Pgno pgno
1f230 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66  Ptrmap = pgnoOvf
1f240 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70  l; /* Overflow p
1f250 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  age pointer-map 
1f260 65 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a 23 65  entry page */.#e
1f270 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20  ndif.      rc = 
1f280 61 6c 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74  allocatePage(pBt
1f290 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f  , &pOvfl, &pgnoO
1f2a0 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30  vfl, pgnoOvfl, 0
1f2b0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
1f2c0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1f2d0 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  M.      /* If th
1f2e0 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f  e database suppo
1f2f0 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c  rts auto-vacuum,
1f300 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20   and the second 
1f310 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20  or subsequent.  
1f320 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20      ** overflow 
1f330 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c  page is being al
1f340 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20  located, add an 
1f350 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69  entry to the poi
1f360 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a  nter-map.      *
1f370 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 20  * for that page 
1f380 6e 6f 77 2e 20 54 68 65 20 65 6e 74 72 79 20 66  now. The entry f
1f390 6f 72 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  or the first ove
1f3a0 72 66 6c 6f 77 20 70 61 67 65 20 77 69 6c 6c 20  rflow page will 
1f3b0 62 65 0a 20 20 20 20 20 20 2a 2a 20 61 64 64 65  be.      ** adde
1f3c0 64 20 6c 61 74 65 72 2c 20 62 79 20 74 68 65 20  d later, by the 
1f3d0 69 6e 73 65 72 74 43 65 6c 6c 28 29 20 72 6f 75  insertCell() rou
1f3e0 74 69 6e 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tine..      */. 
1f3f0 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75       if( pBt->au
1f400 74 6f 56 61 63 75 75 6d 20 26 26 20 70 67 6e 6f  toVacuum && pgno
1f410 50 74 72 6d 61 70 21 3d 30 20 26 26 20 72 63 3d  Ptrmap!=0 && rc=
1f420 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1f430 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
1f440 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76  pPut(pBt, pgnoOv
1f450 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
1f460 4c 4f 57 32 2c 20 70 67 6e 6f 50 74 72 6d 61 70  LOW2, pgnoPtrmap
1f470 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
1f480 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  f.      if( rc )
1f490 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
1f4a0 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
1f4b0 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 6c  );.        /* cl
1f4c0 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  earCell(pPage, p
1f4d0 43 65 6c 6c 29 3b 20 2a 2f 0a 20 20 20 20 20 20  Cell); */.      
1f4e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1f4f0 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62     }.      put4b
1f500 79 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f  yte(pPrior, pgno
1f510 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c  Ovfl);.      rel
1f520 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
1f530 61 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52  ase);.      pToR
1f540 65 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a  elease = pOvfl;.
1f550 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70        pPrior = p
1f560 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Ovfl->aData;.   
1f570 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69     put4byte(pPri
1f580 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  or, 0);.      pP
1f590 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d  ayload = &pOvfl-
1f5a0 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20  >aData[4];.     
1f5b0 20 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74   spaceLeft = pBt
1f5c0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
1f5d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20  ;.    }.    n = 
1f5e0 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66  nPayload;.    if
1f5f0 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20  ( n>spaceLeft ) 
1f600 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 20  n = spaceLeft;. 
1f610 20 20 20 69 66 28 20 6e 3e 6e 53 72 63 20 29 20     if( n>nSrc ) 
1f620 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 61 73  n = nSrc;.    as
1f630 73 65 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20  sert( pSrc );.  
1f640 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61    memcpy(pPayloa
1f650 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20  d, pSrc, n);.   
1f660 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a   nPayload -= n;.
1f670 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20      pPayload += 
1f680 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e  n;.    pSrc += n
1f690 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b  ;.    nSrc -= n;
1f6a0 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d  .    spaceLeft -
1f6b0 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 72  = n;.    if( nSr
1f6c0 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53  c==0 ){.      nS
1f6d0 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20  rc = nData;.    
1f6e0 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a    pSrc = pData;.
1f6f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65      }.  }.  rele
1f700 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61  asePage(pToRelea
1f710 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  se);.  return SQ
1f720 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1f730 2a 20 43 68 61 6e 67 65 20 74 68 65 20 4d 65 6d  * Change the Mem
1f740 50 61 67 65 2e 70 50 61 72 65 6e 74 20 70 6f 69  Page.pParent poi
1f750 6e 74 65 72 20 6f 6e 20 74 68 65 20 70 61 67 65  nter on the page
1f760 20 77 68 6f 73 65 20 6e 75 6d 62 65 72 20 69 73   whose number is
1f770 0a 2a 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65  .** given in the
1f780 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
1f790 20 73 6f 20 74 68 61 74 20 4d 65 6d 50 61 67 65   so that MemPage
1f7a0 2e 70 50 61 72 65 6e 74 20 68 6f 6c 64 73 20 74  .pParent holds t
1f7b0 68 65 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e  he.** pointer in
1f7c0 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   the third argum
1f7d0 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
1f7e0 6e 74 20 72 65 70 61 72 65 6e 74 50 61 67 65 28  nt reparentPage(
1f7f0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
1f800 67 6e 6f 20 70 67 6e 6f 2c 20 4d 65 6d 50 61 67  gno pgno, MemPag
1f810 65 20 2a 70 4e 65 77 50 61 72 65 6e 74 2c 20 69  e *pNewParent, i
1f820 6e 74 20 69 64 78 29 7b 0a 20 20 4d 65 6d 50 61  nt idx){.  MemPa
1f830 67 65 20 2a 70 54 68 69 73 3b 0a 20 20 75 6e 73  ge *pThis;.  uns
1f840 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74  igned char *aDat
1f850 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e  a;..  assert( pN
1f860 65 77 50 61 72 65 6e 74 21 3d 30 20 29 3b 0a 20  ewParent!=0 );. 
1f870 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 20 72   if( pgno==0 ) r
1f880 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1f890 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
1f8a0 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61  pPager!=0 );.  a
1f8b0 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 70 61  Data = sqlite3pa
1f8c0 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 42 74 2d 3e  ger_lookup(pBt->
1f8d0 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
1f8e0 20 69 66 28 20 61 44 61 74 61 20 29 7b 0a 20 20   if( aData ){.  
1f8f0 20 20 70 54 68 69 73 20 3d 20 28 4d 65 6d 50 61    pThis = (MemPa
1f900 67 65 2a 29 26 61 44 61 74 61 5b 70 42 74 2d 3e  ge*)&aData[pBt->
1f910 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20 20 20 61  pageSize];.    a
1f920 73 73 65 72 74 28 20 70 54 68 69 73 2d 3e 61 44  ssert( pThis->aD
1f930 61 74 61 3d 3d 61 44 61 74 61 20 29 3b 0a 20 20  ata==aData );.  
1f940 20 20 69 66 28 20 70 54 68 69 73 2d 3e 69 73 49    if( pThis->isI
1f950 6e 69 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  nit ){.      if(
1f960 20 70 54 68 69 73 2d 3e 70 50 61 72 65 6e 74 21   pThis->pParent!
1f970 3d 70 4e 65 77 50 61 72 65 6e 74 20 29 7b 0a 20  =pNewParent ){. 
1f980 20 20 20 20 20 20 20 69 66 28 20 70 54 68 69 73         if( pThis
1f990 2d 3e 70 50 61 72 65 6e 74 20 29 20 73 71 6c 69  ->pParent ) sqli
1f9a0 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70  te3pager_unref(p
1f9b0 54 68 69 73 2d 3e 70 50 61 72 65 6e 74 2d 3e 61  This->pParent->a
1f9c0 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 70  Data);.        p
1f9d0 54 68 69 73 2d 3e 70 50 61 72 65 6e 74 20 3d 20  This->pParent = 
1f9e0 70 4e 65 77 50 61 72 65 6e 74 3b 0a 20 20 20 20  pNewParent;.    
1f9f0 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
1fa00 5f 72 65 66 28 70 4e 65 77 50 61 72 65 6e 74 2d  _ref(pNewParent-
1fa10 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 7d  >aData);.      }
1fa20 0a 20 20 20 20 20 20 70 54 68 69 73 2d 3e 69 64  .      pThis->id
1fa30 78 50 61 72 65 6e 74 20 3d 20 69 64 78 3b 0a 20  xParent = idx;. 
1fa40 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1fa50 70 61 67 65 72 5f 75 6e 72 65 66 28 61 44 61 74  pager_unref(aDat
1fa60 61 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  a);.  }..#ifndef
1fa70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1fa80 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20 70 42  OVACUUM.  if( pB
1fa90 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
1faa0 0a 20 20 20 20 72 65 74 75 72 6e 20 70 74 72 6d  .    return ptrm
1fab0 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 2c  apPut(pBt, pgno,
1fac0 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
1fad0 4e 65 77 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29  NewParent->pgno)
1fae0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
1faf0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1fb00 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  .}..../*.** Chan
1fb10 67 65 20 74 68 65 20 70 50 61 72 65 6e 74 20 70  ge the pParent p
1fb20 6f 69 6e 74 65 72 20 6f 66 20 61 6c 6c 20 63 68  ointer of all ch
1fb30 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 67 65 20  ildren of pPage 
1fb40 74 6f 20 70 6f 69 6e 74 20 62 61 63 6b 0a 2a 2a  to point back.**
1fb50 20 74 6f 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a   to pPage..**.**
1fb60 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
1fb70 20 66 6f 72 20 65 76 65 72 79 20 63 68 69 6c 64   for every child
1fb80 20 6f 66 20 70 50 61 67 65 2c 20 69 6e 76 6f 6b   of pPage, invok
1fb90 65 20 72 65 70 61 72 65 6e 74 50 61 67 65 28 29  e reparentPage()
1fba0 0a 2a 2a 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  .** to make sure
1fbb0 20 74 68 61 74 20 65 61 63 68 20 63 68 69 6c 64   that each child
1fbc0 20 6b 6e 6f 77 73 20 74 68 61 74 20 70 50 61 67   knows that pPag
1fbd0 65 20 69 73 20 69 74 73 20 70 61 72 65 6e 74 2e  e is its parent.
1fbe0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1fbf0 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64 20  ine gets called 
1fc00 61 66 74 65 72 20 79 6f 75 20 6d 65 6d 63 70 79  after you memcpy
1fc10 28 29 20 6f 6e 65 20 70 61 67 65 20 69 6e 74 6f  () one page into
1fc20 0a 2a 2a 20 61 6e 6f 74 68 65 72 2e 0a 2a 2f 0a  .** another..*/.
1fc30 73 74 61 74 69 63 20 69 6e 74 20 72 65 70 61 72  static int repar
1fc40 65 6e 74 43 68 69 6c 64 50 61 67 65 73 28 4d 65  entChildPages(Me
1fc50 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
1fc60 20 69 6e 74 20 69 3b 0a 20 20 42 74 53 68 61 72   int i;.  BtShar
1fc70 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
1fc80 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  >pBt;.  int rc =
1fc90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
1fca0 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
1fcb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1fcc0 4b 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  K;..  for(i=0; i
1fcd0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69  <pPage->nCell; i
1fce0 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65  ++){.    u8 *pCe
1fcf0 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
1fd00 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 69 66 28  age, i);.    if(
1fd10 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
1fd20 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 70 61  .      rc = repa
1fd30 72 65 6e 74 50 61 67 65 28 70 42 74 2c 20 67 65  rentPage(pBt, ge
1fd40 74 34 62 79 74 65 28 70 43 65 6c 6c 29 2c 20 70  t4byte(pCell), p
1fd50 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20  Page, i);.      
1fd60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1fd70 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
1fd80 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21     }.  }.  if( !
1fd90 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
1fda0 20 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74     rc = reparent
1fdb0 50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62 79  Page(pBt, get4by
1fdc0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
1fdd0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
1fde0 74 2b 38 5d 29 2c 20 0a 20 20 20 20 20 20 20 70  t+8]), .       p
1fdf0 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 70 50  Page, i);.    pP
1fe00 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20  age->idxShift = 
1fe10 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
1fe20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d  rc;.}../*.** Rem
1fe30 6f 76 65 20 74 68 65 20 69 2d 74 68 20 63 65 6c  ove the i-th cel
1fe40 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 20 20 54  l from pPage.  T
1fe50 68 69 73 20 72 6f 75 74 69 6e 65 20 65 66 66 65  his routine effe
1fe60 63 74 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a  cts pPage only..
1fe70 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74  ** The cell cont
1fe80 65 6e 74 20 69 73 20 6e 6f 74 20 66 72 65 65 64  ent is not freed
1fe90 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e   or deallocated.
1fea0 20 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20    It is assumed 
1feb0 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c  that.** the cell
1fec0 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65 65   content has bee
1fed0 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61  n copied somepla
1fee0 63 65 20 65 6c 73 65 2e 20 20 54 68 69 73 20 72  ce else.  This r
1fef0 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72  outine just.** r
1ff00 65 6d 6f 76 65 73 20 74 68 65 20 72 65 66 65 72  emoves the refer
1ff10 65 6e 63 65 20 74 6f 20 74 68 65 20 63 65 6c 6c  ence to the cell
1ff20 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a   from pPage..**.
1ff30 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20 62 65 20  ** "sz" must be 
1ff40 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
1ff50 74 65 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e  tes in the cell.
1ff60 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1ff70 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65  dropCell(MemPage
1ff80 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 64 78   *pPage, int idx
1ff90 2c 20 69 6e 74 20 73 7a 29 7b 0a 20 20 69 6e 74  , int sz){.  int
1ffa0 20 69 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   i;          /* 
1ffb0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
1ffc0 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20    int pc;       
1ffd0 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63    /* Offset to c
1ffe0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63  ell content of c
1fff0 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65  ell being delete
20000 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  d */.  u8 *data;
20010 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d         /* pPage-
20020 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a  >aData */.  u8 *
20030 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55  ptr;        /* U
20040 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65  sed to move byte
20050 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20  s around within 
20060 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 61 73 73  data[] */..  ass
20070 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69  ert( idx>=0 && i
20080 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  dx<pPage->nCell 
20090 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d  );.  assert( sz=
200a0 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c  =cellSize(pPage,
200b0 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72   idx) );.  asser
200c0 74 28 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  t( sqlite3pager_
200d0 69 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  iswriteable(pPag
200e0 65 2d 3e 61 44 61 74 61 29 20 29 3b 0a 20 20 64  e->aData) );.  d
200f0 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
20100 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 64 61 74  ta;.  ptr = &dat
20110 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  a[pPage->cellOff
20120 73 65 74 20 2b 20 32 2a 69 64 78 5d 3b 0a 20 20  set + 2*idx];.  
20130 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 74  pc = get2byte(pt
20140 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 63  r);.  assert( pc
20150 3e 31 30 20 26 26 20 70 63 2b 73 7a 3c 3d 70 50  >10 && pc+sz<=pP
20160 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
20170 53 69 7a 65 20 29 3b 0a 20 20 66 72 65 65 53 70  Size );.  freeSp
20180 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73  ace(pPage, pc, s
20190 7a 29 3b 0a 20 20 66 6f 72 28 69 3d 69 64 78 2b  z);.  for(i=idx+
201a0 31 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  1; i<pPage->nCel
201b0 6c 3b 20 69 2b 2b 2c 20 70 74 72 2b 3d 32 29 7b  l; i++, ptr+=2){
201c0 0a 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74  .    ptr[0] = pt
201d0 72 5b 32 5d 3b 0a 20 20 20 20 70 74 72 5b 31 5d  r[2];.    ptr[1]
201e0 20 3d 20 70 74 72 5b 33 5d 3b 0a 20 20 7d 0a 20   = ptr[3];.  }. 
201f0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b   pPage->nCell--;
20200 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
20210 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
20220 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43  et+3], pPage->nC
20230 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ell);.  pPage->n
20240 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20 70 50 61  Free += 2;.  pPa
20250 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 31  ge->idxShift = 1
20260 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  ;.}../*.** Inser
20270 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20  t a new cell on 
20280 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e  pPage at cell in
20290 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20  dex "i".  pCell 
202a0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a  points to the.**
202b0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
202c0 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  cell..**.** If t
202d0 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
202e0 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20  will fit on the 
202f0 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69  page, then put i
20300 74 20 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a  t there.  If it.
20310 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c  ** will not fit,
20320 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70   then make a cop
20330 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  y of the cell co
20340 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70  ntent into pTemp
20350 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20   if.** pTemp is 
20360 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72  not null.  Regar
20370 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20  dless of pTemp, 
20380 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65  allocate a new e
20390 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65  ntry.** in pPage
203a0 2d 3e 61 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61  ->aOvfl[] and ma
203b0 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74  ke it point to t
203c0 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
203d0 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54  (either.** in pT
203e0 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69  emp or the origi
203f0 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61  nal pCell) and a
20400 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69  lso record its i
20410 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61  ndex. .** Alloca
20420 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79  ting a new entry
20430 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c   in pPage->aCell
20440 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20  [] implies that 
20450 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  .** pPage->nOver
20460 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e  flow is incremen
20470 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53  ted..**.** If nS
20480 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  kip is non-zero,
20490 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70   then do not cop
204a0 79 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69  y the first nSki
204b0 70 20 62 79 74 65 73 20 6f 66 20 74 68 65 0a 2a  p bytes of the.*
204c0 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c  * cell. The call
204d0 65 72 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74  er will overwrit
204e0 65 20 74 68 65 6d 20 61 66 74 65 72 20 74 68 69  e them after thi
204f0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
20500 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20  ns. If.** nSkip 
20510 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
20520 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20  n pCell may not 
20530 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61  point to an inva
20540 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  lid memory locat
20550 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70 43 65  ion .** (but pCe
20560 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c 77 61  ll+nSkip is alwa
20570 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74  ys valid)..*/.st
20580 61 74 69 63 20 69 6e 74 20 69 6e 73 65 72 74 43  atic int insertC
20590 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
205a0 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65  pPage,   /* Page
205b0 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61   into which we a
205c0 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20  re copying */.  
205d0 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20 20  int i,          
205e0 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65    /* New cell be
205f0 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63  comes the i-th c
20600 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20  ell of the page 
20610 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
20620 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e         /* Conten
20630 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c  t of the new cel
20640 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20  l */.  int sz,  
20650 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
20660 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20  s of content in 
20670 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70  pCell */.  u8 *p
20680 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20  Temp,        /* 
20690 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61  Temp storage spa
206a0 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66  ce for pCell, if
206b0 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 75 38 20   needed */.  u8 
206c0 6e 53 6b 69 70 20 20 20 20 20 20 20 20 20 20 2f  nSkip          /
206d0 2a 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 20 74  * Do not write t
206e0 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62  he first nSkip b
206f0 79 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c  ytes of the cell
20700 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78   */.){.  int idx
20710 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68  ;          /* Wh
20720 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77  ere to write new
20730 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e   cell content in
20740 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
20750 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   j;            /
20760 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
20770 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20  /.  int top;    
20780 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
20790 79 74 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20 66  yte of content f
207a0 6f 72 20 61 6e 79 20 63 65 6c 6c 20 69 6e 20 64  or any cell in d
207b0 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 65  ata[] */.  int e
207c0 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nd;          /* 
207d0 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  First byte past 
207e0 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f  the last cell po
207f0 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20  inter in data[] 
20800 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 3b 20 20 20  */.  int ins;   
20810 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
20820 69 6e 20 64 61 74 61 5b 5d 20 77 68 65 72 65 20  in data[] where 
20830 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  new cell pointer
20840 20 69 73 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a   is inserted */.
20850 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20    int hdr;      
20860 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
20870 74 6f 20 64 61 74 61 5b 5d 20 6f 66 20 74 68 65  to data[] of the
20880 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
20890 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74    int cellOffset
208a0 3b 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f  ;   /* Address o
208b0 66 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69  f first cell poi
208c0 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a  nter in data[] *
208d0 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
208e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
208f0 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c  tent of the whol
20900 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  e page */.  u8 *
20910 70 74 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ptr;          /*
20920 20 55 73 65 64 20 66 6f 72 20 6d 6f 76 69 6e 67   Used for moving
20930 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 72 6f   information aro
20940 75 6e 64 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  und in data[] */
20950 0a 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30  ..  assert( i>=0
20960 20 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43   && i<=pPage->nC
20970 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72  ell+pPage->nOver
20980 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74  flow );.  assert
20990 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74  ( sz==cellSizePt
209a0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20  r(pPage, pCell) 
209b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
209c0 69 74 65 33 70 61 67 65 72 5f 69 73 77 72 69 74  ite3pager_iswrit
209d0 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 61 44 61  eable(pPage->aDa
209e0 74 61 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61  ta) );.  if( pPa
209f0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c  ge->nOverflow ||
20a00 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72   sz+2>pPage->nFr
20a10 65 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54  ee ){.    if( pT
20a20 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  emp ){.      mem
20a30 63 70 79 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c  cpy(pTemp+nSkip,
20a40 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a   pCell+nSkip, sz
20a50 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 70  -nSkip);.      p
20a60 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20  Cell = pTemp;.  
20a70 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61 67    }.    j = pPag
20a80 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a  e->nOverflow++;.
20a90 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 73 69      assert( j<si
20aa0 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66  zeof(pPage->aOvf
20ab0 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61 67 65 2d  l)/sizeof(pPage-
20ac0 3e 61 4f 76 66 6c 5b 30 5d 29 20 29 3b 0a 20 20  >aOvfl[0]) );.  
20ad0 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a    pPage->aOvfl[j
20ae0 5d 2e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b  ].pCell = pCell;
20af0 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66  .    pPage->aOvf
20b00 6c 5b 6a 5d 2e 69 64 78 20 3d 20 69 3b 0a 20 20  l[j].idx = i;.  
20b10 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
20b20 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
20b30 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
20b40 44 61 74 61 3b 0a 20 20 20 20 68 64 72 20 3d 20  Data;.    hdr = 
20b50 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
20b60 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
20b70 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
20b80 5d 29 3b 0a 20 20 20 20 63 65 6c 6c 4f 66 66 73  ]);.    cellOffs
20b90 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  et = pPage->cell
20ba0 4f 66 66 73 65 74 3b 0a 20 20 20 20 65 6e 64 20  Offset;.    end 
20bb0 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
20bc0 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2b 20  *pPage->nCell + 
20bd0 32 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63 65 6c  2;.    ins = cel
20be0 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20  lOffset + 2*i;. 
20bf0 20 20 20 69 66 28 20 65 6e 64 20 3e 20 74 6f 70     if( end > top
20c00 20 2d 20 73 7a 20 29 7b 0a 20 20 20 20 20 20 69   - sz ){.      i
20c10 6e 74 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65  nt rc = defragme
20c20 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  ntPage(pPage);. 
20c30 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
20c40 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
20c50 72 63 3b 0a 20 20 20 20 20 20 74 6f 70 20 3d 20  rc;.      top = 
20c60 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
20c70 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20 61 73  dr+5]);.      as
20c80 73 65 72 74 28 20 65 6e 64 20 2b 20 73 7a 20 3c  sert( end + sz <
20c90 3d 20 74 6f 70 20 29 3b 0a 20 20 20 20 7d 0a 20  = top );.    }. 
20ca0 20 20 20 69 64 78 20 3d 20 61 6c 6c 6f 63 61 74     idx = allocat
20cb0 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a  eSpace(pPage, sz
20cc0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
20cd0 64 78 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65  dx>0 );.    asse
20ce0 72 74 28 20 65 6e 64 20 3c 3d 20 67 65 74 32 62  rt( end <= get2b
20cf0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
20d00 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) );.    pPage->
20d10 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61  nCell++;.    pPa
20d20 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 32 3b 0a  ge->nFree -= 2;.
20d30 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
20d40 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c 20 70 43 65  [idx+nSkip], pCe
20d50 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b  ll+nSkip, sz-nSk
20d60 69 70 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 65  ip);.    for(j=e
20d70 6e 64 2d 32 2c 20 70 74 72 3d 26 64 61 74 61 5b  nd-2, ptr=&data[
20d80 6a 5d 3b 20 6a 3e 69 6e 73 3b 20 6a 2d 3d 32 2c  j]; j>ins; j-=2,
20d90 20 70 74 72 2d 3d 32 29 7b 0a 20 20 20 20 20 20   ptr-=2){.      
20da0 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b 2d 32 5d  ptr[0] = ptr[-2]
20db0 3b 0a 20 20 20 20 20 20 70 74 72 5b 31 5d 20 3d  ;.      ptr[1] =
20dc0 20 70 74 72 5b 2d 31 5d 3b 0a 20 20 20 20 7d 0a   ptr[-1];.    }.
20dd0 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
20de0 74 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20  ta[ins], idx);. 
20df0 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
20e00 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d  a[hdr+3], pPage-
20e10 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61  >nCell);.    pPa
20e20 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 31  ge->idxShift = 1
20e30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
20e40 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
20e50 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
20e60 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
20e70 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
20e80 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e  cell may contain
20e90 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
20ea0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
20eb0 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20  If so, write.   
20ec0 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20     ** the entry 
20ed0 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
20ee0 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70   page into the p
20ef0 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20  ointer map..    
20f00 20 20 2a 2f 0a 20 20 20 20 20 20 43 65 6c 6c 49    */.      CellI
20f10 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20  nfo info;.      
20f20 70 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  parseCellPtr(pPa
20f30 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
20f40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 6e  );.      if( (in
20f50 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d  fo.nData+(pPage-
20f60 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e  >intKey?0:info.n
20f70 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  Key))>info.nLoca
20f80 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e  l ){.        Pgn
20f90 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 67 65 74  o pgnoOvfl = get
20fa0 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
20fb0 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20  o.iOverflow]);. 
20fc0 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20         int rc = 
20fd0 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d  ptrmapPut(pPage-
20fe0 3e 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  >pBt, pgnoOvfl, 
20ff0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
21000 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
21010 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
21020 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
21030 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
21040 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
21050 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
21060 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  _OK;.}../*.** Ad
21070 64 20 61 20 6c 69 73 74 20 6f 66 20 63 65 6c 6c  d a list of cell
21080 73 20 74 6f 20 61 20 70 61 67 65 2e 20 20 54 68  s to a page.  Th
21090 65 20 70 61 67 65 20 73 68 6f 75 6c 64 20 62 65  e page should be
210a0 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79   initially empty
210b0 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20 61  ..** The cells a
210c0 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  re guaranteed to
210d0 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65   fit on the page
210e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
210f0 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 0a 20   assemblePage(. 
21100 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
21110 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
21120 6f 20 62 65 20 61 73 73 65 6d 62 6c 69 65 64 20  o be assemblied 
21130 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20  */.  int nCell, 
21140 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75         /* The nu
21150 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f  mber of cells to
21160 20 61 64 64 20 74 6f 20 74 68 69 73 20 70 61 67   add to this pag
21170 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
21180 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ll,      /* Poin
21190 74 65 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f 64  ters to cell bod
211a0 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 53  ies */.  int *aS
211b0 69 7a 65 20 20 20 20 20 20 20 20 2f 2a 20 53 69  ize        /* Si
211c0 7a 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 73  zes of the cells
211d0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20   */.){.  int i; 
211e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
211f0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
21200 69 6e 74 20 74 6f 74 61 6c 53 69 7a 65 3b 20 20  int totalSize;  
21210 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
21220 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a  of all cells */.
21230 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20    int hdr;      
21240 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
21250 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
21260 20 69 6e 74 20 63 65 6c 6c 70 74 72 3b 20 20 20   int cellptr;   
21270 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
21280 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74   next cell point
21290 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  er */.  int cell
212a0 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20 41 64 64  body;     /* Add
212b0 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c  ress of next cel
212c0 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a  l body */.  u8 *
212d0 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a  data;         /*
212e0 20 44 61 74 61 20 66 6f 72 20 74 68 65 20 70 61   Data for the pa
212f0 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ge */..  assert(
21300 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
21310 77 3d 3d 30 20 29 3b 0a 20 20 74 6f 74 61 6c 53  w==0 );.  totalS
21320 69 7a 65 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  ize = 0;.  for(i
21330 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
21340 29 7b 0a 20 20 20 20 74 6f 74 61 6c 53 69 7a 65  ){.    totalSize
21350 20 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20   += aSize[i];.  
21360 7d 0a 20 20 61 73 73 65 72 74 28 20 74 6f 74 61  }.  assert( tota
21370 6c 53 69 7a 65 2b 32 2a 6e 43 65 6c 6c 3c 3d 70  lSize+2*nCell<=p
21380 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 3b 0a 20  Page->nFree );. 
21390 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
213a0 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 63 65  nCell==0 );.  ce
213b0 6c 6c 70 74 72 20 3d 20 70 50 61 67 65 2d 3e 63  llptr = pPage->c
213c0 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 64 61 74  ellOffset;.  dat
213d0 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
213e0 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
213f0 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 70 75  >hdrOffset;.  pu
21400 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
21410 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20 69  +3], nCell);.  i
21420 66 28 20 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  f( nCell ){.    
21430 63 65 6c 6c 62 6f 64 79 20 3d 20 61 6c 6c 6f 63  cellbody = alloc
21440 61 74 65 53 70 61 63 65 28 70 50 61 67 65 2c 20  ateSpace(pPage, 
21450 74 6f 74 61 6c 53 69 7a 65 29 3b 0a 20 20 20 20  totalSize);.    
21460 61 73 73 65 72 74 28 20 63 65 6c 6c 62 6f 64 79  assert( cellbody
21470 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >0 );.    assert
21480 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3e  ( pPage->nFree >
21490 3d 20 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  = 2*nCell );.   
214a0 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d   pPage->nFree -=
214b0 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 20 20 66 6f   2*nCell;.    fo
214c0 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
214d0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 75 74 32  i++){.      put2
214e0 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 70  byte(&data[cellp
214f0 74 72 5d 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a  tr], cellbody);.
21500 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61        memcpy(&da
21510 74 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c 20 61 70  ta[cellbody], ap
21520 43 65 6c 6c 5b 69 5d 2c 20 61 53 69 7a 65 5b 69  Cell[i], aSize[i
21530 5d 29 3b 0a 20 20 20 20 20 20 63 65 6c 6c 70 74  ]);.      cellpt
21540 72 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 63 65  r += 2;.      ce
21550 6c 6c 62 6f 64 79 20 2b 3d 20 61 53 69 7a 65 5b  llbody += aSize[
21560 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  i];.    }.    as
21570 73 65 72 74 28 20 63 65 6c 6c 62 6f 64 79 3d 3d  sert( cellbody==
21580 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
21590 6c 65 53 69 7a 65 20 29 3b 0a 20 20 7d 0a 20 20  leSize );.  }.  
215a0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 6e  pPage->nCell = n
215b0 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Cell;.}../*.** T
215c0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72  he following par
215d0 61 6d 65 74 65 72 73 20 64 65 74 65 72 6d 69 6e  ameters determin
215e0 65 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63  e how many adjac
215f0 65 6e 74 20 70 61 67 65 73 20 67 65 74 20 69 6e  ent pages get in
21600 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62  volved.** in a b
21610 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69  alancing operati
21620 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65 20 6e  on.  NN is the n
21630 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f  umber of neighbo
21640 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64  rs on either sid
21650 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65  e.** of the page
21660 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74   that participat
21670 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69  e in the balanci
21680 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e  ng operation.  N
21690 42 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61  B is the.** tota
216a0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
216b0 73 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61  s that participa
216c0 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  te, including th
216d0 65 20 74 61 72 67 65 74 20 70 61 67 65 20 61 6e  e target page an
216e0 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72  d.** NN neighbor
216f0 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
21700 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69  ..**.** The mini
21710 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20  mum value of NN 
21720 69 73 20 31 20 28 6f 66 20 63 6f 75 72 73 65 29  is 1 (of course)
21730 2e 20 20 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e  .  Increasing NN
21740 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20   above 1.** (to 
21750 32 20 6f 72 20 33 29 20 67 69 76 65 73 20 61 20  2 or 3) gives a 
21760 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76 65 6d 65  modest improveme
21770 6e 74 20 69 6e 20 53 45 4c 45 43 54 20 61 6e 64  nt in SELECT and
21780 20 44 45 4c 45 54 45 20 70 65 72 66 6f 72 6d 61   DELETE performa
21790 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e  nce.** in exchan
217a0 67 65 20 66 6f 72 20 61 20 6c 61 72 67 65 72 20  ge for a larger 
217b0 64 65 67 72 61 64 61 74 69 6f 6e 20 69 6e 20 49  degradation in I
217c0 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45  NSERT and UPDATE
217d0 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a   performance..**
217e0 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e   The value of NN
217f0 20 61 70 70 65 61 72 73 20 74 6f 20 67 69 76 65   appears to give
21800 20 74 68 65 20 62 65 73 74 20 72 65 73 75 6c 74   the best result
21810 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64  s overall..*/.#d
21820 65 66 69 6e 65 20 4e 4e 20 31 20 20 20 20 20 20  efine NN 1      
21830 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
21840 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e   of neighbors on
21850 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20   either side of 
21860 70 50 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65  pPage */.#define
21870 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20   NB (NN*2+1)    
21880 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67 65 73    /* Total pages
21890 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65   involved in the
218a0 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 2f 2a 20   balance */../* 
218b0 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
218c0 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
218d0 62 61 6c 61 6e 63 65 28 4d 65 6d 50 61 67 65 2a  balance(MemPage*
218e0 2c 20 69 6e 74 29 3b 0a 0a 23 69 66 6e 64 65 66  , int);..#ifndef
218f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49   SQLITE_OMIT_QUI
21900 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20  CKBALANCE./*.** 
21910 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20  This version of 
21920 62 61 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c 65  balance() handle
21930 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65  s the common spe
21940 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 0a  cial case where.
21950 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69  ** a new entry i
21960 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64  s being inserted
21970 20 6f 6e 20 74 68 65 20 65 78 74 72 65 6d 65 20   on the extreme 
21980 72 69 67 68 74 2d 65 6e 64 20 6f 66 20 74 68 65  right-end of the
21990 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74 68  .** tree, in oth
219a0 65 72 20 77 6f 72 64 73 2c 20 77 68 65 6e 20 74  er words, when t
219b0 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77 69 6c  he new entry wil
219c0 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6c 61 72  l become the lar
219d0 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e  gest.** entry in
219e0 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a   the tree..**.**
219f0 20 49 6e 73 74 65 61 64 20 6f 66 20 74 72 79 69   Instead of tryi
21a00 6e 67 20 62 61 6c 61 6e 63 65 20 74 68 65 20 33  ng balance the 3
21a10 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66   right-most leaf
21a20 20 70 61 67 65 73 2c 20 6a 75 73 74 20 61 64 64   pages, just add
21a30 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67 65 20 74  .** a new page t
21a40 6f 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  o the right-hand
21a50 20 73 69 64 65 20 61 6e 64 20 70 75 74 20 74 68   side and put th
21a60 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79 20  e one new entry 
21a70 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 2e  in.** that page.
21a80 20 20 54 68 69 73 20 6c 65 61 76 65 73 20 74 68    This leaves th
21a90 65 20 72 69 67 68 74 20 73 69 64 65 20 6f 66 20  e right side of 
21aa0 74 68 65 20 74 72 65 65 20 73 6f 6d 65 77 68 61  the tree somewha
21ab0 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e  t.** unbalanced.
21ac0 20 20 42 75 74 20 6f 64 64 73 20 61 72 65 20 74    But odds are t
21ad0 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 69  hat we will be i
21ae0 6e 73 65 72 74 69 6e 67 20 6e 65 77 20 65 6e 74  nserting new ent
21af0 72 69 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65  ries.** at the e
21b00 6e 64 20 73 6f 6f 6e 20 61 66 74 65 72 77 61 72  nd soon afterwar
21b10 64 73 20 73 6f 20 74 68 65 20 6e 65 61 72 6c 79  ds so the nearly
21b20 20 65 6d 70 74 79 20 70 61 67 65 20 77 69 6c 6c   empty page will
21b30 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c   quickly.** fill
21b40 20 75 70 2e 20 20 4f 6e 20 61 76 65 72 61 67 65   up.  On average
21b50 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73  ..**.** pPage is
21b60 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 77   the leaf page w
21b70 68 69 63 68 20 69 73 20 74 68 65 20 72 69 67 68  hich is the righ
21b80 74 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e 20 74  t-most page in t
21b90 68 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72  he tree..** pPar
21ba0 65 6e 74 20 69 73 20 69 74 73 20 70 61 72 65 6e  ent is its paren
21bb0 74 2e 20 20 70 50 61 67 65 20 6d 75 73 74 20 68  t.  pPage must h
21bc0 61 76 65 20 61 20 73 69 6e 67 6c 65 20 6f 76 65  ave a single ove
21bd0 72 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77  rflow entry.** w
21be0 68 69 63 68 20 69 73 20 61 6c 73 6f 20 74 68 65  hich is also the
21bf0 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
21c00 79 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a  y on the page..*
21c10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
21c20 61 6e 63 65 5f 71 75 69 63 6b 28 4d 65 6d 50 61  ance_quick(MemPa
21c30 67 65 20 2a 70 50 61 67 65 2c 20 4d 65 6d 50 61  ge *pPage, MemPa
21c40 67 65 20 2a 70 50 61 72 65 6e 74 29 7b 0a 20 20  ge *pParent){.  
21c50 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67  int rc;.  MemPag
21c60 65 20 2a 70 4e 65 77 3b 0a 20 20 50 67 6e 6f 20  e *pNew;.  Pgno 
21c70 70 67 6e 6f 4e 65 77 3b 0a 20 20 75 38 20 2a 70  pgnoNew;.  u8 *p
21c80 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 73 7a 43 65  Cell;.  int szCe
21c90 6c 6c 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  ll;.  CellInfo i
21ca0 6e 66 6f 3b 0a 20 20 42 74 53 68 61 72 65 64 20  nfo;.  BtShared 
21cb0 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
21cc0 74 3b 0a 20 20 69 6e 74 20 70 61 72 65 6e 74 49  t;.  int parentI
21cd0 64 78 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 43  dx = pParent->nC
21ce0 65 6c 6c 3b 20 20 20 2f 2a 20 70 50 61 72 65 6e  ell;   /* pParen
21cf0 74 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65  t new divider ce
21d00 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  ll index */.  in
21d10 74 20 70 61 72 65 6e 74 53 69 7a 65 3b 20 20 20  t parentSize;   
21d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d30 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 65 77 20 64  /* Size of new d
21d40 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20  ivider cell */. 
21d50 20 75 38 20 70 61 72 65 6e 74 43 65 6c 6c 5b 36   u8 parentCell[6
21d60 34 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  4];             
21d70 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20     /* Space for 
21d80 74 68 65 20 6e 65 77 20 64 69 76 69 64 65 72 20  the new divider 
21d90 63 65 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c  cell */..  /* Al
21da0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
21db0 65 2e 20 49 6e 73 65 72 74 20 74 68 65 20 6f 76  e. Insert the ov
21dc0 65 72 66 6c 6f 77 20 63 65 6c 6c 20 66 72 6f 6d  erflow cell from
21dd0 20 70 50 61 67 65 0a 20 20 2a 2a 20 69 6e 74 6f   pPage.  ** into
21de0 20 69 74 2e 20 54 68 65 6e 20 72 65 6d 6f 76 65   it. Then remove
21df0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65   the overflow ce
21e00 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 20  ll from pPage.. 
21e10 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63   */.  rc = alloc
21e20 61 74 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e  atePage(pBt, &pN
21e30 65 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20 30 2c  ew, &pgnoNew, 0,
21e40 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
21e50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21e60 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
21e70 20 70 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   pCell = pPage->
21e80 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a  aOvfl[0].pCell;.
21e90 20 20 73 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c 53    szCell = cellS
21ea0 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43  izePtr(pPage, pC
21eb0 65 6c 6c 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65  ell);.  zeroPage
21ec0 28 70 4e 65 77 2c 20 70 50 61 67 65 2d 3e 61 44  (pNew, pPage->aD
21ed0 61 74 61 5b 30 5d 29 3b 0a 20 20 61 73 73 65 6d  ata[0]);.  assem
21ee0 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 31 2c  blePage(pNew, 1,
21ef0 20 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c   &pCell, &szCell
21f00 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65  );.  pPage->nOve
21f10 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 2f 2a  rflow = 0;..  /*
21f20 20 53 65 74 20 74 68 65 20 70 61 72 65 6e 74 20   Set the parent 
21f30 6f 66 20 74 68 65 20 6e 65 77 6c 79 20 61 6c 6c  of the newly all
21f40 6f 63 61 74 65 64 20 70 61 67 65 20 74 6f 20 70  ocated page to p
21f50 50 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 70 4e 65  Parent. */.  pNe
21f60 77 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 50 61  w->pParent = pPa
21f70 72 65 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33 70  rent;.  sqlite3p
21f80 61 67 65 72 5f 72 65 66 28 70 50 61 72 65 6e 74  ager_ref(pParent
21f90 2d 3e 61 44 61 74 61 29 3b 0a 0a 20 20 2f 2a 20  ->aData);..  /* 
21fa0 70 50 61 67 65 20 69 73 20 63 75 72 72 65 6e 74  pPage is current
21fb0 6c 79 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  ly the right-chi
21fc0 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 2e 20 43  ld of pParent. C
21fd0 68 61 6e 67 65 20 74 68 69 73 0a 20 20 2a 2a 20  hange this.  ** 
21fe0 73 6f 20 74 68 61 74 20 74 68 65 20 72 69 67 68  so that the righ
21ff0 74 2d 63 68 69 6c 64 20 69 73 20 74 68 65 20 6e  t-child is the n
22000 65 77 20 70 61 67 65 20 61 6c 6c 6f 63 61 74 65  ew page allocate
22010 64 20 61 62 6f 76 65 20 61 6e 64 0a 20 20 2a 2a  d above and.  **
22020 20 70 50 61 67 65 20 69 73 20 74 68 65 20 6e 65   pPage is the ne
22030 78 74 2d 74 6f 2d 72 69 67 68 74 20 63 68 69 6c  xt-to-right chil
22040 64 2e 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  d. .  */.  asser
22050 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  t( pPage->nCell>
22060 30 20 29 3b 0a 20 20 70 61 72 73 65 43 65 6c 6c  0 );.  parseCell
22070 50 74 72 28 70 50 61 67 65 2c 20 66 69 6e 64 43  Ptr(pPage, findC
22080 65 6c 6c 28 70 50 61 67 65 2c 20 70 50 61 67 65  ell(pPage, pPage
22090 2d 3e 6e 43 65 6c 6c 2d 31 29 2c 20 26 69 6e 66  ->nCell-1), &inf
220a0 6f 29 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49  o);.  rc = fillI
220b0 6e 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70  nCell(pParent, p
220c0 61 72 65 6e 74 43 65 6c 6c 2c 20 30 2c 20 69 6e  arentCell, 0, in
220d0 66 6f 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c 20 26  fo.nKey, 0, 0, &
220e0 70 61 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 69  parentSize);.  i
220f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
22100 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
22110 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
22120 20 70 61 72 65 6e 74 53 69 7a 65 3c 36 34 20 29   parentSize<64 )
22130 3b 0a 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43  ;.  rc = insertC
22140 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 61 72  ell(pParent, par
22150 65 6e 74 49 64 78 2c 20 70 61 72 65 6e 74 43 65  entIdx, parentCe
22160 6c 6c 2c 20 70 61 72 65 6e 74 53 69 7a 65 2c 20  ll, parentSize, 
22170 30 2c 20 34 29 3b 0a 20 20 69 66 28 20 72 63 21  0, 4);.  if( rc!
22180 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22190 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
221a0 0a 20 20 70 75 74 34 62 79 74 65 28 66 69 6e 64  .  put4byte(find
221b0 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61  OverflowCell(pPa
221c0 72 65 6e 74 2c 70 61 72 65 6e 74 49 64 78 29 2c  rent,parentIdx),
221d0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
221e0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 72 65   put4byte(&pPare
221f0 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
22200 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  t->hdrOffset+8],
22210 20 70 67 6e 6f 4e 65 77 29 3b 0a 0a 23 69 66 6e   pgnoNew);..#ifn
22220 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
22230 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20  AUTOVACUUM.  /* 
22240 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75  If this is an au
22250 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
22260 73 65 2c 20 75 70 64 61 74 65 20 74 68 65 20 70  se, update the p
22270 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20 2a 2a 20  ointer map.  ** 
22280 77 69 74 68 20 65 6e 74 72 69 65 73 20 66 6f 72  with entries for
22290 20 74 68 65 20 6e 65 77 20 70 61 67 65 2c 20 61   the new page, a
222a0 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65 72 20 66  nd any pointer f
222b0 72 6f 6d 20 74 68 65 20 0a 20 20 2a 2a 20 63 65  rom the .  ** ce
222c0 6c 6c 20 6f 6e 20 74 68 65 20 70 61 67 65 20 74  ll on the page t
222d0 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
222e0 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ge..  */.  if( p
222f0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
22300 7b 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  {.    rc = ptrma
22310 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65  pPut(pBt, pgnoNe
22320 77 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  w, PTRMAP_BTREE,
22330 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b   pParent->pgno);
22340 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
22350 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
22360 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
22370 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
22380 50 75 74 4f 76 66 6c 28 70 4e 65 77 2c 20 30 29  PutOvfl(pNew, 0)
22390 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
223a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
223b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
223c0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
223d0 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 72  /* Release the r
223e0 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
223f0 6e 65 77 20 70 61 67 65 20 61 6e 64 20 62 61 6c  new page and bal
22400 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e 74 20  ance the parent 
22410 70 61 67 65 2c 0a 20 20 2a 2a 20 69 6e 20 63 61  page,.  ** in ca
22420 73 65 20 74 68 65 20 64 69 76 69 64 65 72 20 63  se the divider c
22430 65 6c 6c 20 69 6e 73 65 72 74 65 64 20 63 61 75  ell inserted cau
22440 73 65 64 20 69 74 20 74 6f 20 62 65 63 6f 6d 65  sed it to become
22450 20 6f 76 65 72 66 75 6c 6c 2e 0a 20 20 2a 2f 0a   overfull..  */.
22460 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
22470 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 61  ew);.  return ba
22480 6c 61 6e 63 65 28 70 50 61 72 65 6e 74 2c 20 30  lance(pParent, 0
22490 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
224a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b  QLITE_OMIT_QUICK
224b0 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a  BALANCE */../*.*
224c0 2a 20 54 68 65 20 49 53 41 55 54 4f 56 41 43 55  * The ISAUTOVACU
224d0 55 4d 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64  UM macro is used
224e0 20 77 69 74 68 69 6e 20 62 61 6c 61 6e 63 65 5f   within balance_
224f0 6e 6f 6e 72 6f 6f 74 28 29 20 74 6f 20 64 65 74  nonroot() to det
22500 65 72 6d 69 6e 65 0a 2a 2a 20 69 66 20 74 68 65  ermine.** if the
22510 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72   database suppor
22520 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6f  ts auto-vacuum o
22530 72 20 6e 6f 74 2e 20 42 65 63 61 75 73 65 20 69  r not. Because i
22540 74 20 69 73 20 75 73 65 64 0a 2a 2a 20 77 69 74  t is used.** wit
22550 68 69 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f  hin an expressio
22560 6e 20 74 68 61 74 20 69 73 20 61 6e 20 61 72 67  n that is an arg
22570 75 6d 65 6e 74 20 74 6f 20 61 6e 6f 74 68 65 72  ument to another
22580 20 6d 61 63 72 6f 20 0a 2a 2a 20 28 73 71 6c 69   macro .** (sqli
22590 74 65 4d 61 6c 6c 6f 63 52 61 77 29 2c 20 69 74  teMallocRaw), it
225a0 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
225b0 20 74 6f 20 75 73 65 20 63 6f 6e 64 69 74 69 6f   to use conditio
225c0 6e 61 6c 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 2e  nal compilation.
225d0 0a 2a 2a 20 53 6f 2c 20 74 68 69 73 20 6d 61 63  .** So, this mac
225e0 72 6f 20 69 73 20 64 65 66 69 6e 65 64 20 69 6e  ro is defined in
225f0 73 74 65 61 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65  stead..*/.#ifnde
22600 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
22610 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
22620 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 28 70   ISAUTOVACUUM (p
22630 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 0a  Bt->autoVacuum).
22640 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 49 53  #else.#define IS
22650 41 55 54 4f 56 41 43 55 55 4d 20 30 0a 23 65 6e  AUTOVACUUM 0.#en
22660 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
22670 72 6f 75 74 69 6e 65 20 72 65 64 69 73 74 72 69  routine redistri
22680 62 75 74 65 73 20 43 65 6c 6c 73 20 6f 6e 20 70  butes Cells on p
22690 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 4e  Page and up to N
226a0 4e 2a 32 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20  N*2 siblings.** 
226b0 6f 66 20 70 50 61 67 65 20 73 6f 20 74 68 61 74  of pPage so that
226c0 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20   all pages have 
226d0 61 62 6f 75 74 20 74 68 65 20 73 61 6d 65 20 61  about the same a
226e0 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65 20 73 70  mount of free sp
226f0 61 63 65 2e 0a 2a 2a 20 55 73 75 61 6c 6c 79 20  ace..** Usually 
22700 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65  NN siblings on e
22710 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 70 50  ither side of pP
22720 61 67 65 20 69 73 20 75 73 65 64 20 69 6e 20 74  age is used in t
22730 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c 0a 2a 2a  he balancing,.**
22740 20 74 68 6f 75 67 68 20 6d 6f 72 65 20 73 69 62   though more sib
22750 6c 69 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d 65  lings might come
22760 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 20 69   from one side i
22770 66 20 70 50 61 67 65 20 69 73 20 74 68 65 20 66  f pPage is the f
22780 69 72 73 74 0a 2a 2a 20 6f 72 20 6c 61 73 74 20  irst.** or last 
22790 63 68 69 6c 64 20 6f 66 20 69 74 73 20 70 61 72  child of its par
227a0 65 6e 74 2e 20 20 49 66 20 70 50 61 67 65 20 68  ent.  If pPage h
227b0 61 73 20 66 65 77 65 72 20 74 68 61 6e 20 32 2a  as fewer than 2*
227c0 4e 4e 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 28  NN siblings.** (
227d0 73 6f 6d 65 74 68 69 6e 67 20 77 68 69 63 68 20  something which 
227e0 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  can only happen 
227f0 69 66 20 70 50 61 67 65 20 69 73 20 74 68 65 20  if pPage is the 
22800 72 6f 6f 74 20 70 61 67 65 20 6f 72 20 61 20 0a  root page or a .
22810 2a 2a 20 63 68 69 6c 64 20 6f 66 20 72 6f 6f 74  ** child of root
22820 29 20 74 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c  ) then all avail
22830 61 62 6c 65 20 73 69 62 6c 69 6e 67 73 20 70 61  able siblings pa
22840 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68 65  rticipate in the
22850 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a   balancing..**.*
22860 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
22870 73 69 62 6c 69 6e 67 73 20 6f 66 20 70 50 61 67  siblings of pPag
22880 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65  e might be incre
22890 61 73 65 64 20 6f 72 20 64 65 63 72 65 61 73 65  ased or decrease
228a0 64 20 62 79 20 6f 6e 65 20 6f 72 0a 2a 2a 20 74  d by one or.** t
228b0 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72 74 20  wo in an effort 
228c0 74 6f 20 6b 65 65 70 20 70 61 67 65 73 20 6e 65  to keep pages ne
228d0 61 72 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e 6f  arly full but no
228e0 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20 54 68 65  t over full. The
228f0 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73   root page.** is
22900 20 73 70 65 63 69 61 6c 20 61 6e 64 20 69 73 20   special and is 
22910 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 6e 65  allowed to be ne
22920 61 72 6c 79 20 65 6d 70 74 79 2e 20 49 66 20 70  arly empty. If p
22930 50 61 67 65 20 69 73 20 0a 2a 2a 20 74 68 65 20  Page is .** the 
22940 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20  root page, then 
22950 74 68 65 20 64 65 70 74 68 20 6f 66 20 74 68 65  the depth of the
22960 20 74 72 65 65 20 6d 69 67 68 74 20 62 65 20 69   tree might be i
22970 6e 63 72 65 61 73 65 64 0a 2a 2a 20 6f 72 20 64  ncreased.** or d
22980 65 63 72 65 61 73 65 64 20 62 79 20 6f 6e 65 2c  ecreased by one,
22990 20 61 73 20 6e 65 63 65 73 73 61 72 79 2c 20 74   as necessary, t
229a0 6f 20 6b 65 65 70 20 74 68 65 20 72 6f 6f 74 20  o keep the root 
229b0 70 61 67 65 20 66 72 6f 6d 20 62 65 69 6e 67 0a  page from being.
229c0 2a 2a 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 63  ** overfull or c
229d0 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e  ompletely empty.
229e0 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
229f0 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
22a00 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f  ne is called, so
22a10 6d 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 73 20  me of the Cells 
22a20 6f 6e 20 70 50 61 67 65 0a 2a 2a 20 6d 69 67 68  on pPage.** migh
22a30 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 62  t not actually b
22a40 65 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61 67  e stored in pPag
22a50 65 2d 3e 61 44 61 74 61 5b 5d 2e 20 20 54 68 69  e->aData[].  Thi
22a60 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a 20  s can happen.** 
22a70 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6f  if the page is o
22a80 76 65 72 66 75 6c 6c 2e 20 20 50 61 72 74 20 6f  verfull.  Part o
22a90 66 20 74 68 65 20 6a 6f 62 20 6f 66 20 74 68 69  f the job of thi
22aa0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 0a  s routine is to.
22ab0 2a 2a 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c  ** make sure all
22ac0 20 43 65 6c 6c 73 20 66 6f 72 20 70 50 61 67 65   Cells for pPage
22ad0 20 6f 6e 63 65 20 61 67 61 69 6e 20 66 69 74 20   once again fit 
22ae0 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  in pPage->aData[
22af0 5d 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  ]..**.** In the 
22b00 63 6f 75 72 73 65 20 6f 66 20 62 61 6c 61 6e 63  course of balanc
22b10 69 6e 67 20 74 68 65 20 73 69 62 6c 69 6e 67 73  ing the siblings
22b20 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 20 70   of pPage, the p
22b30 61 72 65 6e 74 20 6f 66 20 70 50 61 67 65 0a 2a  arent of pPage.*
22b40 2a 20 6d 69 67 68 74 20 62 65 63 6f 6d 65 20 6f  * might become o
22b50 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72  verfull or under
22b60 66 75 6c 6c 2e 20 20 49 66 20 74 68 61 74 20 68  full.  If that h
22b70 61 70 70 65 6e 73 2c 20 74 68 65 6e 20 74 68 69  appens, then thi
22b80 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  s routine.** is 
22b90 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65  called recursive
22ba0 6c 79 20 6f 6e 20 74 68 65 20 70 61 72 65 6e 74  ly on the parent
22bb0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
22bc0 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 66 6f  routine fails fo
22bd0 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 69 74  r any reason, it
22be0 20 6d 69 67 68 74 20 6c 65 61 76 65 20 74 68 65   might leave the
22bf0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20   database.** in 
22c00 61 20 63 6f 72 72 75 70 74 65 64 20 73 74 61 74  a corrupted stat
22c10 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73 20 72  e.  So if this r
22c20 6f 75 74 69 6e 65 20 66 61 69 6c 73 2c 20 74 68  outine fails, th
22c30 65 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c  e database shoul
22c40 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65 64 20 62  d.** be rolled b
22c50 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ack..*/.static i
22c60 6e 74 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f  nt balance_nonro
22c70 6f 74 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ot(MemPage *pPag
22c80 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  e){.  MemPage *p
22c90 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20  Parent;         
22ca0 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74     /* The parent
22cb0 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 20 20 42   of pPage */.  B
22cc0 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
22cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22ce0 2a 20 54 68 65 20 77 68 6f 6c 65 20 64 61 74 61  * The whole data
22cf0 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  base */.  int nC
22d00 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ell = 0;        
22d10 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
22d20 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 43   of cells in apC
22d30 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  ell[] */.  int n
22d40 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20  MaxCells = 0;   
22d50 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63          /* Alloc
22d60 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61 70 43  ated size of apC
22d70 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61 46 72  ell, szCell, aFr
22d80 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c  om. */.  int nOl
22d90 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
22da0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
22db0 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4f 6c  of pages in apOl
22dc0 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65  d[] */.  int nNe
22dd0 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
22de0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
22df0 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4e 65  of pages in apNe
22e00 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 69  w[] */.  int nDi
22e10 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
22e20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
22e30 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 44 69  of cells in apDi
22e40 76 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  v[] */.  int i, 
22e50 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20  j, k;           
22e60 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
22e70 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
22e80 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  idx;            
22e90 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
22ea0 78 20 6f 66 20 70 50 61 67 65 20 69 6e 20 70 50  x of pPage in pP
22eb0 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a  arent->aCell[] *
22ec0 2f 0a 20 20 69 6e 74 20 6e 78 44 69 76 3b 20 20  /.  int nxDiv;  
22ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ee0 20 2f 2a 20 4e 65 78 74 20 64 69 76 69 64 65 72   /* Next divider
22ef0 20 73 6c 6f 74 20 69 6e 20 70 50 61 72 65 6e 74   slot in pParent
22f00 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69  ->aCell[] */.  i
22f10 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
22f20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
22f30 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  he return code *
22f40 2f 0a 20 20 69 6e 74 20 6c 65 61 66 43 6f 72 72  /.  int leafCorr
22f50 65 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  ection;         
22f60 20 2f 2a 20 34 20 69 66 20 70 50 61 67 65 20 69   /* 4 if pPage i
22f70 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20  s a leaf.  0 if 
22f80 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61  not */.  int lea
22f90 66 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  fData;          
22fa0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
22fb0 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66   pPage is a leaf
22fc0 20 6f 66 20 61 20 4c 45 41 46 44 41 54 41 20 74   of a LEAFDATA t
22fd0 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61  ree */.  int usa
22fe0 62 6c 65 53 70 61 63 65 3b 20 20 20 20 20 20 20  bleSpace;       
22ff0 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 69        /* Bytes i
23000 6e 20 70 50 61 67 65 20 62 65 79 6f 6e 64 20 74  n pPage beyond t
23010 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  he header */.  i
23020 6e 74 20 70 61 67 65 46 6c 61 67 73 3b 20 20 20  nt pageFlags;   
23030 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
23040 61 6c 75 65 20 6f 66 20 70 50 61 67 65 2d 3e 61  alue of pPage->a
23050 44 61 74 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74  Data[0] */.  int
23060 20 73 75 62 74 6f 74 61 6c 3b 20 20 20 20 20 20   subtotal;      
23070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62            /* Sub
23080 74 6f 74 61 6c 20 6f 66 20 62 79 74 65 73 20 69  total of bytes i
23090 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20 70  n cells on one p
230a0 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70  age */.  int iSp
230b0 61 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ace = 0;        
230c0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75        /* First u
230d0 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20 61 53  nused byte of aS
230e0 70 61 63 65 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50  pace[] */.  MemP
230f0 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20  age *apOld[NB]; 
23100 20 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67           /* pPag
23110 65 20 61 6e 64 20 75 70 20 74 6f 20 74 77 6f 20  e and up to two 
23120 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 50 67  siblings */.  Pg
23130 6e 6f 20 70 67 6e 6f 4f 6c 64 5b 4e 42 5d 3b 20  no pgnoOld[NB]; 
23140 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
23150 67 65 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 65  ge numbers for e
23160 61 63 68 20 70 61 67 65 20 69 6e 20 61 70 4f 6c  ach page in apOl
23170 64 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  d[] */.  MemPage
23180 20 2a 61 70 43 6f 70 79 5b 4e 42 5d 3b 20 20 20   *apCopy[NB];   
23190 20 20 20 20 20 20 2f 2a 20 50 72 69 76 61 74 65        /* Private
231a0 20 63 6f 70 69 65 73 20 6f 66 20 61 70 4f 6c 64   copies of apOld
231b0 5b 5d 20 70 61 67 65 73 20 2a 2f 0a 20 20 4d 65  [] pages */.  Me
231c0 6d 50 61 67 65 20 2a 61 70 4e 65 77 5b 4e 42 2b  mPage *apNew[NB+
231d0 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 70 50  2];        /* pP
231e0 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 4e 42  age and up to NB
231f0 20 73 69 62 6c 69 6e 67 73 20 61 66 74 65 72 20   siblings after 
23200 62 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20 20 50  balancing */.  P
23210 67 6e 6f 20 70 67 6e 6f 4e 65 77 5b 4e 42 2b 32  gno pgnoNew[NB+2
23220 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ];          /* P
23230 61 67 65 20 6e 75 6d 62 65 72 73 20 66 6f 72 20  age numbers for 
23240 65 61 63 68 20 70 61 67 65 20 69 6e 20 61 70 4e  each page in apN
23250 65 77 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 70  ew[] */.  u8 *ap
23260 44 69 76 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  Div[NB];        
23270 20 20 20 20 20 20 20 2f 2a 20 44 69 76 69 64 65         /* Divide
23280 72 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65  r cells in pPare
23290 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 4e  nt */.  int cntN
232a0 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20  ew[NB+2];       
232b0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
232c0 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c   aCell[] of cell
232d0 20 61 66 74 65 72 20 69 2d 74 68 20 70 61 67 65   after i-th page
232e0 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77 5b   */.  int szNew[
232f0 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20  NB+2];          
23300 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 73     /* Combined s
23310 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70 6c 61  ize of cells pla
23320 63 65 20 6f 6e 20 69 2d 74 68 20 70 61 67 65 20  ce on i-th page 
23330 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c  */.  u8 **apCell
23340 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
23350 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62    /* All cells b
23360 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f  egin balanced */
23370 0a 20 20 69 6e 74 20 2a 73 7a 43 65 6c 6c 3b 20  .  int *szCell; 
23380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23390 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66  /* Local size of
233a0 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
233b0 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  Cell[] */.  u8 *
233c0 61 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20  aCopy[NB];      
233d0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
233e0 65 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 64 61  e for holding da
233f0 74 61 20 6f 66 20 61 70 43 6f 70 79 5b 5d 20 2a  ta of apCopy[] *
23400 2f 0a 20 20 75 38 20 2a 61 53 70 61 63 65 3b 20  /.  u8 *aSpace; 
23410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23420 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c   /* Space to hol
23430 64 20 63 6f 70 69 65 73 20 6f 66 20 64 69 76 69  d copies of divi
23440 64 65 72 73 20 63 65 6c 6c 73 20 2a 2f 0a 23 69  ders cells */.#i
23450 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
23460 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 75  T_AUTOVACUUM.  u
23470 38 20 2a 61 46 72 6f 6d 20 3d 20 30 3b 0a 23 65  8 *aFrom = 0;.#e
23480 6e 64 69 66 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  ndif..  /* .  **
23490 20 46 69 6e 64 20 74 68 65 20 70 61 72 65 6e 74   Find the parent
234a0 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   page..  */.  as
234b0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
234c0 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nit );.  assert(
234d0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 69 73   sqlite3pager_is
234e0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
234f0 3e 61 44 61 74 61 29 20 29 3b 0a 20 20 70 42 74  >aData) );.  pBt
23500 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
23510 20 70 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65   pParent = pPage
23520 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 61 73 73  ->pParent;.  ass
23530 65 72 74 28 20 70 50 61 72 65 6e 74 20 29 3b 0a  ert( pParent );.
23540 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
23550 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61  =(rc = sqlite3pa
23560 67 65 72 5f 77 72 69 74 65 28 70 50 61 72 65 6e  ger_write(pParen
23570 74 2d 3e 61 44 61 74 61 29 29 20 29 7b 0a 20 20  t->aData)) ){.  
23580 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
23590 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e  .  TRACE(("BALAN
235a0 43 45 3a 20 62 65 67 69 6e 20 70 61 67 65 20 25  CE: begin page %
235b0 64 20 63 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22  d child of %d\n"
235c0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70  , pPage->pgno, p
235d0 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a  Parent->pgno));.
235e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
235f0 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43  OMIT_QUICKBALANC
23600 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 20 73 70  E.  /*.  ** A sp
23610 65 63 69 61 6c 20 63 61 73 65 3a 20 20 49 66 20  ecial case:  If 
23620 61 20 6e 65 77 20 65 6e 74 72 79 20 68 61 73 20  a new entry has 
23630 6a 75 73 74 20 62 65 65 6e 20 69 6e 73 65 72 74  just been insert
23640 65 64 20 69 6e 74 6f 20 61 0a 20 20 2a 2a 20 74  ed into a.  ** t
23650 61 62 6c 65 20 28 74 68 61 74 20 69 73 2c 20 61  able (that is, a
23660 20 62 74 72 65 65 20 77 69 74 68 20 69 6e 74 65   btree with inte
23670 67 65 72 20 6b 65 79 73 20 61 6e 64 20 61 6c 6c  ger keys and all
23680 20 64 61 74 61 20 61 74 20 74 68 65 20 6c 65 61   data at the lea
23690 76 65 73 29 0a 20 20 2a 2a 20 61 6e 64 20 74 68  ves).  ** and th
236a0 65 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 74  e new entry is t
236b0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
236c0 74 72 79 20 69 6e 20 74 68 65 20 74 72 65 65 20  try in the tree 
236d0 28 69 74 20 68 61 73 20 74 68 65 0a 20 20 2a 2a  (it has the.  **
236e0 20 6c 61 72 67 65 73 74 20 6b 65 79 29 20 74 68   largest key) th
236f0 65 6e 20 75 73 65 20 74 68 65 20 73 70 65 63 69  en use the speci
23700 61 6c 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  al balance_quick
23710 28 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 0a 20  () routine for. 
23720 20 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 2e 20 20   ** balancing.  
23730 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20  balance_quick() 
23740 69 73 20 6d 75 63 68 20 66 61 73 74 65 72 20 61  is much faster a
23750 6e 64 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20  nd results in a 
23760 74 69 67 68 74 65 72 0a 20 20 2a 2a 20 70 61 63  tighter.  ** pac
23770 6b 69 6e 67 20 6f 66 20 64 61 74 61 20 69 6e 20  king of data in 
23780 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e  the common case.
23790 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
237a0 65 2d 3e 6c 65 61 66 20 26 26 0a 20 20 20 20 20  e->leaf &&.     
237b0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26   pPage->intKey &
237c0 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 6c  &.      pPage->l
237d0 65 61 66 44 61 74 61 20 26 26 0a 20 20 20 20 20  eafData &&.     
237e0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
237f0 77 3d 3d 31 20 26 26 0a 20 20 20 20 20 20 70 50  w==1 &&.      pP
23800 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64  age->aOvfl[0].id
23810 78 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  x==pPage->nCell 
23820 26 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  &&.      pPage->
23830 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31  pParent->pgno!=1
23840 20 26 26 0a 20 20 20 20 20 20 67 65 74 34 62 79   &&.      get4by
23850 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
23860 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
23870 66 66 73 65 74 2b 38 5d 29 3d 3d 70 50 61 67 65  ffset+8])==pPage
23880 2d 3e 70 67 6e 6f 0a 20 20 29 7b 0a 20 20 20 20  ->pgno.  ){.    
23890 2f 2a 0a 20 20 20 20 2a 2a 20 54 4f 44 4f 3a 20  /*.    ** TODO: 
238a0 43 68 65 63 6b 20 74 68 65 20 73 69 62 6c 69 6e  Check the siblin
238b0 67 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  gs to the left o
238c0 66 20 70 50 61 67 65 2e 20 49 74 20 6d 61 79 20  f pPage. It may 
238d0 62 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  be that.    ** t
238e0 68 65 79 20 61 72 65 20 6e 6f 74 20 66 75 6c 6c  hey are not full
238f0 20 61 6e 64 20 6e 6f 20 6e 65 77 20 70 61 67 65   and no new page
23900 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20   is required..  
23910 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20    */.    return 
23920 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 70 50  balance_quick(pP
23930 61 67 65 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20  age, pParent);. 
23940 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a   }.#endif..  /*.
23950 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 65    ** Find the ce
23960 6c 6c 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74  ll in the parent
23970 20 70 61 67 65 20 77 68 6f 73 65 20 6c 65 66 74   page whose left
23980 20 63 68 69 6c 64 20 70 6f 69 6e 74 73 20 62 61   child points ba
23990 63 6b 0a 20 20 2a 2a 20 74 6f 20 70 50 61 67 65  ck.  ** to pPage
239a0 2e 20 20 54 68 65 20 22 69 64 78 22 20 76 61 72  .  The "idx" var
239b0 69 61 62 6c 65 20 69 73 20 74 68 65 20 69 6e 64  iable is the ind
239c0 65 78 20 6f 66 20 74 68 61 74 20 63 65 6c 6c 2e  ex of that cell.
239d0 20 20 49 66 20 70 50 61 67 65 0a 20 20 2a 2a 20    If pPage.  ** 
239e0 69 73 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74  is the rightmost
239f0 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e   child of pParen
23a00 74 20 74 68 65 6e 20 73 65 74 20 69 64 78 20 74  t then set idx t
23a10 6f 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  o pParent->nCell
23a20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61   .  */.  if( pPa
23a30 72 65 6e 74 2d 3e 69 64 78 53 68 69 66 74 20 29  rent->idxShift )
23a40 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  {.    Pgno pgno;
23a50 0a 20 20 20 20 70 67 6e 6f 20 3d 20 70 50 61 67  .    pgno = pPag
23a60 65 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73  e->pgno;.    ass
23a70 65 72 74 28 20 70 67 6e 6f 3d 3d 73 71 6c 69 74  ert( pgno==sqlit
23a80 65 33 70 61 67 65 72 5f 70 61 67 65 6e 75 6d 62  e3pager_pagenumb
23a90 65 72 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29  er(pPage->aData)
23aa0 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 64 78 3d   );.    for(idx=
23ab0 30 3b 20 69 64 78 3c 70 50 61 72 65 6e 74 2d 3e  0; idx<pParent->
23ac0 6e 43 65 6c 6c 3b 20 69 64 78 2b 2b 29 7b 0a 20  nCell; idx++){. 
23ad0 20 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74       if( get4byt
23ae0 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65  e(findCell(pPare
23af0 6e 74 2c 20 69 64 78 29 29 3d 3d 70 67 6e 6f 20  nt, idx))==pgno 
23b00 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
23b10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
23b20 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78 3c      assert( idx<
23b30 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 0a 20  pParent->nCell. 
23b40 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 67              || g
23b50 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  et4byte(&pParent
23b60 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
23b70 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d  >hdrOffset+8])==
23b80 70 67 6e 6f 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  pgno );.  }else{
23b90 0a 20 20 20 20 69 64 78 20 3d 20 70 50 61 67 65  .    idx = pPage
23ba0 2d 3e 69 64 78 50 61 72 65 6e 74 3b 0a 20 20 7d  ->idxParent;.  }
23bb0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 6e 69 74  ..  /*.  ** Init
23bc0 69 61 6c 69 7a 65 20 76 61 72 69 61 62 6c 65 73  ialize variables
23bd0 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c   so that it will
23be0 20 62 65 20 73 61 66 65 20 74 6f 20 6a 75 6d 70   be safe to jump
23bf0 0a 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74  .  ** directly t
23c00 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
23c10 70 20 61 74 20 61 6e 79 20 6d 6f 6d 65 6e 74 2e  p at any moment.
23c20 0a 20 20 2a 2f 0a 20 20 6e 4f 6c 64 20 3d 20 6e  .  */.  nOld = n
23c30 4e 65 77 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  New = 0;.  sqlit
23c40 65 33 70 61 67 65 72 5f 72 65 66 28 70 50 61 72  e3pager_ref(pPar
23c50 65 6e 74 2d 3e 61 44 61 74 61 29 3b 0a 0a 20 20  ent->aData);..  
23c60 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 73 69 62  /*.  ** Find sib
23c70 6c 69 6e 67 20 70 61 67 65 73 20 74 6f 20 70 50  ling pages to pP
23c80 61 67 65 20 61 6e 64 20 74 68 65 20 63 65 6c 6c  age and the cell
23c90 73 20 69 6e 20 70 50 61 72 65 6e 74 20 74 68 61  s in pParent tha
23ca0 74 20 64 69 76 69 64 65 0a 20 20 2a 2a 20 74 68  t divide.  ** th
23cb0 65 20 73 69 62 6c 69 6e 67 73 2e 20 20 41 6e 20  e siblings.  An 
23cc0 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
23cd0 74 6f 20 66 69 6e 64 20 4e 4e 20 73 69 62 6c 69  to find NN sibli
23ce0 6e 67 73 20 6f 6e 20 65 69 74 68 65 72 0a 20 20  ngs on either.  
23cf0 2a 2a 20 73 69 64 65 20 6f 66 20 70 50 61 67 65  ** side of pPage
23d00 2e 20 20 4d 6f 72 65 20 73 69 62 6c 69 6e 67 73  .  More siblings
23d10 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20   are taken from 
23d20 6f 6e 65 20 73 69 64 65 2c 20 68 6f 77 65 76 65  one side, howeve
23d30 72 2c 20 69 66 0a 20 20 2a 2a 20 70 50 61 67 65  r, if.  ** pPage
23d40 20 74 68 65 72 65 20 61 72 65 20 66 65 77 65 72   there are fewer
23d50 20 74 68 61 6e 20 4e 4e 20 73 69 62 6c 69 6e 67   than NN sibling
23d60 73 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 73  s on the other s
23d70 69 64 65 2e 20 20 49 66 20 70 50 61 72 65 6e 74  ide.  If pParent
23d80 0a 20 20 2a 2a 20 68 61 73 20 4e 42 20 6f 72 20  .  ** has NB or 
23d90 66 65 77 65 72 20 63 68 69 6c 64 72 65 6e 20 74  fewer children t
23da0 68 65 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e  hen all children
23db0 20 6f 66 20 70 50 61 72 65 6e 74 20 61 72 65 20   of pParent are 
23dc0 74 61 6b 65 6e 2e 0a 20 20 2a 2f 0a 20 20 6e 78  taken..  */.  nx
23dd0 44 69 76 20 3d 20 69 64 78 20 2d 20 4e 4e 3b 0a  Div = idx - NN;.
23de0 20 20 69 66 28 20 6e 78 44 69 76 20 2b 20 4e 42    if( nxDiv + NB
23df0 20 3e 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c   > pParent->nCel
23e00 6c 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d  l ){.    nxDiv =
23e10 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20   pParent->nCell 
23e20 2d 20 4e 42 20 2b 20 31 3b 0a 20 20 7d 0a 20 20  - NB + 1;.  }.  
23e30 69 66 28 20 6e 78 44 69 76 3c 30 20 29 7b 0a 20  if( nxDiv<0 ){. 
23e40 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20     nxDiv = 0;.  
23e50 7d 0a 20 20 6e 44 69 76 20 3d 20 30 3b 0a 20 20  }.  nDiv = 0;.  
23e60 66 6f 72 28 69 3d 30 2c 20 6b 3d 6e 78 44 69 76  for(i=0, k=nxDiv
23e70 3b 20 69 3c 4e 42 3b 20 69 2b 2b 2c 20 6b 2b 2b  ; i<NB; i++, k++
23e80 29 7b 0a 20 20 20 20 69 66 28 20 6b 3c 70 50 61  ){.    if( k<pPa
23e90 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  rent->nCell ){. 
23ea0 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20       apDiv[i] = 
23eb0 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74  findCell(pParent
23ec0 2c 20 6b 29 3b 0a 20 20 20 20 20 20 6e 44 69 76  , k);.      nDiv
23ed0 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ++;.      assert
23ee0 28 20 21 70 50 61 72 65 6e 74 2d 3e 6c 65 61 66  ( !pParent->leaf
23ef0 20 29 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4f 6c   );.      pgnoOl
23f00 64 5b 69 5d 20 3d 20 67 65 74 34 62 79 74 65 28  d[i] = get4byte(
23f10 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 7d  apDiv[i]);.    }
23f20 65 6c 73 65 20 69 66 28 20 6b 3d 3d 70 50 61 72  else if( k==pPar
23f30 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  ent->nCell ){.  
23f40 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d      pgnoOld[i] =
23f50 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72 65   get4byte(&pPare
23f60 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
23f70 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  t->hdrOffset+8])
23f80 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
23f90 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
23fa0 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49      rc = getAndI
23fb0 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  nitPage(pBt, pgn
23fc0 6f 4f 6c 64 5b 69 5d 2c 20 26 61 70 4f 6c 64 5b  oOld[i], &apOld[
23fd0 69 5d 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20  i], pParent);.  
23fe0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
23ff0 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
24000 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d 2d 3e 69  .    apOld[i]->i
24010 64 78 50 61 72 65 6e 74 20 3d 20 6b 3b 0a 20 20  dxParent = k;.  
24020 20 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20 30 3b    apCopy[i] = 0;
24030 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d  .    assert( i==
24040 6e 4f 6c 64 20 29 3b 0a 20 20 20 20 6e 4f 6c 64  nOld );.    nOld
24050 2b 2b 3b 0a 20 20 20 20 6e 4d 61 78 43 65 6c 6c  ++;.    nMaxCell
24060 73 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d  s += 1+apOld[i]-
24070 3e 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d  >nCell+apOld[i]-
24080 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 7d 0a  >nOverflow;.  }.
24090 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43  .  /* Make nMaxC
240a0 65 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65 20  ells a multiple 
240b0 6f 66 20 32 20 69 6e 20 6f 72 64 65 72 20 74 6f  of 2 in order to
240c0 20 70 72 65 73 65 72 76 65 20 38 2d 62 79 74 65   preserve 8-byte
240d0 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20  .  ** alignment 
240e0 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d  */.  nMaxCells =
240f0 20 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 31 29   (nMaxCells + 1)
24100 26 7e 31 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  &~1;..  /*.  ** 
24110 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
24120 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  or memory struct
24130 75 72 65 73 0a 20 20 2a 2f 0a 20 20 61 70 43 65  ures.  */.  apCe
24140 6c 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ll = sqliteMallo
24150 63 52 61 77 28 20 0a 20 20 20 20 20 20 20 6e 4d  cRaw( .       nM
24160 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75  axCells*sizeof(u
24170 38 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20  8*)             
24180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24190 20 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20   apCell */.     
241a0 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65  + nMaxCells*size
241b0 6f 66 28 69 6e 74 29 20 20 20 20 20 20 20 20 20  of(int)         
241c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241d0 20 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20    /* szCell */. 
241e0 20 20 20 20 2b 20 52 4f 55 4e 44 38 28 73 69 7a      + ROUND8(siz
241f0 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 2a 4e 42  eof(MemPage))*NB
24200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24210 20 20 20 20 20 20 2f 2a 20 61 43 6f 70 79 20 2a        /* aCopy *
24220 2f 0a 20 20 20 20 20 2b 20 70 42 74 2d 3e 70 61  /.     + pBt->pa
24230 67 65 53 69 7a 65 2a 28 35 2b 4e 42 29 20 20 20  geSize*(5+NB)   
24240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24250 20 20 20 20 20 20 20 20 20 2f 2a 20 61 53 70 61           /* aSpa
24260 63 65 20 2a 2f 0a 20 20 20 20 20 2b 20 28 49 53  ce */.     + (IS
24270 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 6e 4d 61  AUTOVACUUM ? nMa
24280 78 43 65 6c 6c 73 20 3a 20 30 29 20 20 20 20 20  xCells : 0)     
24290 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
242a0 61 46 72 6f 6d 20 2a 2f 0a 20 20 29 3b 0a 20 20  aFrom */.  );.  
242b0 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29 7b  if( apCell==0 ){
242c0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
242d0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f  _NOMEM;.    goto
242e0 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
242f0 3b 0a 20 20 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d  ;.  }.  szCell =
24300 20 28 69 6e 74 2a 29 26 61 70 43 65 6c 6c 5b 6e   (int*)&apCell[n
24310 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 43 6f  MaxCells];.  aCo
24320 70 79 5b 30 5d 20 3d 20 28 75 38 2a 29 26 73 7a  py[0] = (u8*)&sz
24330 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b  Cell[nMaxCells];
24340 0a 20 20 61 73 73 65 72 74 28 20 28 28 61 43 6f  .  assert( ((aCo
24350 70 79 5b 30 5d 20 2d 20 28 75 38 2a 29 61 70 43  py[0] - (u8*)apC
24360 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29 3b 20  ell) & 7)==0 ); 
24370 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d  /* 8-byte alignm
24380 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a 2f 0a  ent required */.
24390 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 4e 42 3b    for(i=1; i<NB;
243a0 20 69 2b 2b 29 7b 0a 20 20 20 20 61 43 6f 70 79   i++){.    aCopy
243b0 5b 69 5d 20 3d 20 26 61 43 6f 70 79 5b 69 2d 31  [i] = &aCopy[i-1
243c0 5d 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2b  ][pBt->pageSize+
243d0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65  ROUND8(sizeof(Me
243e0 6d 50 61 67 65 29 29 5d 3b 0a 20 20 20 20 61 73  mPage))];.    as
243f0 73 65 72 74 28 20 28 28 61 43 6f 70 79 5b 69 5d  sert( ((aCopy[i]
24400 20 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c 29 20   - (u8*)apCell) 
24410 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d  & 7)==0 ); /* 8-
24420 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72  byte alignment r
24430 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 7d 0a 20  equired */.  }. 
24440 20 61 53 70 61 63 65 20 3d 20 26 61 43 6f 70 79   aSpace = &aCopy
24450 5b 4e 42 2d 31 5d 5b 70 42 74 2d 3e 70 61 67 65  [NB-1][pBt->page
24460 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a 65  Size+ROUND8(size
24470 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a 20  of(MemPage))];. 
24480 20 61 73 73 65 72 74 28 20 28 28 61 53 70 61 63   assert( ((aSpac
24490 65 20 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c 29  e - (u8*)apCell)
244a0 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38   & 7)==0 ); /* 8
244b0 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20  -byte alignment 
244c0 72 65 71 75 69 72 65 64 20 2a 2f 0a 23 69 66 6e  required */.#ifn
244d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
244e0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28  AUTOVACUUM.  if(
244f0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
24500 20 29 7b 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20   ){.    aFrom = 
24510 26 61 53 70 61 63 65 5b 35 2a 70 42 74 2d 3e 70  &aSpace[5*pBt->p
24520 61 67 65 53 69 7a 65 5d 3b 0a 20 20 7d 0a 23 65  ageSize];.  }.#e
24530 6e 64 69 66 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a  ndif.  .  /*.  *
24540 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66  * Make copies of
24550 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
24560 70 50 61 67 65 20 61 6e 64 20 69 74 73 20 73 69  pPage and its si
24570 62 6c 69 6e 67 73 20 69 6e 74 6f 20 61 4f 6c 64  blings into aOld
24580 5b 5d 2e 0a 20 20 2a 2a 20 54 68 65 20 72 65 73  []..  ** The res
24590 74 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  t of this functi
245a0 6f 6e 20 77 69 6c 6c 20 75 73 65 20 64 61 74 61  on will use data
245b0 20 66 72 6f 6d 20 74 68 65 20 63 6f 70 69 65 73   from the copies
245c0 20 72 61 74 68 65 72 0a 20 20 2a 2a 20 74 68 61   rather.  ** tha
245d0 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  t the original p
245e0 61 67 65 73 20 73 69 6e 63 65 20 74 68 65 20 6f  ages since the o
245f0 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 77 69  riginal pages wi
24600 6c 6c 20 62 65 20 69 6e 20 74 68 65 0a 20 20 2a  ll be in the.  *
24610 2a 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69  * process of bei
24620 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a  ng overwritten..
24630 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
24640 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  i<nOld; i++){.  
24650 20 20 4d 65 6d 50 61 67 65 20 2a 70 20 3d 20 61    MemPage *p = a
24660 70 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50  pCopy[i] = (MemP
24670 61 67 65 2a 29 26 61 43 6f 70 79 5b 69 5d 5b 70  age*)&aCopy[i][p
24680 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20  Bt->pageSize];. 
24690 20 20 20 70 2d 3e 61 44 61 74 61 20 3d 20 26 28     p->aData = &(
246a0 28 75 38 2a 29 70 29 5b 2d 70 42 74 2d 3e 70 61  (u8*)p)[-pBt->pa
246b0 67 65 53 69 7a 65 5d 3b 0a 20 20 20 20 6d 65 6d  geSize];.    mem
246c0 63 70 79 28 70 2d 3e 61 44 61 74 61 2c 20 61 70  cpy(p->aData, ap
246d0 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70  Old[i]->aData, p
246e0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 73  Bt->pageSize + s
246f0 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b  izeof(MemPage));
24700 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 65 6d 63  .    /* The memc
24710 70 79 28 29 20 61 62 6f 76 65 20 63 68 61 6e 67  py() above chang
24720 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  es the value of 
24730 70 2d 3e 61 44 61 74 61 20 73 6f 20 77 65 20 68  p->aData so we h
24740 61 76 65 20 74 6f 0a 20 20 20 20 2a 2a 20 73 65  ave to.    ** se
24750 74 20 69 74 20 61 67 61 69 6e 2e 20 2a 2f 0a 20  t it again. */. 
24760 20 20 20 70 2d 3e 61 44 61 74 61 20 3d 20 26 28     p->aData = &(
24770 28 75 38 2a 29 70 29 5b 2d 70 42 74 2d 3e 70 61  (u8*)p)[-pBt->pa
24780 67 65 53 69 7a 65 5d 3b 0a 20 20 7d 0a 0a 20 20  geSize];.  }..  
24790 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69  /*.  ** Load poi
247a0 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c  nters to all cel
247b0 6c 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61  ls on sibling pa
247c0 67 65 73 20 61 6e 64 20 74 68 65 20 64 69 76 69  ges and the divi
247d0 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69  der cells.  ** i
247e0 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61 70  nto the local ap
247f0 43 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d  Cell[] array.  M
24800 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68  ake copies of th
24810 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a  e divider cells.
24820 20 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65 20    ** into space 
24830 6f 62 74 61 69 6e 65 64 20 66 6f 72 6d 20 61 53  obtained form aS
24840 70 61 63 65 5b 5d 20 61 6e 64 20 72 65 6d 6f 76  pace[] and remov
24850 65 20 74 68 65 20 74 68 65 20 64 69 76 69 64 65  e the the divide
24860 72 20 43 65 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f  r Cells.  ** fro
24870 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a  m pParent..  **.
24880 20 20 2a 2a 20 49 66 20 74 68 65 20 73 69 62 6c    ** If the sibl
24890 69 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65 61 66  ings are on leaf
248a0 20 70 61 67 65 73 2c 20 74 68 65 6e 20 74 68 65   pages, then the
248b0 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 20   child pointers 
248c0 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64 69 76 69  of the.  ** divi
248d0 64 65 72 20 63 65 6c 6c 73 20 61 72 65 20 73 74  der cells are st
248e0 72 69 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20  ripped from the 
248f0 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 74 68 65  cells before the
24900 79 20 61 72 65 20 63 6f 70 69 65 64 0a 20 20 2a  y are copied.  *
24910 2a 20 69 6e 74 6f 20 61 53 70 61 63 65 5b 5d 2e  * into aSpace[].
24920 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20 61    In this way, a
24930 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  ll cells in apCe
24940 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68 6f 75 74  ll[] are without
24950 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70 6f 69 6e  .  ** child poin
24960 74 65 72 73 2e 20 20 49 66 20 73 69 62 6c 69 6e  ters.  If siblin
24970 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65  gs are not leave
24980 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63 65 6c 6c  s, then all cell
24990 20 69 6e 0a 20 20 2a 2a 20 61 70 43 65 6c 6c 5b   in.  ** apCell[
249a0 5d 20 69 6e 63 6c 75 64 65 20 63 68 69 6c 64 20  ] include child 
249b0 70 6f 69 6e 74 65 72 73 2e 20 20 45 69 74 68 65  pointers.  Eithe
249c0 72 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73  r way, all cells
249d0 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a   in apCell[].  *
249e0 2a 20 61 72 65 20 61 6c 69 6b 65 2e 0a 20 20 2a  * are alike..  *
249f0 2a 0a 20 20 2a 2a 20 6c 65 61 66 43 6f 72 72 65  *.  ** leafCorre
24a00 63 74 69 6f 6e 3a 20 20 34 20 69 66 20 70 50 61  ction:  4 if pPa
24a10 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30  ge is a leaf.  0
24a20 20 69 66 20 70 50 61 67 65 20 69 73 20 6e 6f 74   if pPage is not
24a30 20 61 20 6c 65 61 66 2e 0a 20 20 2a 2a 20 20 20   a leaf..  **   
24a40 20 20 20 20 6c 65 61 66 44 61 74 61 3a 20 20 31      leafData:  1
24a50 20 69 66 20 70 50 61 67 65 20 68 6f 6c 64 73 20   if pPage holds 
24a60 6b 65 79 2b 64 61 74 61 20 61 6e 64 20 70 50 61  key+data and pPa
24a70 72 65 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c 79 20  rent holds only 
24a80 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20 20 6e 43 65  keys..  */.  nCe
24a90 6c 6c 20 3d 20 30 3b 0a 20 20 6c 65 61 66 43 6f  ll = 0;.  leafCo
24aa0 72 72 65 63 74 69 6f 6e 20 3d 20 70 50 61 67 65  rrection = pPage
24ab0 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61 66  ->leaf*4;.  leaf
24ac0 44 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 6c 65  Data = pPage->le
24ad0 61 66 44 61 74 61 20 26 26 20 70 50 61 67 65 2d  afData && pPage-
24ae0 3e 6c 65 61 66 3b 0a 20 20 66 6f 72 28 69 3d 30  >leaf;.  for(i=0
24af0 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a  ; i<nOld; i++){.
24b00 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c      MemPage *pOl
24b10 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d 3b 0a 20  d = apCopy[i];. 
24b20 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 70     int limit = p
24b30 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d  Old->nCell+pOld-
24b40 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20  >nOverflow;.    
24b50 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74  for(j=0; j<limit
24b60 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  ; j++){.      as
24b70 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78  sert( nCell<nMax
24b80 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 61  Cells );.      a
24b90 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66  pCell[nCell] = f
24ba0 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28  indOverflowCell(
24bb0 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20 20 20  pOld, j);.      
24bc0 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  szCell[nCell] = 
24bd0 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64  cellSizePtr(pOld
24be0 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29  , apCell[nCell])
24bf0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
24c00 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
24c10 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
24c20 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
24c30 20 20 20 20 20 20 69 6e 74 20 61 3b 0a 20 20 20        int a;.   
24c40 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c       aFrom[nCell
24c50 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 66  ] = i;.        f
24c60 6f 72 28 61 3d 30 3b 20 61 3c 70 4f 6c 64 2d 3e  or(a=0; a<pOld->
24c70 6e 4f 76 65 72 66 6c 6f 77 3b 20 61 2b 2b 29 7b  nOverflow; a++){
24c80 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
24c90 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 61 5d 2e 70 43  Old->aOvfl[a].pC
24ca0 65 6c 6c 3d 3d 61 70 43 65 6c 6c 5b 6e 43 65 6c  ell==apCell[nCel
24cb0 6c 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l] ){.          
24cc0 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d    aFrom[nCell] =
24cd0 20 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20 20   0xFF;.         
24ce0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
24cf0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
24d00 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
24d10 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20       nCell++;.  
24d20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f    }.    if( i<nO
24d30 6c 64 2d 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  ld-1 ){.      in
24d40 74 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50  t sz = cellSizeP
24d50 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69  tr(pParent, apDi
24d60 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  v[i]);.      if(
24d70 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20   leafData ){.   
24d80 20 20 20 20 20 2f 2a 20 57 69 74 68 20 74 68 65       /* With the
24d90 20 4c 45 41 46 44 41 54 41 20 66 6c 61 67 2c 20   LEAFDATA flag, 
24da0 70 50 61 72 65 6e 74 20 63 65 6c 6c 73 20 68 6f  pParent cells ho
24db0 6c 64 20 6f 6e 6c 79 20 49 4e 54 4b 45 59 73 20  ld only INTKEYs 
24dc0 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
24dd0 61 72 65 20 64 75 70 6c 69 63 61 74 65 73 20 6f  are duplicates o
24de0 66 20 6b 65 79 73 20 6f 6e 20 74 68 65 20 63 68  f keys on the ch
24df0 69 6c 64 20 70 61 67 65 73 2e 20 20 57 65 20 6e  ild pages.  We n
24e00 65 65 64 20 74 6f 20 72 65 6d 6f 76 65 0a 20 20  eed to remove.  
24e10 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 69 76        ** the div
24e20 69 64 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20  ider cells from 
24e30 70 50 61 72 65 6e 74 2c 20 62 75 74 20 74 68 65  pParent, but the
24e40 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20   dividers cells 
24e50 61 72 65 20 6e 6f 74 0a 20 20 20 20 20 20 20 20  are not.        
24e60 2a 2a 20 61 64 64 65 64 20 74 6f 20 61 70 43 65  ** added to apCe
24e70 6c 6c 5b 5d 20 62 65 63 61 75 73 65 20 74 68 65  ll[] because the
24e80 79 20 61 72 65 20 64 75 70 6c 69 63 61 74 65 73  y are duplicates
24e90 20 6f 66 20 63 68 69 6c 64 20 63 65 6c 6c 73 2e   of child cells.
24ea0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
24eb0 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61      dropCell(pPa
24ec0 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 73 7a 29  rent, nxDiv, sz)
24ed0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
24ee0 20 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70         u8 *pTemp
24ef0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
24f00 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c  ( nCell<nMaxCell
24f10 73 20 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43  s );.        szC
24f20 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b  ell[nCell] = sz;
24f30 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d  .        pTemp =
24f40 20 26 61 53 70 61 63 65 5b 69 53 70 61 63 65 5d   &aSpace[iSpace]
24f50 3b 0a 20 20 20 20 20 20 20 20 69 53 70 61 63 65  ;.        iSpace
24f60 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20   += sz;.        
24f70 61 73 73 65 72 74 28 20 69 53 70 61 63 65 3c 3d  assert( iSpace<=
24f80 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 35 20  pBt->pageSize*5 
24f90 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
24fa0 79 28 70 54 65 6d 70 2c 20 61 70 44 69 76 5b 69  y(pTemp, apDiv[i
24fb0 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 20 20  ], sz);.        
24fc0 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  apCell[nCell] = 
24fd0 70 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63  pTemp+leafCorrec
24fe0 74 69 6f 6e 3b 0a 23 69 66 6e 64 65 66 20 53 51  tion;.#ifndef SQ
24ff0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
25000 43 55 55 4d 0a 20 20 20 20 20 20 20 20 69 66 28  CUUM.        if(
25010 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
25020 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 46   ){.          aF
25030 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78 46  rom[nCell] = 0xF
25040 46 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  F;.        }.#en
25050 64 69 66 0a 20 20 20 20 20 20 20 20 64 72 6f 70  dif.        drop
25060 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78  Cell(pParent, nx
25070 44 69 76 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20  Div, sz);.      
25080 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    szCell[nCell] 
25090 2d 3d 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  -= leafCorrectio
250a0 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  n;.        asser
250b0 74 28 20 67 65 74 34 62 79 74 65 28 70 54 65 6d  t( get4byte(pTem
250c0 70 29 3d 3d 70 67 6e 6f 4f 6c 64 5b 69 5d 20 29  p)==pgnoOld[i] )
250d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  ;.        if( !p
250e0 4f 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  Old->leaf ){.   
250f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
25100 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30  eafCorrection==0
25110 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   );.          /*
25120 20 54 68 65 20 72 69 67 68 74 20 70 6f 69 6e 74   The right point
25130 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  er of the child 
25140 70 61 67 65 20 70 4f 6c 64 20 62 65 63 6f 6d 65  page pOld become
25150 73 20 74 68 65 20 6c 65 66 74 0a 20 20 20 20 20  s the left.     
25160 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20       ** pointer 
25170 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63  of the divider c
25180 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ell */.         
25190 20 6d 65 6d 63 70 79 28 61 70 43 65 6c 6c 5b 6e   memcpy(apCell[n
251a0 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44  Cell], &pOld->aD
251b0 61 74 61 5b 70 4f 6c 64 2d 3e 68 64 72 4f 66 66  ata[pOld->hdrOff
251c0 73 65 74 2b 38 5d 2c 20 34 29 3b 0a 20 20 20 20  set+8], 4);.    
251d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
251e0 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61       assert( lea
251f0 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29  fCorrection==4 )
25200 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
25210 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20      nCell++;.   
25220 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
25230 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65    /*.  ** Figure
25240 20 6f 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20   out the number 
25250 6f 66 20 70 61 67 65 73 20 6e 65 65 64 65 64 20  of pages needed 
25260 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c  to hold all nCel
25270 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74  l cells..  ** St
25280 6f 72 65 20 74 68 69 73 20 6e 75 6d 62 65 72 20  ore this number 
25290 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f  in "k".  Also co
252a0 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68  mpute szNew[] wh
252b0 69 63 68 20 69 73 20 74 68 65 20 74 6f 74 61 6c  ich is the total
252c0 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c  .  ** size of al
252d0 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69  l cells on the i
252e0 2d 74 68 20 70 61 67 65 20 61 6e 64 20 63 6e 74  -th page and cnt
252f0 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74  New[] which is t
25300 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e  he index.  ** in
25310 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65   apCell[] of the
25320 20 63 65 6c 6c 20 74 68 61 74 20 64 69 76 69 64   cell that divid
25330 65 73 20 70 61 67 65 20 69 20 66 72 6f 6d 20 70  es page i from p
25340 61 67 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20  age i+1.  .  ** 
25350 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64  cntNew[k] should
25360 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20   equal nCell..  
25370 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20 63  **.  ** Values c
25380 6f 6d 70 75 74 65 64 20 62 79 20 74 68 69 73 20  omputed by this 
25390 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  block:.  **.  **
253a0 20 20 20 20 20 20 20 20 20 20 20 6b 3a 20 54 68             k: Th
253b0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
253c0 66 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 0a  f sibling pages.
253d0 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d    **    szNew[i]
253e0 3a 20 53 70 61 63 65 64 20 75 73 65 64 20 6f 6e  : Spaced used on
253f0 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e   the i-th siblin
25400 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63  g page..  **   c
25410 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20  ntNew[i]: Index 
25420 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20  in apCell[] and 
25430 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65  szCell[] for the
25440 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20   first cell to. 
25450 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
25460 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68   the right of th
25470 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70  e i-th sibling p
25480 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65  age..  ** usable
25490 53 70 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66  Space: Number of
254a0 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
254b0 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63  available on eac
254c0 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20  h sibling..  ** 
254d0 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70  .  */.  usableSp
254e0 61 63 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ace = pBt->usabl
254f0 65 53 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61  eSize - 12 + lea
25500 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66  fCorrection;.  f
25510 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d  or(subtotal=k=i=
25520 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
25530 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c  {.    assert( i<
25540 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
25550 20 73 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43   subtotal += szC
25560 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20  ell[i] + 2;.    
25570 69 66 28 20 73 75 62 74 6f 74 61 6c 20 3e 20 75  if( subtotal > u
25580 73 61 62 6c 65 53 70 61 63 65 20 29 7b 0a 20 20  sableSpace ){.  
25590 20 20 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73      szNew[k] = s
255a0 75 62 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c  ubtotal - szCell
255b0 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65  [i];.      cntNe
255c0 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20  w[k] = i;.      
255d0 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 20  if( leafData ){ 
255e0 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75 62  i--; }.      sub
255f0 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  total = 0;.     
25600 20 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   k++;.    }.  }.
25610 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62    szNew[k] = sub
25620 74 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b  total;.  cntNew[
25630 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b  k] = nCell;.  k+
25640 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68  +;..  /*.  ** Th
25650 65 20 70 61 63 6b 69 6e 67 20 63 6f 6d 70 75 74  e packing comput
25660 65 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f  ed by the previo
25670 75 73 20 62 6c 6f 63 6b 20 69 73 20 62 69 61 73  us block is bias
25680 65 64 20 74 6f 77 61 72 64 20 74 68 65 20 73 69  ed toward the si
25690 62 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20 74  blings.  ** on t
256a0 68 65 20 6c 65 66 74 20 73 69 64 65 2e 20 20 54  he left side.  T
256b0 68 65 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 73  he left siblings
256c0 20 61 72 65 20 61 6c 77 61 79 73 20 6e 65 61 72   are always near
256d0 6c 79 20 66 75 6c 6c 2c 20 77 68 69 6c 65 20 74  ly full, while t
256e0 68 65 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d 6f  he.  ** right-mo
256f0 73 74 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74  st sibling might
25700 20 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79   be nearly empty
25710 2e 20 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66  .  This block of
25720 20 63 6f 64 65 20 61 74 74 65 6d 70 74 73 0a 20   code attempts. 
25730 20 2a 2a 20 74 6f 20 61 64 6a 75 73 74 20 74 68   ** to adjust th
25740 65 20 70 61 63 6b 69 6e 67 20 6f 66 20 73 69 62  e packing of sib
25750 6c 69 6e 67 73 20 74 6f 20 67 65 74 20 61 20 62  lings to get a b
25760 65 74 74 65 72 20 62 61 6c 61 6e 63 65 2e 0a 20  etter balance.. 
25770 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 61 64   **.  ** This ad
25780 6a 75 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72 65  justment is more
25790 20 74 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69 7a   than an optimiz
257a0 61 74 69 6f 6e 2e 20 20 54 68 65 20 70 61 63 6b  ation.  The pack
257b0 69 6e 67 20 61 62 6f 76 65 20 6d 69 67 68 74 0a  ing above might.
257c0 20 20 2a 2a 20 62 65 20 73 6f 20 6f 75 74 20 6f    ** be so out o
257d0 66 20 62 61 6c 61 6e 63 65 20 61 73 20 74 6f 20  f balance as to 
257e0 62 65 20 69 6c 6c 65 67 61 6c 2e 20 20 46 6f 72  be illegal.  For
257f0 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 72 69   example, the ri
25800 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73 69  ght-most.  ** si
25810 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20 63  bling might be c
25820 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e  ompletely empty.
25830 20 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e    This adjustmen
25840 74 20 69 73 20 6e 6f 74 20 6f 70 74 69 6f 6e 61  t is not optiona
25850 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  l..  */.  for(i=
25860 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a  k-1; i>0; i--){.
25870 20 20 20 20 69 6e 74 20 73 7a 52 69 67 68 74 20      int szRight 
25880 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20  = szNew[i];  /* 
25890 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20  Size of sibling 
258a0 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a  on the right */.
258b0 20 20 20 20 69 6e 74 20 73 7a 4c 65 66 74 20 3d      int szLeft =
258c0 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20   szNew[i-1]; /* 
258d0 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20  Size of sibling 
258e0 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20  on the left */. 
258f0 20 20 20 69 6e 74 20 72 3b 20 20 20 20 20 20 20     int r;       
25900 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
25910 6f 66 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65  of right-most ce
25920 6c 6c 20 69 6e 20 6c 65 66 74 20 73 69 62 6c 69  ll in left sibli
25930 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 3b  ng */.    int d;
25940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25950 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20   Index of first 
25960 63 65 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66 74  cell to the left
25970 20 6f 66 20 72 69 67 68 74 20 73 69 62 6c 69 6e   of right siblin
25980 67 20 2a 2f 0a 0a 20 20 20 20 72 20 3d 20 63 6e  g */..    r = cn
25990 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20  tNew[i-1] - 1;. 
259a0 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c     d = r + 1 - l
259b0 65 61 66 44 61 74 61 3b 0a 20 20 20 20 61 73 73  eafData;.    ass
259c0 65 72 74 28 20 64 3c 6e 4d 61 78 43 65 6c 6c 73  ert( d<nMaxCells
259d0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
259e0 72 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  r<nMaxCells );. 
259f0 20 20 20 77 68 69 6c 65 28 20 73 7a 52 69 67 68     while( szRigh
25a00 74 3d 3d 30 20 7c 7c 20 73 7a 52 69 67 68 74 2b  t==0 || szRight+
25a10 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c  szCell[d]+2<=szL
25a20 65 66 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32  eft-(szCell[r]+2
25a30 29 20 29 7b 0a 20 20 20 20 20 20 73 7a 52 69 67  ) ){.      szRig
25a40 68 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20  ht += szCell[d] 
25a50 2b 20 32 3b 0a 20 20 20 20 20 20 73 7a 4c 65 66  + 2;.      szLef
25a60 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b  t -= szCell[r] +
25a70 20 32 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77   2;.      cntNew
25a80 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20 20 72  [i-1]--;.      r
25a90 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d   = cntNew[i-1] -
25aa0 20 31 3b 0a 20 20 20 20 20 20 64 20 3d 20 72 20   1;.      d = r 
25ab0 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a  + 1 - leafData;.
25ac0 20 20 20 20 7d 0a 20 20 20 20 73 7a 4e 65 77 5b      }.    szNew[
25ad0 69 5d 20 3d 20 73 7a 52 69 67 68 74 3b 0a 20 20  i] = szRight;.  
25ae0 20 20 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20 73    szNew[i-1] = s
25af0 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  zLeft;.  }..  /*
25b00 20 45 69 74 68 65 72 20 77 65 20 66 6f 75 6e 64   Either we found
25b10 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 65 6c   one or more cel
25b20 6c 73 20 28 63 6e 74 6e 65 77 5b 30 5d 29 3e 30  ls (cntnew[0])>0
25b30 29 20 6f 72 20 77 65 20 61 72 65 20 74 68 65 0a  ) or we are the.
25b40 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 72    ** a virtual r
25b50 6f 6f 74 20 70 61 67 65 2e 20 20 41 20 76 69 72  oot page.  A vir
25b60 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69  tual root page i
25b70 73 20 77 68 65 6e 20 74 68 65 20 72 65 61 6c 20  s when the real 
25b80 72 6f 6f 74 0a 20 20 2a 2a 20 70 61 67 65 20 69  root.  ** page i
25b90 73 20 70 61 67 65 20 31 20 61 6e 64 20 77 65 20  s page 1 and we 
25ba0 61 72 65 20 74 68 65 20 6f 6e 6c 79 20 63 68 69  are the only chi
25bb0 6c 64 20 6f 66 20 74 68 61 74 20 70 61 67 65 2e  ld of that page.
25bc0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
25bd0 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20 28  cntNew[0]>0 || (
25be0 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31  pParent->pgno==1
25bf0 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65   && pParent->nCe
25c00 6c 6c 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 0a  ll==0) );..  /*.
25c10 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20    ** Allocate k 
25c20 6e 65 77 20 70 61 67 65 73 2e 20 20 52 65 75 73  new pages.  Reus
25c30 65 20 6f 6c 64 20 70 61 67 65 73 20 77 68 65 72  e old pages wher
25c40 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f  e possible..  */
25c50 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
25c60 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20 20 70 61  ->pgno>1 );.  pa
25c70 67 65 46 6c 61 67 73 20 3d 20 70 50 61 67 65 2d  geFlags = pPage-
25c80 3e 61 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f 72  >aData[0];.  for
25c90 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b  (i=0; i<k; i++){
25ca0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  .    MemPage *pN
25cb0 65 77 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f  ew;.    if( i<nO
25cc0 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  ld ){.      pNew
25cd0 20 3d 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70   = apNew[i] = ap
25ce0 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 70 67  Old[i];.      pg
25cf0 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70 67 6e 6f 4f  noNew[i] = pgnoO
25d00 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f  ld[i];.      apO
25d10 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  ld[i] = 0;.     
25d20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
25d30 65 72 5f 77 72 69 74 65 28 70 4e 65 77 2d 3e 61  er_write(pNew->a
25d40 44 61 74 61 29 3b 0a 20 20 20 20 20 20 69 66 28  Data);.      if(
25d50 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
25d60 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
25d70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
25d80 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20  ert( i>0 );.    
25d90 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 50    rc = allocateP
25da0 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20  age(pBt, &pNew, 
25db0 26 70 67 6e 6f 4e 65 77 5b 69 5d 2c 20 70 67 6e  &pgnoNew[i], pgn
25dc0 6f 4e 65 77 5b 69 2d 31 5d 2c 20 30 29 3b 0a 20  oNew[i-1], 0);. 
25dd0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
25de0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
25df0 75 70 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b  up;.      apNew[
25e00 69 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d  i] = pNew;.    }
25e10 0a 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20  .    nNew++;.   
25e20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20   zeroPage(pNew, 
25e30 70 61 67 65 46 6c 61 67 73 29 3b 0a 20 20 7d 0a  pageFlags);.  }.
25e40 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f  .  /* Free any o
25e50 6c 64 20 70 61 67 65 73 20 74 68 61 74 20 77 65  ld pages that we
25e60 72 65 20 6e 6f 74 20 72 65 75 73 65 64 20 61 73  re not reused as
25e70 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f   new pages..  */
25e80 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 4f 6c 64  .  while( i<nOld
25e90 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 72 65   ){.    rc = fre
25ea0 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b  ePage(apOld[i]);
25eb0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
25ec0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
25ed0 75 70 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  up;.    releaseP
25ee0 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20  age(apOld[i]);. 
25ef0 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b     apOld[i] = 0;
25f00 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20  .    i++;.  }.. 
25f10 20 2f 2a 0a 20 20 2a 2a 20 50 75 74 20 74 68 65   /*.  ** Put the
25f20 20 6e 65 77 20 70 61 67 65 73 20 69 6e 20 61 63   new pages in ac
25f30 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20  cending order.  
25f40 54 68 69 73 20 68 65 6c 70 73 20 74 6f 0a 20 20  This helps to.  
25f50 2a 2a 20 6b 65 65 70 20 65 6e 74 72 69 65 73 20  ** keep entries 
25f60 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  in the disk file
25f70 20 69 6e 20 6f 72 64 65 72 20 73 6f 20 74 68 61   in order so tha
25f80 74 20 61 20 73 63 61 6e 0a 20 20 2a 2a 20 6f 66  t a scan.  ** of
25f90 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 61 20   the table is a 
25fa0 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f  linear scan thro
25fb0 75 67 68 20 74 68 65 20 66 69 6c 65 2e 20 20 54  ugh the file.  T
25fc0 68 61 74 0a 20 20 2a 2a 20 69 6e 20 74 75 72 6e  hat.  ** in turn
25fd0 20 68 65 6c 70 73 20 74 68 65 20 6f 70 65 72 61   helps the opera
25fe0 74 69 6e 67 20 73 79 73 74 65 6d 20 74 6f 20 64  ting system to d
25ff0 65 6c 69 76 65 72 20 70 61 67 65 73 0a 20 20 2a  eliver pages.  *
26000 2a 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20  * from the disk 
26010 6d 6f 72 65 20 72 61 70 69 64 6c 79 2e 0a 20 20  more rapidly..  
26020 2a 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32  **.  ** An O(n^2
26030 29 20 69 6e 73 65 72 74 69 6f 6e 20 73 6f 72 74  ) insertion sort
26040 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 75 73   algorithm is us
26050 65 64 2c 20 62 75 74 20 73 69 6e 63 65 0a 20 20  ed, but since.  
26060 2a 2a 20 6e 20 69 73 20 6e 65 76 65 72 20 6d 6f  ** n is never mo
26070 72 65 20 74 68 61 6e 20 4e 42 20 28 61 20 73 6d  re than NB (a sm
26080 61 6c 6c 20 63 6f 6e 73 74 61 6e 74 29 2c 20 74  all constant), t
26090 68 61 74 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20  hat should.  ** 
260a0 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d  not be a problem
260b0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e  ..  **.  ** When
260c0 20 4e 42 3d 3d 33 2c 20 74 68 69 73 20 6f 6e 65   NB==3, this one
260d0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 61   optimization ma
260e0 6b 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  kes the database
260f0 0a 20 20 2a 2a 20 61 62 6f 75 74 20 32 35 25 20  .  ** about 25% 
26100 66 61 73 74 65 72 20 66 6f 72 20 6c 61 72 67 65  faster for large
26110 20 69 6e 73 65 72 74 69 6f 6e 73 20 61 6e 64 20   insertions and 
26120 64 65 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  deletions..  */.
26130 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d 31    for(i=0; i<k-1
26140 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
26150 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e 65 77 5b 69  minV = pgnoNew[i
26160 5d 3b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 49 20  ];.    int minI 
26170 3d 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69  = i;.    for(j=i
26180 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20  +1; j<k; j++){. 
26190 20 20 20 20 20 69 66 28 20 70 67 6e 6f 4e 65 77       if( pgnoNew
261a0 5b 6a 5d 3c 28 75 6e 73 69 67 6e 65 64 29 6d 69  [j]<(unsigned)mi
261b0 6e 56 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 69  nV ){.        mi
261c0 6e 49 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  nI = j;.        
261d0 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e 65 77 5b 6a  minV = pgnoNew[j
261e0 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ];.      }.    }
261f0 0a 20 20 20 20 69 66 28 20 6d 69 6e 49 3e 69 20  .    if( minI>i 
26200 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 3b 0a  ){.      int t;.
26210 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
26220 54 3b 0a 20 20 20 20 20 20 74 20 3d 20 70 67 6e  T;.      t = pgn
26230 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 70  oNew[i];.      p
26240 54 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20  T = apNew[i];.  
26250 20 20 20 20 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d      pgnoNew[i] =
26260 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 3b 0a   pgnoNew[minI];.
26270 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d        apNew[i] =
26280 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20   apNew[minI];.  
26290 20 20 20 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49      pgnoNew[minI
262a0 5d 20 3d 20 74 3b 0a 20 20 20 20 20 20 61 70 4e  ] = t;.      apN
262b0 65 77 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a 20  ew[minI] = pT;. 
262c0 20 20 20 7d 0a 20 20 7d 0a 20 20 54 52 41 43 45     }.  }.  TRACE
262d0 28 28 22 42 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a  (("BALANCE: old:
262e0 20 25 64 20 25 64 20 25 64 20 20 6e 65 77 3a 20   %d %d %d  new: 
262f0 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64  %d(%d) %d(%d) %d
26300 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25  (%d) %d(%d) %d(%
26310 64 29 5c 6e 22 2c 0a 20 20 20 20 70 67 6e 6f 4f  d)\n",.    pgnoO
26320 6c 64 5b 30 5d 2c 20 0a 20 20 20 20 6e 4f 6c 64  ld[0], .    nOld
26330 3e 3d 32 20 3f 20 70 67 6e 6f 4f 6c 64 5b 31 5d  >=2 ? pgnoOld[1]
26340 20 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d   : 0,.    nOld>=
26350 33 20 3f 20 70 67 6e 6f 4f 6c 64 5b 32 5d 20 3a  3 ? pgnoOld[2] :
26360 20 30 2c 0a 20 20 20 20 70 67 6e 6f 4e 65 77 5b   0,.    pgnoNew[
26370 30 5d 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20  0], szNew[0],.  
26380 20 20 6e 4e 65 77 3e 3d 32 20 3f 20 70 67 6e 6f    nNew>=2 ? pgno
26390 4e 65 77 5b 31 5d 20 3a 20 30 2c 20 6e 4e 65 77  New[1] : 0, nNew
263a0 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a  >=2 ? szNew[1] :
263b0 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 33 20   0,.    nNew>=3 
263c0 3f 20 70 67 6e 6f 4e 65 77 5b 32 5d 20 3a 20 30  ? pgnoNew[2] : 0
263d0 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e 65  , nNew>=3 ? szNe
263e0 77 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e  w[2] : 0,.    nN
263f0 65 77 3e 3d 34 20 3f 20 70 67 6e 6f 4e 65 77 5b  ew>=4 ? pgnoNew[
26400 33 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34 20  3] : 0, nNew>=4 
26410 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a  ? szNew[3] : 0,.
26420 20 20 20 20 6e 4e 65 77 3e 3d 35 20 3f 20 70 67      nNew>=5 ? pg
26430 6e 6f 4e 65 77 5b 34 5d 20 3a 20 30 2c 20 6e 4e  noNew[4] : 0, nN
26440 65 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b 34 5d  ew>=5 ? szNew[4]
26450 20 3a 20 30 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20   : 0));..  /*.  
26460 2a 2a 20 45 76 65 6e 6c 79 20 64 69 73 74 72 69  ** Evenly distri
26470 62 75 74 65 20 74 68 65 20 64 61 74 61 20 69 6e  bute the data in
26480 20 61 70 43 65 6c 6c 5b 5d 20 61 63 72 6f 73 73   apCell[] across
26490 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 2e 0a   the new pages..
264a0 20 20 2a 2a 20 49 6e 73 65 72 74 20 64 69 76 69    ** Insert divi
264b0 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 70  der cells into p
264c0 50 61 72 65 6e 74 20 61 73 20 6e 65 63 65 73 73  Parent as necess
264d0 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20  ary..  */.  j = 
264e0 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
264f0 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nNew; i++){.    
26500 2f 2a 20 41 73 73 65 6d 62 6c 65 20 74 68 65 20  /* Assemble the 
26510 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65  new sibling page
26520 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65  . */.    MemPage
26530 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69   *pNew = apNew[i
26540 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  ];.    assert( j
26550 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
26560 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
26570 70 67 6e 6f 3d 3d 70 67 6e 6f 4e 65 77 5b 69 5d  pgno==pgnoNew[i]
26580 20 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c 65   );.    assemble
26590 50 61 67 65 28 70 4e 65 77 2c 20 63 6e 74 4e 65  Page(pNew, cntNe
265a0 77 5b 69 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b  w[i]-j, &apCell[
265b0 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b  j], &szCell[j]);
265c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
265d0 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e  w->nCell>0 || (n
265e0 4e 65 77 3d 3d 31 20 26 26 20 63 6e 74 4e 65 77  New==1 && cntNew
265f0 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61  [0]==0) );.    a
26600 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 76  ssert( pNew->nOv
26610 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 23 69  erflow==0 );..#i
26620 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
26630 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
26640 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
26650 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
26660 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74  tabase, update t
26670 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
26680 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 74 68  ntries.    ** th
26690 61 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  at point to the 
266a0 73 69 62 6c 69 6e 67 73 20 74 68 61 74 20 77 65  siblings that we
266b0 72 65 20 72 65 61 72 72 61 6e 67 65 64 2e 20 54  re rearranged. T
266c0 68 65 73 65 20 63 61 6e 20 62 65 3a 20 6c 65 66  hese can be: lef
266d0 74 0a 20 20 20 20 2a 2a 20 63 68 69 6c 64 72 65  t.    ** childre
266e0 6e 20 6f 66 20 63 65 6c 6c 73 2c 20 74 68 65 20  n of cells, the 
266f0 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 74  right-child of t
26700 68 65 20 70 61 67 65 2c 20 6f 72 20 6f 76 65 72  he page, or over
26710 66 6c 6f 77 20 70 61 67 65 73 0a 20 20 20 20 2a  flow pages.    *
26720 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  * pointed to by 
26730 63 65 6c 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  cells..    */.  
26740 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
26750 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 66  acuum ){.      f
26760 6f 72 28 6b 3d 6a 3b 20 6b 3c 63 6e 74 4e 65 77  or(k=j; k<cntNew
26770 5b 69 5d 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  [i]; k++){.     
26780 20 20 20 61 73 73 65 72 74 28 20 6b 3c 6e 4d 61     assert( k<nMa
26790 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20  xCells );.      
267a0 20 20 69 66 28 20 61 46 72 6f 6d 5b 6b 5d 3d 3d    if( aFrom[k]==
267b0 30 78 46 46 20 7c 7c 20 61 70 43 6f 70 79 5b 61  0xFF || apCopy[a
267c0 46 72 6f 6d 5b 6b 5d 5d 2d 3e 70 67 6e 6f 21 3d  From[k]]->pgno!=
267d0 70 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20  pNew->pgno ){.  
267e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72          rc = ptr
267f0 6d 61 70 50 75 74 4f 76 66 6c 28 70 4e 65 77 2c  mapPutOvfl(pNew,
26800 20 6b 2d 6a 29 3b 0a 20 20 20 20 20 20 20 20 20   k-j);.         
26810 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
26820 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
26830 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
26840 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20  leanup;.        
26850 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
26860 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
26870 69 66 0a 0a 20 20 20 20 6a 20 3d 20 63 6e 74 4e  if..    j = cntN
26880 65 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49  ew[i];..    /* I
26890 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61  f the sibling pa
268a0 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f  ge assembled abo
268b0 76 65 20 77 61 73 20 6e 6f 74 20 74 68 65 20 72  ve was not the r
268c0 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e  ight-most siblin
268d0 67 2c 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74  g,.    ** insert
268e0 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20   a divider cell 
268f0 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  into the parent 
26900 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
26910 20 69 66 28 20 69 3c 6e 4e 65 77 2d 31 20 26 26   if( i<nNew-1 &&
26920 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20   j<nCell ){.    
26930 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20    u8 *pCell;.   
26940 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20     u8 *pTemp;.  
26950 20 20 20 20 69 6e 74 20 73 7a 3b 0a 0a 20 20 20      int sz;..   
26960 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61     assert( j<nMa
26970 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20  xCells );.      
26980 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a  pCell = apCell[j
26990 5d 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 73 7a  ];.      sz = sz
269a0 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f  Cell[j] + leafCo
269b0 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20  rrection;.      
269c0 69 66 28 20 21 70 4e 65 77 2d 3e 6c 65 61 66 20  if( !pNew->leaf 
269d0 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
269e0 79 28 26 70 4e 65 77 2d 3e 61 44 61 74 61 5b 38  y(&pNew->aData[8
269f0 5d 2c 20 70 43 65 6c 6c 2c 20 34 29 3b 0a 20 20  ], pCell, 4);.  
26a00 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 30 3b        pTemp = 0;
26a10 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
26a20 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 09 2f 2a   leafData ){../*
26a30 20 49 66 20 74 68 65 20 74 72 65 65 20 69 73 20   If the tree is 
26a40 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65  a leaf-data tree
26a50 2c 20 61 6e 64 20 74 68 65 20 73 69 62 6c 69 6e  , and the siblin
26a60 67 73 20 61 72 65 20 6c 65 61 76 65 73 2c 20 0a  gs are leaves, .
26a70 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
26a80 74 68 65 72 65 20 69 73 20 6e 6f 20 64 69 76 69  there is no divi
26a90 64 65 72 20 63 65 6c 6c 20 69 6e 20 61 70 43 65  der cell in apCe
26aa0 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c 20 74  ll[]. Instead, t
26ab0 68 65 20 64 69 76 69 64 65 72 20 0a 20 20 20 20  he divider .    
26ac0 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73      ** cell cons
26ad0 69 73 74 73 20 6f 66 20 74 68 65 20 69 6e 74 65  ists of the inte
26ae0 67 65 72 20 6b 65 79 20 66 6f 72 20 74 68 65 20  ger key for the 
26af0 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20  right-most cell 
26b00 6f 66 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  of .        ** t
26b10 68 65 20 73 69 62 6c 69 6e 67 2d 70 61 67 65 20  he sibling-page 
26b20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20  assembled above 
26b30 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f  only..        */
26b40 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  .        CellInf
26b50 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  o info;.        
26b60 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 70 61 72  j--;.        par
26b70 73 65 43 65 6c 6c 50 74 72 28 70 4e 65 77 2c 20  seCellPtr(pNew, 
26b80 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f  apCell[j], &info
26b90 29 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  );.        pCell
26ba0 20 3d 20 26 61 53 70 61 63 65 5b 69 53 70 61 63   = &aSpace[iSpac
26bb0 65 5d 3b 0a 20 20 20 20 20 20 20 20 66 69 6c 6c  e];.        fill
26bc0 49 6e 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  InCell(pParent, 
26bd0 70 43 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e  pCell, 0, info.n
26be0 4b 65 79 2c 20 30 2c 20 30 2c 20 26 73 7a 29 3b  Key, 0, 0, &sz);
26bf0 0a 20 20 20 20 20 20 20 20 69 53 70 61 63 65 20  .        iSpace 
26c00 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 61  += sz;.        a
26c10 73 73 65 72 74 28 20 69 53 70 61 63 65 3c 3d 70  ssert( iSpace<=p
26c20 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 35 20 29  Bt->pageSize*5 )
26c30 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70 20  ;.        pTemp 
26c40 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
26c50 7b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20  {.        pCell 
26c60 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 70 54  -= 4;.        pT
26c70 65 6d 70 20 3d 20 26 61 53 70 61 63 65 5b 69 53  emp = &aSpace[iS
26c80 70 61 63 65 5d 3b 0a 20 20 20 20 20 20 20 20 69  pace];.        i
26c90 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20  Space += sz;.   
26ca0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53 70       assert( iSp
26cb0 61 63 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69  ace<=pBt->pageSi
26cc0 7a 65 2a 35 20 29 3b 0a 20 20 20 20 20 20 7d 0a  ze*5 );.      }.
26cd0 20 20 20 20 20 20 72 63 20 3d 20 69 6e 73 65 72        rc = inser
26ce0 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e  tCell(pParent, n
26cf0 78 44 69 76 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c  xDiv, pCell, sz,
26d00 20 70 54 65 6d 70 2c 20 34 29 3b 0a 20 20 20 20   pTemp, 4);.    
26d10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
26d20 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e  _OK ) goto balan
26d30 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
26d40 20 20 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f    put4byte(findO
26d50 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72  verflowCell(pPar
26d60 65 6e 74 2c 6e 78 44 69 76 29 2c 20 70 4e 65 77  ent,nxDiv), pNew
26d70 2d 3e 70 67 6e 6f 29 3b 0a 23 69 66 6e 64 65 66  ->pgno);.#ifndef
26d80 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
26d90 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a  OVACUUM.      /*
26da0 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61   If this is an a
26db0 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
26dc0 61 73 65 2c 20 61 6e 64 20 6e 6f 74 20 61 20 6c  ase, and not a l
26dd0 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c 0a 20  eaf-data tree,. 
26de0 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 75 70 64       ** then upd
26df0 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ate the pointer 
26e00 6d 61 70 20 77 69 74 68 20 61 6e 20 65 6e 74 72  map with an entr
26e10 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  y for the overfl
26e20 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ow page.      **
26e30 20 74 68 61 74 20 74 68 65 20 63 65 6c 6c 20 6a   that the cell j
26e40 75 73 74 20 69 6e 73 65 72 74 65 64 20 70 6f 69  ust inserted poi
26e50 6e 74 73 20 74 6f 20 28 69 66 20 61 6e 79 29 2e  nts to (if any).
26e60 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
26e70 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
26e80 75 75 6d 20 26 26 20 21 6c 65 61 66 44 61 74 61  uum && !leafData
26e90 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
26ea0 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70   ptrmapPutOvfl(p
26eb0 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 29 3b 0a  Parent, nxDiv);.
26ec0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
26ed0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26ee0 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61         goto bala
26ef0 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
26f00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
26f10 65 6e 64 69 66 0a 20 20 20 20 20 20 6a 2b 2b 3b  endif.      j++;
26f20 0a 20 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a  .      nxDiv++;.
26f30 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
26f40 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a  rt( j==nCell );.
26f50 20 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30    assert( nOld>0
26f60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e   );.  assert( nN
26f70 65 77 3e 30 20 29 3b 0a 20 20 69 66 28 20 28 70  ew>0 );.  if( (p
26f80 61 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f 4c  ageFlags & PTF_L
26f90 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6d  EAF)==0 ){.    m
26fa0 65 6d 63 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65  emcpy(&apNew[nNe
26fb0 77 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20  w-1]->aData[8], 
26fc0 26 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d  &apCopy[nOld-1]-
26fd0 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b 0a 20  >aData[8], 4);. 
26fe0 20 7d 0a 20 20 69 66 28 20 6e 78 44 69 76 3d 3d   }.  if( nxDiv==
26ff0 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2b 70  pParent->nCell+p
27000 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
27010 77 20 29 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68  w ){.    /* Righ
27020 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 69  t-most sibling i
27030 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
27040 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e   child of pParen
27050 74 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74  t */.    put4byt
27060 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
27070 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
27080 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77  fset+8], pgnoNew
27090 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 65 6c  [nNew-1]);.  }el
270a0 73 65 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68 74  se{.    /* Right
270b0 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 69 73  -most sibling is
270c0 20 74 68 65 20 6c 65 66 74 20 63 68 69 6c 64 20   the left child 
270d0 6f 66 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  of the first ent
270e0 72 79 20 69 6e 20 70 50 61 72 65 6e 74 0a 20 20  ry in pParent.  
270f0 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 72 69    ** past the ri
27100 67 68 74 2d 6d 6f 73 74 20 64 69 76 69 64 65 72  ght-most divider
27110 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 70 75   entry */.    pu
27120 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66  t4byte(findOverf
27130 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  lowCell(pParent,
27140 20 6e 78 44 69 76 29 2c 20 70 67 6e 6f 4e 65 77   nxDiv), pgnoNew
27150 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 0a 0a  [nNew-1]);.  }..
27160 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 70 61 72 65    /*.  ** Repare
27170 6e 74 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 61  nt children of a
27180 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2f 0a 20  ll cells..  */. 
27190 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77   for(i=0; i<nNew
271a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d  ; i++){.    rc =
271b0 20 72 65 70 61 72 65 6e 74 43 68 69 6c 64 50 61   reparentChildPa
271c0 67 65 73 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20  ges(apNew[i]);. 
271d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
271e0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61  E_OK ) goto bala
271f0 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  nce_cleanup;.  }
27200 0a 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74  .  rc = reparent
27210 43 68 69 6c 64 50 61 67 65 73 28 70 50 61 72 65  ChildPages(pPare
27220 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  nt);.  if( rc!=S
27230 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
27240 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
27250 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 61 6c 61  ..  /*.  ** Bala
27260 6e 63 65 20 74 68 65 20 70 61 72 65 6e 74 20 70  nce the parent p
27270 61 67 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  age.  Note that 
27280 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
27290 20 28 70 50 61 67 65 29 20 6d 69 67 68 74 0a 20   (pPage) might. 
272a0 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 61 64   ** have been ad
272b0 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ded to the freel
272c0 69 73 74 20 73 6f 20 69 74 20 6d 69 67 68 74 20  ist so it might 
272d0 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 69 6e 69  no longer be ini
272e0 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 42  tialized..  ** B
272f0 75 74 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  ut the parent pa
27300 67 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  ge will always b
27310 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20  e initialized.. 
27320 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
27330 61 72 65 6e 74 2d 3e 69 73 49 6e 69 74 20 29 3b  arent->isInit );
27340 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28  .  rc = balance(
27350 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a 20 20 0a  pParent, 0);.  .
27360 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75    /*.  ** Cleanu
27370 70 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  p before returni
27380 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65  ng..  */.balance
27390 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69  _cleanup:.  sqli
273a0 74 65 46 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a  teFree(apCell);.
273b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c    for(i=0; i<nOl
273c0 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c  d; i++){.    rel
273d0 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69  easePage(apOld[i
273e0 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  ]);.  }.  for(i=
273f0 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b  0; i<nNew; i++){
27400 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
27410 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 7d 0a  (apNew[i]);.  }.
27420 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
27430 61 72 65 6e 74 29 3b 0a 20 20 54 52 41 43 45 28  arent);.  TRACE(
27440 28 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e 69 73  ("BALANCE: finis
27450 68 65 64 20 77 69 74 68 20 25 64 3a 20 6f 6c 64  hed with %d: old
27460 3d 25 64 20 6e 65 77 3d 25 64 20 63 65 6c 6c 73  =%d new=%d cells
27470 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
27480 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 6e    pPage->pgno, n
27490 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c  Old, nNew, nCell
274a0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
274b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
274c0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
274d0 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 70 61   for the root pa
274e0 67 65 20 6f 66 20 61 20 62 74 72 65 65 20 77 68  ge of a btree wh
274f0 65 6e 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70  en the root.** p
27500 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  age contains no 
27510 63 65 6c 6c 73 2e 20 20 54 68 69 73 20 69 73 20  cells.  This is 
27520 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74  an opportunity t
27530 6f 20 6d 61 6b 65 20 74 68 65 20 74 72 65 65 0a  o make the tree.
27540 2a 2a 20 73 68 61 6c 6c 6f 77 65 72 20 62 79 20  ** shallower by 
27550 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  one level..*/.st
27560 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
27570 5f 73 68 61 6c 6c 6f 77 65 72 28 4d 65 6d 50 61  _shallower(MemPa
27580 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 4d 65  ge *pPage){.  Me
27590 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 3b 20 20  mPage *pChild;  
275a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
275b0 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 70 61 67  e only child pag
275c0 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 20 20  e of pPage */.  
275d0 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b 20  Pgno pgnoChild; 
275e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
275f0 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  Page number for 
27600 70 43 68 69 6c 64 20 2a 2f 0a 20 20 69 6e 74 20  pChild */.  int 
27610 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
27620 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
27630 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
27640 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20  procedures */.  
27650 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
27660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27670 2f 2a 20 54 68 65 20 6d 61 69 6e 20 42 54 72 65  /* The main BTre
27680 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  e structure */. 
27690 20 69 6e 74 20 6d 78 43 65 6c 6c 50 65 72 50 61   int mxCellPerPa
276a0 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ge;           /*
276b0 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   Maximum number 
276c0 6f 66 20 63 65 6c 6c 73 20 70 65 72 20 70 61 67  of cells per pag
276d0 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
276e0 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
276f0 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73      /* All cells
27700 20 66 72 6f 6d 20 70 61 67 65 73 20 62 65 69 6e   from pages bein
27710 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20  g balanced */.  
27720 69 6e 74 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20  int *szCell;    
27730 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27740 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c  Local size of al
27750 6c 20 63 65 6c 6c 73 20 2a 2f 0a 0a 20 20 61 73  l cells */..  as
27760 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 50 61  sert( pPage->pPa
27770 72 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73  rent==0 );.  ass
27780 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
27790 6c 3d 3d 30 20 29 3b 0a 20 20 70 42 74 20 3d 20  l==0 );.  pBt = 
277a0 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 6d 78  pPage->pBt;.  mx
277b0 43 65 6c 6c 50 65 72 50 61 67 65 20 3d 20 4d 58  CellPerPage = MX
277c0 5f 43 45 4c 4c 28 70 42 74 29 3b 0a 20 20 61 70  _CELL(pBt);.  ap
277d0 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Cell = sqliteMal
277e0 6c 6f 63 52 61 77 28 20 6d 78 43 65 6c 6c 50 65  locRaw( mxCellPe
277f0 72 50 61 67 65 2a 28 73 69 7a 65 6f 66 28 75 38  rPage*(sizeof(u8
27800 2a 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29 20  *)+sizeof(int)) 
27810 29 3b 0a 20 20 69 66 28 20 61 70 43 65 6c 6c 3d  );.  if( apCell=
27820 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
27830 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 73 7a 43 65  TE_NOMEM;.  szCe
27840 6c 6c 20 3d 20 28 69 6e 74 2a 29 26 61 70 43 65  ll = (int*)&apCe
27850 6c 6c 5b 6d 78 43 65 6c 6c 50 65 72 50 61 67 65  ll[mxCellPerPage
27860 5d 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  ];.  if( pPage->
27870 6c 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a 20 54  leaf ){.    /* T
27880 68 65 20 74 61 62 6c 65 20 69 73 20 63 6f 6d 70  he table is comp
27890 6c 65 74 65 6c 79 20 65 6d 70 74 79 20 2a 2f 0a  letely empty */.
278a0 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c 41      TRACE(("BALA
278b0 4e 43 45 3a 20 65 6d 70 74 79 20 74 61 62 6c 65  NCE: empty table
278c0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70   %d\n", pPage->p
278d0 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  gno));.  }else{.
278e0 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20      /* The root 
278f0 70 61 67 65 20 69 73 20 65 6d 70 74 79 20 62 75  page is empty bu
27900 74 20 68 61 73 20 6f 6e 65 20 63 68 69 6c 64 2e  t has one child.
27910 20 20 54 72 61 6e 73 66 65 72 20 74 68 65 0a 20    Transfer the. 
27920 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f     ** informatio
27930 6e 20 66 72 6f 6d 20 74 68 61 74 20 6f 6e 65 20  n from that one 
27940 63 68 69 6c 64 20 69 6e 74 6f 20 74 68 65 20 72  child into the r
27950 6f 6f 74 20 70 61 67 65 20 69 66 20 69 74 20 0a  oot page if it .
27960 20 20 20 20 2a 2a 20 77 69 6c 6c 20 66 69 74 2e      ** will fit.
27970 20 20 54 68 69 73 20 72 65 64 75 63 65 73 20 74    This reduces t
27980 68 65 20 64 65 70 74 68 20 6f 66 20 74 68 65 20  he depth of the 
27990 74 72 65 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20  tree by one..   
279a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
279b0 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 70  e root page is p
279c0 61 67 65 20 31 2c 20 69 74 20 68 61 73 20 6c 65  age 1, it has le
279d0 73 73 20 73 70 61 63 65 20 61 76 61 69 6c 61 62  ss space availab
279e0 6c 65 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 69  le than.    ** i
279f0 74 73 20 63 68 69 6c 64 20 28 64 75 65 20 74 6f  ts child (due to
27a00 20 74 68 65 20 31 30 30 20 62 79 74 65 20 68 65   the 100 byte he
27a10 61 64 65 72 20 74 68 61 74 20 6f 63 63 75 72 73  ader that occurs
27a20 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
27a30 67 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  g.    ** of the 
27a40 64 61 74 61 62 61 73 65 20 66 6c 65 29 2c 20 73  database fle), s
27a50 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 62  o it might not b
27a60 65 20 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 61  e able to hold a
27a70 6c 6c 20 6f 66 20 74 68 65 20 0a 20 20 20 20 2a  ll of the .    *
27a80 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 75  * information cu
27a90 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 65  rrently containe
27aa0 64 20 69 6e 20 74 68 65 20 63 68 69 6c 64 2e 20  d in the child. 
27ab0 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
27ac0 0a 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68  .    ** case, th
27ad0 65 6e 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 65  en do not do the
27ae0 20 74 72 61 6e 73 66 65 72 2e 20 20 4c 65 61 76   transfer.  Leav
27af0 65 20 70 61 67 65 20 31 20 65 6d 70 74 79 20 65  e page 1 empty e
27b00 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72  xcept.    ** for
27b10 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e 74   the right-point
27b20 65 72 20 74 6f 20 74 68 65 20 63 68 69 6c 64 20  er to the child 
27b30 70 61 67 65 2e 20 20 54 68 65 20 63 68 69 6c 64  page.  The child
27b40 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a 20 20   page becomes.  
27b50 20 20 2a 2a 20 74 68 65 20 76 69 72 74 75 61 6c    ** the virtual
27b60 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 72 65   root of the tre
27b70 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 67  e..    */.    pg
27b80 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74 34 62 79  noChild = get4by
27b90 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
27ba0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
27bb0 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  t+8]);.    asser
27bc0 74 28 20 70 67 6e 6f 43 68 69 6c 64 3e 30 20 29  t( pgnoChild>0 )
27bd0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67  ;.    assert( pg
27be0 6e 6f 43 68 69 6c 64 3c 3d 73 71 6c 69 74 65 33  noChild<=sqlite3
27bf0 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28  pager_pagecount(
27c00 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67  pPage->pBt->pPag
27c10 65 72 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  er) );.    rc = 
27c20 67 65 74 50 61 67 65 28 70 50 61 67 65 2d 3e 70  getPage(pPage->p
27c30 42 74 2c 20 70 67 6e 6f 43 68 69 6c 64 2c 20 26  Bt, pgnoChild, &
27c40 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 69 66 28  pChild);.    if(
27c50 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73   rc ) goto end_s
27c60 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a  hallow_balance;.
27c70 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70      if( pPage->p
27c80 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno==1 ){.      
27c90 72 63 20 3d 20 69 6e 69 74 50 61 67 65 28 70 43  rc = initPage(pC
27ca0 68 69 6c 64 2c 20 70 50 61 67 65 29 3b 0a 20 20  hild, pPage);.  
27cb0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
27cc0 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61  o end_shallow_ba
27cd0 6c 61 6e 63 65 3b 0a 20 20 20 20 20 20 61 73 73  lance;.      ass
27ce0 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e 4f 76  ert( pChild->nOv
27cf0 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 20  erflow==0 );.   
27d00 20 20 20 69 66 28 20 70 43 68 69 6c 64 2d 3e 6e     if( pChild->n
27d10 46 72 65 65 3e 3d 31 30 30 20 29 7b 0a 20 20 20  Free>=100 ){.   
27d20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68 69 6c       /* The chil
27d30 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69  d information wi
27d40 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 72 6f  ll fit on the ro
27d50 6f 74 20 70 61 67 65 2c 20 73 6f 20 64 6f 20 74  ot page, so do t
27d60 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  he.        ** co
27d70 70 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  py */.        in
27d80 74 20 69 3b 0a 20 20 20 20 20 20 20 20 7a 65 72  t i;.        zer
27d90 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70 43 68  oPage(pPage, pCh
27da0 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a  ild->aData[0]);.
27db0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
27dc0 20 69 3c 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c   i<pChild->nCell
27dd0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
27de0 20 20 61 70 43 65 6c 6c 5b 69 5d 20 3d 20 66 69    apCell[i] = fi
27df0 6e 64 43 65 6c 6c 28 70 43 68 69 6c 64 2c 69 29  ndCell(pChild,i)
27e00 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 43 65  ;.          szCe
27e10 6c 6c 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65  ll[i] = cellSize
27e20 50 74 72 28 70 43 68 69 6c 64 2c 20 61 70 43 65  Ptr(pChild, apCe
27e30 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  ll[i]);.        
27e40 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 6d 62  }.        assemb
27e50 6c 65 50 61 67 65 28 70 50 61 67 65 2c 20 70 43  lePage(pPage, pC
27e60 68 69 6c 64 2d 3e 6e 43 65 6c 6c 2c 20 61 70 43  hild->nCell, apC
27e70 65 6c 6c 2c 20 73 7a 43 65 6c 6c 29 3b 0a 20 20  ell, szCell);.  
27e80 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68        /* Copy th
27e90 65 20 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 20  e right-pointer 
27ea0 6f 66 20 74 68 65 20 63 68 69 6c 64 20 74 6f 20  of the child to 
27eb0 74 68 65 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20  the parent. */. 
27ec0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
27ed0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
27ee0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
27ef0 5d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ], .            
27f00 67 65 74 34 62 79 74 65 28 26 70 43 68 69 6c 64  get4byte(&pChild
27f10 2d 3e 61 44 61 74 61 5b 70 43 68 69 6c 64 2d 3e  ->aData[pChild->
27f20 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a  hdrOffset+8]));.
27f30 20 20 20 20 20 20 20 20 66 72 65 65 50 61 67 65          freePage
27f40 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20  (pChild);.      
27f50 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
27f60 45 3a 20 63 68 69 6c 64 20 25 64 20 74 72 61 6e  E: child %d tran
27f70 73 66 65 72 20 74 6f 20 70 61 67 65 20 31 5c 6e  sfer to page 1\n
27f80 22 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29  ", pChild->pgno)
27f90 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
27fa0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
27fb0 68 69 6c 64 20 68 61 73 20 6d 6f 72 65 20 69 6e  hild has more in
27fc0 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 77  formation that w
27fd0 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 72  ill fit on the r
27fe0 6f 6f 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  oot..        ** 
27ff0 54 68 65 20 74 72 65 65 20 69 73 20 61 6c 72 65  The tree is alre
28000 61 64 79 20 62 61 6c 61 6e 63 65 64 2e 20 20 44  ady balanced.  D
28010 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a 20 20  o nothing. */.  
28020 20 20 20 20 20 20 54 52 41 43 45 28 28 22 42 41        TRACE(("BA
28030 4c 41 4e 43 45 3a 20 63 68 69 6c 64 20 25 64 20  LANCE: child %d 
28040 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20  will not fit on 
28050 70 61 67 65 20 31 5c 6e 22 2c 20 70 43 68 69 6c  page 1\n", pChil
28060 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  d->pgno));.     
28070 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
28080 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65      memcpy(pPage
28090 2d 3e 61 44 61 74 61 2c 20 70 43 68 69 6c 64 2d  ->aData, pChild-
280a0 3e 61 44 61 74 61 2c 20 70 50 61 67 65 2d 3e 70  >aData, pPage->p
280b0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b  Bt->usableSize);
280c0 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 73  .      pPage->is
280d0 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Init = 0;.      
280e0 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d  pPage->pParent =
280f0 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 69   0;.      rc = i
28100 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c 20 30  nitPage(pPage, 0
28110 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
28120 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
28130 3b 0a 20 20 20 20 20 20 66 72 65 65 50 61 67 65  ;.      freePage
28140 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20  (pChild);.      
28150 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
28160 20 74 72 61 6e 73 66 65 72 20 63 68 69 6c 64 20   transfer child 
28170 25 64 20 69 6e 74 6f 20 72 6f 6f 74 20 25 64 5c  %d into root %d\
28180 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
28190 20 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c 20    pChild->pgno, 
281a0 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20  pPage->pgno));. 
281b0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 72 65     }.    rc = re
281c0 70 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73  parentChildPages
281d0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 61 73 73  (pPage);.    ass
281e0 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
281f0 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 23 69 66 6e  rflow==0 );.#ifn
28200 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
28210 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
28220 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
28230 75 6d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  um ){.      int 
28240 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  i;.      for(i=0
28250 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ; i<pPage->nCell
28260 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 20  ; i++){ .       
28270 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f   rc = ptrmapPutO
28280 76 66 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20  vfl(pPage, i);. 
28290 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
282a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
282b0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73        goto end_s
282c0 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a  hallow_balance;.
282d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
282e0 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
282f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
28300 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f  E_OK ) goto end_
28310 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b  shallow_balance;
28320 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
28330 28 70 43 68 69 6c 64 29 3b 0a 20 20 7d 0a 65 6e  (pChild);.  }.en
28340 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63  d_shallow_balanc
28350 65 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  e:.  sqliteFree(
28360 61 70 43 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72  apCell);.  retur
28370 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
28380 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73  The root page is
28390 20 6f 76 65 72 66 75 6c 6c 0a 2a 2a 0a 2a 2a 20   overfull.**.** 
283a0 57 68 65 6e 20 74 68 69 73 20 68 61 70 70 65 6e  When this happen
283b0 73 2c 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  s, Create a new 
283c0 63 68 69 6c 64 20 70 61 67 65 20 61 6e 64 20 63  child page and c
283d0 6f 70 79 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  opy the.** conte
283e0 6e 74 73 20 6f 66 20 74 68 65 20 72 6f 6f 74 20  nts of the root 
283f0 69 6e 74 6f 20 74 68 65 20 63 68 69 6c 64 2e 20  into the child. 
28400 20 54 68 65 6e 20 6d 61 6b 65 20 74 68 65 20 72   Then make the r
28410 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 61 6e 20 65  oot.** page an e
28420 6d 70 74 79 20 70 61 67 65 20 77 69 74 68 20 72  mpty page with r
28430 69 67 68 74 43 68 69 6c 64 20 70 6f 69 6e 74 69  ightChild pointi
28440 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a  ng to the new.**
28450 20 63 68 69 6c 64 2e 20 20 20 46 69 6e 61 6c 6c   child.   Finall
28460 79 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65 5f  y, call balance_
28470 69 6e 74 65 72 6e 61 6c 28 29 20 6f 6e 20 74 68  internal() on th
28480 65 20 6e 65 77 20 63 68 69 6c 64 0a 2a 2a 20 74  e new child.** t
28490 6f 20 63 61 75 73 65 20 69 74 20 74 6f 20 73 70  o cause it to sp
284a0 6c 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lit..*/.static i
284b0 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65  nt balance_deepe
284c0 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
284d0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
284e0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
284f0 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 73 75  rn value from su
28500 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20  bprocedures */. 
28510 20 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64   MemPage *pChild
28520 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ;    /* Pointer 
28530 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70  to a new child p
28540 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  age */.  Pgno pg
28550 6e 6f 43 68 69 6c 64 3b 20 20 20 20 20 2f 2a 20  noChild;     /* 
28560 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  Page number of t
28570 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67  he new child pag
28580 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  e */.  BtShared 
28590 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  *pBt;         /*
285a0 20 54 68 65 20 42 54 72 65 65 20 2a 2f 0a 20 20   The BTree */.  
285b0 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
285c0 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 75 73 61      /* Total usa
285d0 62 6c 65 20 73 69 7a 65 20 6f 66 20 61 20 70 61  ble size of a pa
285e0 67 65 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  ge */.  u8 *data
285f0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
28600 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
28610 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 75  rent page */.  u
28620 38 20 2a 63 64 61 74 61 3b 20 20 20 20 20 20 20  8 *cdata;       
28630 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66     /* Content of
28640 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
28650 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
28660 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
28670 65 74 20 74 6f 20 70 61 67 65 20 68 65 61 64 65  et to page heade
28680 72 20 69 6e 20 70 61 72 65 6e 74 20 2a 2f 0a 20  r in parent */. 
28690 20 69 6e 74 20 62 72 6b 3b 20 20 20 20 20 20 20   int brk;       
286a0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
286b0 6f 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66 69 72  o content of fir
286c0 73 74 20 63 65 6c 6c 20 69 6e 20 70 61 72 65 6e  st cell in paren
286d0 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
286e0 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d  pPage->pParent==
286f0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
28700 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e  Page->nOverflow>
28710 30 20 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61  0 );.  pBt = pPa
28720 67 65 2d 3e 70 42 74 3b 0a 20 20 72 63 20 3d 20  ge->pBt;.  rc = 
28730 61 6c 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74  allocatePage(pBt
28740 2c 20 26 70 43 68 69 6c 64 2c 20 26 70 67 6e 6f  , &pChild, &pgno
28750 43 68 69 6c 64 2c 20 70 50 61 67 65 2d 3e 70 67  Child, pPage->pg
28760 6e 6f 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  no, 0);.  if( rc
28770 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
28780 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 70  assert( sqlite3p
28790 61 67 65 72 5f 69 73 77 72 69 74 65 61 62 6c 65  ager_iswriteable
287a0 28 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 29 20  (pChild->aData) 
287b0 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20  );.  usableSize 
287c0 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
287d0 65 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67  e;.  data = pPag
287e0 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20  e->aData;.  hdr 
287f0 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
28800 65 74 3b 0a 20 20 62 72 6b 20 3d 20 67 65 74 32  et;.  brk = get2
28810 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
28820 5d 29 3b 0a 20 20 63 64 61 74 61 20 3d 20 70 43  ]);.  cdata = pC
28830 68 69 6c 64 2d 3e 61 44 61 74 61 3b 0a 20 20 6d  hild->aData;.  m
28840 65 6d 63 70 79 28 63 64 61 74 61 2c 20 26 64 61  emcpy(cdata, &da
28850 74 61 5b 68 64 72 5d 2c 20 70 50 61 67 65 2d 3e  ta[hdr], pPage->
28860 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50 61  cellOffset+2*pPa
28870 67 65 2d 3e 6e 43 65 6c 6c 2d 68 64 72 29 3b 0a  ge->nCell-hdr);.
28880 20 20 6d 65 6d 63 70 79 28 26 63 64 61 74 61 5b    memcpy(&cdata[
28890 62 72 6b 5d 2c 20 26 64 61 74 61 5b 62 72 6b 5d  brk], &data[brk]
288a0 2c 20 75 73 61 62 6c 65 53 69 7a 65 2d 62 72 6b  , usableSize-brk
288b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 68  );.  assert( pCh
288c0 69 6c 64 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29  ild->isInit==0 )
288d0 3b 0a 20 20 72 63 20 3d 20 69 6e 69 74 50 61 67  ;.  rc = initPag
288e0 65 28 70 43 68 69 6c 64 2c 20 70 50 61 67 65 29  e(pChild, pPage)
288f0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
28900 6f 20 62 61 6c 61 6e 63 65 64 65 65 70 65 72 5f  o balancedeeper_
28910 6f 75 74 3b 0a 20 20 6d 65 6d 63 70 79 28 70 43  out;.  memcpy(pC
28920 68 69 6c 64 2d 3e 61 4f 76 66 6c 2c 20 70 50 61  hild->aOvfl, pPa
28930 67 65 2d 3e 61 4f 76 66 6c 2c 20 70 50 61 67 65  ge->aOvfl, pPage
28940 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2a 73 69 7a 65  ->nOverflow*size
28950 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b  of(pPage->aOvfl[
28960 30 5d 29 29 3b 0a 20 20 70 43 68 69 6c 64 2d 3e  0]));.  pChild->
28970 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70 50 61 67  nOverflow = pPag
28980 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20  e->nOverflow;.  
28990 69 66 28 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65  if( pChild->nOve
289a0 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 70 43 68  rflow ){.    pCh
289b0 69 6c 64 2d 3e 6e 46 72 65 65 20 3d 20 30 3b 0a  ild->nFree = 0;.
289c0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
289d0 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 50 61  hild->nCell==pPa
289e0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 7a  ge->nCell );.  z
289f0 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70  eroPage(pPage, p
28a00 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 20  Child->aData[0] 
28a10 26 20 7e 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20  & ~PTF_LEAF);.  
28a20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
28a30 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
28a40 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f  rOffset+8], pgno
28a50 43 68 69 6c 64 29 3b 0a 20 20 54 52 41 43 45 28  Child);.  TRACE(
28a60 28 22 42 41 4c 41 4e 43 45 3a 20 63 6f 70 79 20  ("BALANCE: copy 
28a70 72 6f 6f 74 20 25 64 20 69 6e 74 6f 20 25 64 5c  root %d into %d\
28a80 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  n", pPage->pgno,
28a90 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b   pChild->pgno));
28aa0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
28ab0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
28ac0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
28ad0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 69 6e 74  acuum ){.    int
28ae0 20 69 3b 0a 20 20 20 20 72 63 20 3d 20 70 74 72   i;.    rc = ptr
28af0 6d 61 70 50 75 74 28 70 42 74 2c 20 70 43 68 69  mapPut(pBt, pChi
28b00 6c 64 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50  ld->pgno, PTRMAP
28b10 5f 42 54 52 45 45 2c 20 70 50 61 67 65 2d 3e 70  _BTREE, pPage->p
28b20 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63  gno);.    if( rc
28b30 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 64   ) goto balanced
28b40 65 65 70 65 72 5f 6f 75 74 3b 0a 20 20 20 20 66  eeper_out;.    f
28b50 6f 72 28 69 3d 30 3b 20 69 3c 70 43 68 69 6c 64  or(i=0; i<pChild
28b60 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  ->nCell; i++){. 
28b70 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
28b80 50 75 74 4f 76 66 6c 28 70 43 68 69 6c 64 2c 20  PutOvfl(pChild, 
28b90 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  i);.      if( rc
28ba0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
28bb0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
28bc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
28bd0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 63 20    }.#endif.  rc 
28be0 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f  = balance_nonroo
28bf0 74 28 70 43 68 69 6c 64 29 3b 0a 0a 62 61 6c 61  t(pChild);..bala
28c00 6e 63 65 64 65 65 70 65 72 5f 6f 75 74 3a 0a 20  ncedeeper_out:. 
28c10 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 68   releasePage(pCh
28c20 69 6c 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ild);.  return r
28c30 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 69  c;.}../*.** Deci
28c40 64 65 20 69 66 20 74 68 65 20 70 61 67 65 20 70  de if the page p
28c50 50 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65  Page needs to be
28c60 20 62 61 6c 61 6e 63 65 64 2e 20 20 49 66 20 62   balanced.  If b
28c70 61 6c 61 6e 63 69 6e 67 20 69 73 0a 2a 2a 20 72  alancing is.** r
28c80 65 71 75 69 72 65 64 2c 20 63 61 6c 6c 20 74 68  equired, call th
28c90 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 62 61  e appropriate ba
28ca0 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65 2e  lancing routine.
28cb0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
28cc0 61 6c 61 6e 63 65 28 4d 65 6d 50 61 67 65 20 2a  alance(MemPage *
28cd0 70 50 61 67 65 2c 20 69 6e 74 20 69 6e 73 65 72  pPage, int inser
28ce0 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
28cf0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
28d00 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d  pPage->pParent==
28d10 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  0 ){.    if( pPa
28d20 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20  ge->nOverflow>0 
28d30 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61  ){.      rc = ba
28d40 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 70 50 61  lance_deeper(pPa
28d50 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ge);.    }.    i
28d60 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
28d70 20 26 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   && pPage->nCell
28d80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
28d90 3d 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f  = balance_shallo
28da0 77 65 72 28 70 50 61 67 65 29 3b 0a 20 20 20 20  wer(pPage);.    
28db0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  }.  }else{.    i
28dc0 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  f( pPage->nOverf
28dd0 6c 6f 77 3e 30 20 7c 7c 20 0a 20 20 20 20 20 20  low>0 || .      
28de0 20 20 28 21 69 6e 73 65 72 74 20 26 26 20 70 50    (!insert && pP
28df0 61 67 65 2d 3e 6e 46 72 65 65 3e 70 50 61 67 65  age->nFree>pPage
28e00 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
28e10 65 2a 32 2f 33 29 20 29 7b 0a 20 20 20 20 20 20  e*2/3) ){.      
28e20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e  rc = balance_non
28e30 72 6f 6f 74 28 70 50 61 67 65 29 3b 0a 20 20 20  root(pPage);.   
28e40 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
28e50 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
28e60 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
28e70 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 74 68 61   all cursors tha
28e80 74 20 70 6f 69 6e 74 20 74 6f 20 74 61 62 6c 65  t point to table
28e90 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 20 49 66   pgnoRoot..** If
28ea0 20 61 6e 79 20 6f 66 20 74 68 6f 73 65 20 63 75   any of those cu
28eb0 72 73 6f 72 73 20 77 65 72 65 20 6f 70 65 6e 65  rsors were opene
28ec0 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30  d with wrFlag==0
28ed0 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 0a   in a different.
28ee0 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ** database conn
28ef0 65 63 74 69 6f 6e 20 28 61 20 64 61 74 61 62 61  ection (a databa
28f00 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68  se connection th
28f10 61 74 20 73 68 61 72 65 73 20 74 68 65 20 70 61  at shares the pa
28f20 67 65 72 0a 2a 2a 20 63 61 63 68 65 20 77 69 74  ger.** cache wit
28f30 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  h the current co
28f40 6e 6e 65 63 74 69 6f 6e 29 20 61 6e 64 20 74 68  nnection) and th
28f50 61 74 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  at other connect
28f60 69 6f 6e 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 69  ion .** is not i
28f70 6e 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d  n the ReadUncomm
28f80 6d 69 74 74 65 64 20 73 74 61 74 65 2c 20 74 68  mitted state, th
28f90 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
28fa0 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49  returns .** SQLI
28fb0 54 45 5f 4c 4f 43 4b 45 44 2e 0a 2a 2a 0a 2a 2a  TE_LOCKED..**.**
28fc0 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20   In addition to 
28fd0 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 72 65 61  checking for rea
28fe0 64 2d 6c 6f 63 6b 73 20 28 77 68 65 72 65 20 61  d-locks (where a
28ff0 20 72 65 61 64 2d 6c 6f 63 6b 20 0a 2a 2a 20 6d   read-lock .** m
29000 65 61 6e 73 20 61 20 63 75 72 73 6f 72 20 6f 70  eans a cursor op
29010 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67  ened with wrFlag
29020 3d 3d 30 29 20 74 68 69 73 20 72 6f 75 74 69 6e  ==0) this routin
29030 65 20 61 6c 73 6f 20 6d 6f 76 65 73 0a 2a 2a 20  e also moves.** 
29040 61 6c 6c 20 63 75 72 73 6f 72 73 20 77 72 69 74  all cursors writ
29050 65 20 63 75 72 73 6f 72 73 20 73 6f 20 74 68 61  e cursors so tha
29060 74 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74  t they are point
29070 69 6e 67 20 74 6f 20 74 68 65 20 0a 2a 2a 20 66  ing to the .** f
29080 69 72 73 74 20 43 65 6c 6c 20 6f 6e 20 74 68 65  irst Cell on the
29090 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 69   root page.  Thi
290a0 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62  s is necessary b
290b0 65 63 61 75 73 65 20 61 6e 20 69 6e 73 65 72 74  ecause an insert
290c0 20 0a 2a 2a 20 6f 72 20 64 65 6c 65 74 65 20 6d   .** or delete m
290d0 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 65 20  ight change the 
290e0 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  number of cells 
290f0 6f 6e 20 61 20 70 61 67 65 20 6f 72 20 64 65 6c  on a page or del
29100 65 74 65 0a 2a 2a 20 61 20 70 61 67 65 20 65 6e  ete.** a page en
29110 74 69 72 65 6c 79 20 61 6e 64 20 77 65 20 64 6f  tirely and we do
29120 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 6c 65 61   not want to lea
29130 76 65 20 61 6e 79 20 63 75 72 73 6f 72 73 20 0a  ve any cursors .
29140 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 6e  ** pointing to n
29150 6f 6e 2d 65 78 69 73 74 61 6e 74 20 70 61 67 65  on-existant page
29160 73 20 6f 72 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73  s or cells..*/.s
29170 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 52  tatic int checkR
29180 65 61 64 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a  eadLocks(Btree *
29190 70 42 74 72 65 65 2c 20 50 67 6e 6f 20 70 67 6e  pBtree, Pgno pgn
291a0 6f 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20  oRoot, BtCursor 
291b0 2a 70 45 78 63 6c 75 64 65 29 7b 0a 20 20 42 74  *pExclude){.  Bt
291c0 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74 53  Cursor *p;.  BtS
291d0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 42 74  hared *pBt = pBt
291e0 72 65 65 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69  ree->pBt;.  sqli
291f0 74 65 33 20 2a 64 62 20 3d 20 70 42 74 72 65 65  te3 *db = pBtree
29200 2d 3e 70 53 71 6c 69 74 65 3b 0a 20 20 66 6f 72  ->pSqlite;.  for
29210 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  (p=pBt->pCursor;
29220 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
29230 0a 20 20 20 20 69 66 28 20 70 3d 3d 70 45 78 63  .    if( p==pExc
29240 6c 75 64 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lude ) continue;
29250 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61  .    if( p->eSta
29260 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
29270 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
29280 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74   if( p->pgnoRoot
29290 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 20 63 6f 6e  !=pgnoRoot ) con
292a0 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
292b0 2d 3e 77 72 46 6c 61 67 3d 3d 30 20 29 7b 0a 20  ->wrFlag==0 ){. 
292c0 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
292d0 4f 74 68 65 72 20 3d 20 70 2d 3e 70 42 74 72 65  Other = p->pBtre
292e0 65 2d 3e 70 53 71 6c 69 74 65 3b 0a 20 20 20 20  e->pSqlite;.    
292f0 20 20 69 66 28 20 64 62 4f 74 68 65 72 3d 3d 30    if( dbOther==0
29300 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 28 64 62   ||.         (db
29310 4f 74 68 65 72 21 3d 64 62 20 26 26 20 28 64 62  Other!=db && (db
29320 4f 74 68 65 72 2d 3e 66 6c 61 67 73 20 26 20 53  Other->flags & S
29330 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
29340 69 74 74 65 64 29 3d 3d 30 29 20 29 7b 0a 20 20  itted)==0) ){.  
29350 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
29360 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20  ITE_LOCKED;.    
29370 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
29380 28 20 70 2d 3e 70 50 61 67 65 2d 3e 70 67 6e 6f  ( p->pPage->pgno
29390 21 3d 70 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 7b  !=p->pgnoRoot ){
293a0 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f  .      moveToRoo
293b0 74 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  t(p);.    }.  }.
293c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
293d0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73  OK;.}../*.** Ins
293e0 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64  ert a new record
293f0 20 69 6e 74 6f 20 74 68 65 20 42 54 72 65 65 2e   into the BTree.
29400 20 20 54 68 65 20 6b 65 79 20 69 73 20 67 69 76    The key is giv
29410 65 6e 20 62 79 20 28 70 4b 65 79 2c 6e 4b 65 79  en by (pKey,nKey
29420 29 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74  ).** and the dat
29430 61 20 69 73 20 67 69 76 65 6e 20 62 79 20 28 70  a is given by (p
29440 44 61 74 61 2c 6e 44 61 74 61 29 2e 20 20 54 68  Data,nData).  Th
29450 65 20 63 75 72 73 6f 72 20 69 73 20 75 73 65 64  e cursor is used
29460 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65 66 69   only to.** defi
29470 6e 65 20 77 68 61 74 20 74 61 62 6c 65 20 74 68  ne what table th
29480 65 20 72 65 63 6f 72 64 20 73 68 6f 75 6c 64 20  e record should 
29490 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  be inserted into
294a0 2e 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a  .  The cursor.**
294b0 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
294c0 67 20 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f  g at a random lo
294d0 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f  cation..**.** Fo
294e0 72 20 61 6e 20 49 4e 54 4b 45 59 20 74 61 62 6c  r an INTKEY tabl
294f0 65 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79  e, only the nKey
29500 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6b 65   value of the ke
29510 79 20 69 73 20 75 73 65 64 2e 20 20 70 4b 65 79  y is used.  pKey
29520 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20   is.** ignored. 
29530 20 46 6f 72 20 61 20 5a 45 52 4f 44 41 54 41 20   For a ZERODATA 
29540 74 61 62 6c 65 2c 20 74 68 65 20 70 44 61 74 61  table, the pData
29550 20 61 6e 64 20 6e 44 61 74 61 20 61 72 65 20 62   and nData are b
29560 6f 74 68 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a  oth ignored..*/.
29570 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
29580 49 6e 73 65 72 74 28 0a 20 20 42 74 43 75 72 73  Insert(.  BtCurs
29590 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20  or *pCur,       
295a0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65           /* Inse
295b0 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68 65  rt data into the
295c0 20 74 61 62 6c 65 20 6f 66 20 74 68 69 73 20 63   table of this c
295d0 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  ursor */.  const
295e0 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34   void *pKey, i64
295f0 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65   nKey,    /* The
29600 20 6b 65 79 20 6f 66 20 74 68 65 20 6e 65 77 20   key of the new 
29610 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73  record */.  cons
29620 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69  t void *pData, i
29630 6e 74 20 6e 44 61 74 61 20 20 20 2f 2a 20 54 68  nt nData   /* Th
29640 65 20 64 61 74 61 20 6f 66 20 74 68 65 20 6e 65  e data of the ne
29650 77 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20  w record */.){. 
29660 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c   int rc;.  int l
29670 6f 63 3b 0a 20 20 69 6e 74 20 73 7a 4e 65 77 3b  oc;.  int szNew;
29680 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
29690 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e;.  BtShared *p
296a0 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65  Bt = pCur->pBtre
296b0 65 2d 3e 70 42 74 3b 0a 20 20 75 6e 73 69 67 6e  e->pBt;.  unsign
296c0 65 64 20 63 68 61 72 20 2a 6f 6c 64 43 65 6c 6c  ed char *oldCell
296d0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
296e0 72 20 2a 6e 65 77 43 65 6c 6c 20 3d 20 30 3b 0a  r *newCell = 0;.
296f0 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72  .  if( pBt->inTr
29700 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53  ansaction!=TRANS
29710 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a  _WRITE ){.    /*
29720 20 4d 75 73 74 20 73 74 61 72 74 20 61 20 74 72   Must start a tr
29730 61 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65  ansaction before
29740 20 64 6f 69 6e 67 20 61 6e 20 69 6e 73 65 72 74   doing an insert
29750 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 70   */.    return p
29760 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53  Bt->readOnly ? S
29770 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a  QLITE_READONLY :
29780 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
29790 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 42   }.  assert( !pB
297a0 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20  t->readOnly );. 
297b0 20 69 66 28 20 21 70 43 75 72 2d 3e 77 72 46 6c   if( !pCur->wrFl
297c0 61 67 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ag ){.    return
297d0 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 20 20 20   SQLITE_PERM;   
297e0 2f 2a 20 43 75 72 73 6f 72 20 6e 6f 74 20 6f 70  /* Cursor not op
297f0 65 6e 20 66 6f 72 20 77 72 69 74 69 6e 67 20 2a  en for writing *
29800 2f 0a 20 20 7d 0a 20 20 69 66 28 20 63 68 65 63  /.  }.  if( chec
29810 6b 52 65 61 64 4c 6f 63 6b 73 28 70 43 75 72 2d  kReadLocks(pCur-
29820 3e 70 42 74 72 65 65 2c 20 70 43 75 72 2d 3e 70  >pBtree, pCur->p
29830 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 20 29  gnoRoot, pCur) )
29840 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
29850 49 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54  ITE_LOCKED; /* T
29860 68 65 20 74 61 62 6c 65 20 70 43 75 72 20 70 6f  he table pCur po
29870 69 6e 74 73 20 74 6f 20 68 61 73 20 61 20 72 65  ints to has a re
29880 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 0a  ad lock */.  }..
29890 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20 70 6f    /* Save the po
298a0 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f  sitions of any o
298b0 74 68 65 72 20 63 75 72 73 6f 72 73 20 6f 70 65  ther cursors ope
298c0 6e 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 20  n on this table 
298d0 2a 2f 0a 20 20 72 65 73 74 6f 72 65 4f 72 43 6c  */.  restoreOrCl
298e0 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  earCursorPositio
298f0 6e 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 69 66  n(pCur, 0);.  if
29900 28 20 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b  ( .    SQLITE_OK
29910 21 3d 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43  !=(rc = saveAllC
29920 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72  ursors(pBt, pCur
29930 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72  ->pgnoRoot, pCur
29940 29 29 20 7c 7c 0a 20 20 20 20 53 51 4c 49 54 45  )) ||.    SQLITE
29950 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
29960 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 43  e3BtreeMoveto(pC
29970 75 72 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20  ur, pKey, nKey, 
29980 26 6c 6f 63 29 29 0a 20 20 29 7b 0a 20 20 20 20  &loc)).  ){.    
29990 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
299a0 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
299b0 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  pPage;.  assert(
299c0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 7c   pPage->intKey |
299d0 7c 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61  | nKey>=0 );.  a
299e0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
299f0 61 66 20 7c 7c 20 21 70 50 61 67 65 2d 3e 6c 65  af || !pPage->le
29a00 61 66 44 61 74 61 20 29 3b 0a 20 20 54 52 41 43  afData );.  TRAC
29a10 45 28 28 22 49 4e 53 45 52 54 3a 20 74 61 62 6c  E(("INSERT: tabl
29a20 65 3d 25 64 20 6e 6b 65 79 3d 25 6c 6c 64 20 6e  e=%d nkey=%lld n
29a30 64 61 74 61 3d 25 64 20 70 61 67 65 3d 25 64 20  data=%d page=%d 
29a40 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
29a50 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
29a60 20 6e 4b 65 79 2c 20 6e 44 61 74 61 2c 20 70 50   nKey, nData, pP
29a70 61 67 65 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20  age->pgno,.     
29a80 20 20 20 20 20 6c 6f 63 3d 3d 30 20 3f 20 22 6f       loc==0 ? "o
29a90 76 65 72 77 72 69 74 65 22 20 3a 20 22 6e 65 77  verwrite" : "new
29aa0 20 65 6e 74 72 79 22 29 29 3b 0a 20 20 61 73 73   entry"));.  ass
29ab0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
29ac0 69 74 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  it );.  rc = sql
29ad0 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28  ite3pager_write(
29ae0 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20  pPage->aData);. 
29af0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
29b00 20 72 63 3b 0a 20 20 6e 65 77 43 65 6c 6c 20 3d   rc;.  newCell =
29b10 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
29b20 28 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  ( MX_CELL_SIZE(p
29b30 42 74 29 20 29 3b 0a 20 20 69 66 28 20 6e 65 77  Bt) );.  if( new
29b40 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  Cell==0 ) return
29b50 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
29b60 20 72 63 20 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c   rc = fillInCell
29b70 28 70 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c 2c  (pPage, newCell,
29b80 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 44 61   pKey, nKey, pDa
29b90 74 61 2c 20 6e 44 61 74 61 2c 20 26 73 7a 4e 65  ta, nData, &szNe
29ba0 77 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  w);.  if( rc ) g
29bb0 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a  oto end_insert;.
29bc0 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77 3d    assert( szNew=
29bd0 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61  =cellSizePtr(pPa
29be0 67 65 2c 20 6e 65 77 43 65 6c 6c 29 20 29 3b 0a  ge, newCell) );.
29bf0 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77 3c    assert( szNew<
29c00 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42  =MX_CELL_SIZE(pB
29c10 74 29 20 29 3b 0a 20 20 69 66 28 20 6c 6f 63 3d  t) );.  if( loc=
29c20 3d 30 20 26 26 20 43 55 52 53 4f 52 5f 56 41 4c  =0 && CURSOR_VAL
29c30 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
29c40 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 4f 6c   ){.    int szOl
29c50 64 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  d;.    assert( p
29c60 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70  Cur->idx>=0 && p
29c70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e  Cur->idx<pPage->
29c80 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 6f 6c 64  nCell );.    old
29c90 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
29ca0 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78  pPage, pCur->idx
29cb0 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  );.    if( !pPag
29cc0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
29cd0 20 6d 65 6d 63 70 79 28 6e 65 77 43 65 6c 6c 2c   memcpy(newCell,
29ce0 20 6f 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a 20 20   oldCell, 4);.  
29cf0 20 20 7d 0a 20 20 20 20 73 7a 4f 6c 64 20 3d 20    }.    szOld = 
29d00 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
29d10 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20  e, oldCell);.   
29d20 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28   rc = clearCell(
29d30 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b  pPage, oldCell);
29d40 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
29d50 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20  to end_insert;. 
29d60 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67     dropCell(pPag
29d70 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 73 7a  e, pCur->idx, sz
29d80 4f 6c 64 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Old);.  }else if
29d90 28 20 6c 6f 63 3c 30 20 26 26 20 70 50 61 67 65  ( loc<0 && pPage
29da0 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20  ->nCell>0 ){.   
29db0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
29dc0 6c 65 61 66 20 29 3b 0a 20 20 20 20 70 43 75 72  leaf );.    pCur
29dd0 2d 3e 69 64 78 2b 2b 3b 0a 20 20 20 20 70 43 75  ->idx++;.    pCu
29de0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
29df0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
29e00 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
29e10 65 61 66 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20  eaf );.  }.  rc 
29e20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61  = insertCell(pPa
29e30 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 6e  ge, pCur->idx, n
29e40 65 77 43 65 6c 6c 2c 20 73 7a 4e 65 77 2c 20 30  ewCell, szNew, 0
29e50 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
29e60 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
29e70 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 72   end_insert;.  r
29e80 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61 67  c = balance(pPag
29e90 65 2c 20 31 29 3b 0a 20 20 2f 2a 20 73 71 6c 69  e, 1);.  /* sqli
29ea0 74 65 33 42 74 72 65 65 50 61 67 65 44 75 6d 70  te3BtreePageDump
29eb0 28 70 43 75 72 2d 3e 70 42 74 2c 20 70 43 75 72  (pCur->pBt, pCur
29ec0 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b 20  ->pgnoRoot, 1); 
29ed0 2a 2f 0a 20 20 2f 2a 20 66 66 6c 75 73 68 28 73  */.  /* fflush(s
29ee0 74 64 6f 75 74 29 3b 20 2a 2f 0a 20 20 69 66 28  tdout); */.  if(
29ef0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
29f00 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74  {.    moveToRoot
29f10 28 70 43 75 72 29 3b 0a 20 20 7d 0a 65 6e 64 5f  (pCur);.  }.end_
29f20 69 6e 73 65 72 74 3a 0a 20 20 73 71 6c 69 74 65  insert:.  sqlite
29f30 46 72 65 65 28 6e 65 77 43 65 6c 6c 29 3b 0a 20  Free(newCell);. 
29f40 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
29f50 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20  *.** Delete the 
29f60 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 63  entry that the c
29f70 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
29f80 67 20 74 6f 2e 20 20 54 68 65 20 63 75 72 73 6f  g to.  The curso
29f90 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f 69  r.** is left poi
29fa0 6e 74 69 6e 67 20 61 74 20 61 20 72 61 6e 64 6f  nting at a rando
29fb0 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 69  m location..*/.i
29fc0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  nt sqlite3BtreeD
29fd0 65 6c 65 74 65 28 42 74 43 75 72 73 6f 72 20 2a  elete(BtCursor *
29fe0 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65  pCur){.  MemPage
29ff0 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
2a000 70 50 61 67 65 3b 0a 20 20 75 6e 73 69 67 6e 65  pPage;.  unsigne
2a010 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20  d char *pCell;. 
2a020 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e 6f 20   int rc;.  Pgno 
2a030 70 67 6e 6f 43 68 69 6c 64 20 3d 20 30 3b 0a 20  pgnoChild = 0;. 
2a040 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
2a050 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70   pCur->pBtree->p
2a060 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  Bt;..  assert( p
2a070 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
2a080 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61    if( pBt->inTra
2a090 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53 5f  nsaction!=TRANS_
2a0a0 57 52 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20  WRITE ){.    /* 
2a0b0 4d 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61  Must start a tra
2a0c0 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65 20  nsaction before 
2a0d0 64 6f 69 6e 67 20 61 20 64 65 6c 65 74 65 20 2a  doing a delete *
2a0e0 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42 74  /.    return pBt
2a0f0 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c  ->readOnly ? SQL
2a100 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53  ITE_READONLY : S
2a110 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
2a120 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d  .  assert( !pBt-
2a130 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 69  >readOnly );.  i
2a140 66 28 20 70 43 75 72 2d 3e 69 64 78 20 3e 3d 20  f( pCur->idx >= 
2a150 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
2a160 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2a170 45 5f 45 52 52 4f 52 3b 20 20 2f 2a 20 54 68 65  E_ERROR;  /* The
2a180 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70   cursor is not p
2a190 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 79 74 68  ointing to anyth
2a1a0 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  ing */.  }.  if(
2a1b0 20 21 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29   !pCur->wrFlag )
2a1c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2a1d0 49 54 45 5f 50 45 52 4d 3b 20 20 20 2f 2a 20 44  ITE_PERM;   /* D
2a1e0 69 64 20 6e 6f 74 20 6f 70 65 6e 20 74 68 69 73  id not open this
2a1f0 20 63 75 72 73 6f 72 20 66 6f 72 20 77 72 69 74   cursor for writ
2a200 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  ing */.  }.  if(
2a210 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28   checkReadLocks(
2a220 70 43 75 72 2d 3e 70 42 74 72 65 65 2c 20 70 43  pCur->pBtree, pC
2a230 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43  ur->pgnoRoot, pC
2a240 75 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ur) ){.    retur
2a250 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b  n SQLITE_LOCKED;
2a260 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 70 43   /* The table pC
2a270 75 72 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73  ur points to has
2a280 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a   a read lock */.
2a290 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 6f 72    }..  /* Restor
2a2a0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  e the current cu
2a2b0 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 28 61  rsor position (a
2a2c0 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 63 75   no-op if the cu
2a2d0 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e 20 0a  rsor is not in .
2a2e0 20 20 2a 2a 20 43 55 52 53 4f 52 5f 52 45 51 55    ** CURSOR_REQU
2a2f0 49 52 45 53 45 45 4b 20 73 74 61 74 65 29 20 61  IRESEEK state) a
2a300 6e 64 20 73 61 76 65 20 74 68 65 20 70 6f 73 69  nd save the posi
2a310 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68  tions of any oth
2a320 65 72 20 63 75 72 73 6f 72 73 20 0a 20 20 2a 2a  er cursors .  **
2a330 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d   open on the sam
2a340 65 20 74 61 62 6c 65 2e 20 54 68 65 6e 20 63 61  e table. Then ca
2a350 6c 6c 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  ll sqlite3pager_
2a360 77 72 69 74 65 28 29 20 6f 6e 20 74 68 65 20 70  write() on the p
2a370 61 67 65 0a 20 20 2a 2a 20 74 68 61 74 20 74 68  age.  ** that th
2a380 65 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 20  e entry will be 
2a390 64 65 6c 65 74 65 64 20 66 72 6f 6d 2e 0a 20 20  deleted from..  
2a3a0 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20 20 28 72  */.  if( .    (r
2a3b0 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65  c = restoreOrCle
2a3c0 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  arCursorPosition
2a3d0 28 70 43 75 72 2c 20 31 29 29 21 3d 30 20 7c 7c  (pCur, 1))!=0 ||
2a3e0 0a 20 20 20 20 28 72 63 20 3d 20 73 61 76 65 41  .    (rc = saveA
2a3f0 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70  llCursors(pBt, p
2a400 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
2a410 43 75 72 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20  Cur))!=0 ||.    
2a420 28 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67  (rc = sqlite3pag
2a430 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 2d 3e  er_write(pPage->
2a440 61 44 61 74 61 29 29 21 3d 30 0a 20 20 29 7b 0a  aData))!=0.  ){.
2a450 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2a460 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20   }..  /* Locate 
2a470 74 68 65 20 63 65 6c 6c 20 77 69 74 68 69 6e 20  the cell within 
2a480 69 74 27 73 20 70 61 67 65 20 61 6e 64 20 6c 65  it's page and le
2a490 61 76 65 20 70 43 65 6c 6c 20 70 6f 69 6e 74 69  ave pCell pointi
2a4a0 6e 67 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64  ng to the.  ** d
2a4b0 61 74 61 2e 20 54 68 65 20 63 6c 65 61 72 43 65  ata. The clearCe
2a4c0 6c 6c 28 29 20 63 61 6c 6c 20 66 72 65 65 73 20  ll() call frees 
2a4d0 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
2a4e0 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
2a4f0 74 68 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c  th the.  ** cell
2a500 2e 20 54 68 65 20 63 65 6c 6c 20 69 74 73 65 6c  . The cell itsel
2a510 66 20 69 73 20 73 74 69 6c 6c 20 69 6e 74 61 63  f is still intac
2a520 74 2e 0a 20 20 2a 2f 0a 20 20 70 43 65 6c 6c 20  t..  */.  pCell 
2a530 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
2a540 2c 20 70 43 75 72 2d 3e 69 64 78 29 3b 0a 20 20  , pCur->idx);.  
2a550 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
2a560 20 29 7b 0a 20 20 20 20 70 67 6e 6f 43 68 69 6c   ){.    pgnoChil
2a570 64 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65  d = get4byte(pCe
2a580 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ll);.  }.  rc = 
2a590 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c  clearCell(pPage,
2a5a0 20 70 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20 72   pCell);.  if( r
2a5b0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
2a5c0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2a5d0 61 66 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  af ){.    /*.   
2a5e0 20 2a 2a 20 54 68 65 20 65 6e 74 72 79 20 77 65   ** The entry we
2a5f0 20 61 72 65 20 61 62 6f 75 74 20 74 6f 20 64 65   are about to de
2a600 6c 65 74 65 20 69 73 20 6e 6f 74 20 61 20 6c 65  lete is not a le
2a610 61 66 20 73 6f 20 69 66 20 77 65 20 64 6f 20 6e  af so if we do n
2a620 6f 74 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 6d  ot.    ** do som
2a630 65 74 68 69 6e 67 20 77 65 20 77 69 6c 6c 20 6c  ething we will l
2a640 65 61 76 65 20 61 20 68 6f 6c 65 20 6f 6e 20 61  eave a hole on a
2a650 6e 20 69 6e 74 65 72 6e 61 6c 20 70 61 67 65 2e  n internal page.
2a660 0a 20 20 20 20 2a 2a 20 57 65 20 68 61 76 65 20  .    ** We have 
2a670 74 6f 20 66 69 6c 6c 20 74 68 65 20 68 6f 6c 65  to fill the hole
2a680 20 62 79 20 6d 6f 76 69 6e 67 20 69 6e 20 61 20   by moving in a 
2a690 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66  cell from a leaf
2a6a0 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 6e 65  .  The.    ** ne
2a6b0 78 74 20 43 65 6c 6c 20 61 66 74 65 72 20 74 68  xt Cell after th
2a6c0 65 20 6f 6e 65 20 74 6f 20 62 65 20 64 65 6c 65  e one to be dele
2a6d0 74 65 64 20 69 73 20 67 75 61 72 61 6e 74 65 65  ted is guarantee
2a6e0 64 20 74 6f 20 65 78 69 73 74 20 61 6e 64 0a 20  d to exist and. 
2a6f0 20 20 20 2a 2a 20 74 6f 20 62 65 20 61 20 6c 65     ** to be a le
2a700 61 66 20 73 6f 20 77 65 20 63 61 6e 20 75 73 65  af so we can use
2a710 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   it..    */.    
2a720 42 74 43 75 72 73 6f 72 20 6c 65 61 66 43 75 72  BtCursor leafCur
2a730 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ;.    unsigned c
2a740 68 61 72 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20  har *pNext;.    
2a750 69 6e 74 20 73 7a 4e 65 78 74 3b 20 20 2f 2a 20  int szNext;  /* 
2a760 54 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72  The compiler war
2a770 6e 69 6e 67 20 69 73 20 77 72 6f 6e 67 3a 20 73  ning is wrong: s
2a780 7a 4e 65 78 74 20 69 73 20 61 6c 77 61 79 73 20  zNext is always 
2a790 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a7a0 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64    ** initialized
2a7b0 20 62 65 66 6f 72 65 20 75 73 65 2e 20 20 41 64   before use.  Ad
2a7c0 64 69 6e 67 20 61 6e 20 65 78 74 72 61 20 69 6e  ding an extra in
2a7d0 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20  itialization.   
2a7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
2a7f0 20 74 6f 20 73 69 6c 65 6e 63 65 20 74 68 65 20   to silence the 
2a800 63 6f 6d 70 69 6c 65 72 20 73 6c 6f 77 73 20 64  compiler slows d
2a810 6f 77 6e 20 74 68 65 20 63 6f 64 65 2e 20 2a 2f  own the code. */
2a820 0a 20 20 20 20 69 6e 74 20 6e 6f 74 55 73 65 64  .    int notUsed
2a830 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ;.    unsigned c
2a840 68 61 72 20 2a 74 65 6d 70 43 65 6c 6c 20 3d 20  har *tempCell = 
2a850 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  0;.    assert( !
2a860 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20  pPage->leafData 
2a870 29 3b 0a 20 20 20 20 67 65 74 54 65 6d 70 43 75  );.    getTempCu
2a880 72 73 6f 72 28 70 43 75 72 2c 20 26 6c 65 61 66  rsor(pCur, &leaf
2a890 43 75 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  Cur);.    rc = s
2a8a0 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
2a8b0 26 6c 65 61 66 43 75 72 2c 20 26 6e 6f 74 55 73  &leafCur, &notUs
2a8c0 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ed);.    if( rc!
2a8d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2a8e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2a8f0 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
2a900 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2a910 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
2a920 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2a930 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2a940 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
2a950 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
2a960 69 74 65 28 6c 65 61 66 43 75 72 2e 70 50 61 67  ite(leafCur.pPag
2a970 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d  e->aData);.    }
2a980 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2a990 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2a9a0 54 52 41 43 45 28 28 22 44 45 4c 45 54 45 3a 20  TRACE(("DELETE: 
2a9b0 74 61 62 6c 65 3d 25 64 20 64 65 6c 65 74 65 20  table=%d delete 
2a9c0 69 6e 74 65 72 6e 61 6c 20 66 72 6f 6d 20 25 64  internal from %d
2a9d0 20 72 65 70 6c 61 63 65 20 66 72 6f 6d 20 6c 65   replace from le
2a9e0 61 66 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  af %d\n",.      
2a9f0 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f     pCur->pgnoRoo
2aa00 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20  t, pPage->pgno, 
2aa10 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2d 3e 70  leafCur.pPage->p
2aa20 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 64 72 6f  gno));.      dro
2aa30 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  pCell(pPage, pCu
2aa40 72 2d 3e 69 64 78 2c 20 63 65 6c 6c 53 69 7a 65  r->idx, cellSize
2aa50 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
2aa60 29 29 3b 0a 20 20 20 20 20 20 70 4e 65 78 74 20  ));.      pNext 
2aa70 3d 20 66 69 6e 64 43 65 6c 6c 28 6c 65 61 66 43  = findCell(leafC
2aa80 75 72 2e 70 50 61 67 65 2c 20 6c 65 61 66 43 75  ur.pPage, leafCu
2aa90 72 2e 69 64 78 29 3b 0a 20 20 20 20 20 20 73 7a  r.idx);.      sz
2aaa0 4e 65 78 74 20 3d 20 63 65 6c 6c 53 69 7a 65 50  Next = cellSizeP
2aab0 74 72 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65  tr(leafCur.pPage
2aac0 2c 20 70 4e 65 78 74 29 3b 0a 20 20 20 20 20 20  , pNext);.      
2aad0 61 73 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c 5f  assert( MX_CELL_
2aae0 53 49 5a 45 28 70 42 74 29 3e 3d 73 7a 4e 65 78  SIZE(pBt)>=szNex
2aaf0 74 2b 34 20 29 3b 0a 20 20 20 20 20 20 74 65 6d  t+4 );.      tem
2ab00 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 4d 61  pCell = sqliteMa
2ab10 6c 6c 6f 63 52 61 77 28 20 4d 58 5f 43 45 4c 4c  llocRaw( MX_CELL
2ab20 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20  _SIZE(pBt) );.  
2ab30 20 20 20 20 69 66 28 20 74 65 6d 70 43 65 6c 6c      if( tempCell
2ab40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
2ab50 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
2ab60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2ab70 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2ab80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
2ab90 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70  c = insertCell(p
2aba0 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c  Page, pCur->idx,
2abb0 20 70 4e 65 78 74 2d 34 2c 20 73 7a 4e 65 78 74   pNext-4, szNext
2abc0 2b 34 2c 20 74 65 6d 70 43 65 6c 6c 2c 20 30 29  +4, tempCell, 0)
2abd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2abe0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2abf0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
2ac00 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c  findOverflowCell
2ac10 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64  (pPage, pCur->id
2ac20 78 29 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a  x), pgnoChild);.
2ac30 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e        rc = balan
2ac40 63 65 28 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  ce(pPage, 0);.  
2ac50 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
2ac60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ac70 20 20 20 64 72 6f 70 43 65 6c 6c 28 6c 65 61 66     dropCell(leaf
2ac80 43 75 72 2e 70 50 61 67 65 2c 20 6c 65 61 66 43  Cur.pPage, leafC
2ac90 75 72 2e 69 64 78 2c 20 73 7a 4e 65 78 74 29 3b  ur.idx, szNext);
2aca0 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61  .      rc = bala
2acb0 6e 63 65 28 6c 65 61 66 43 75 72 2e 70 50 61 67  nce(leafCur.pPag
2acc0 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e, 0);.    }.   
2acd0 20 73 71 6c 69 74 65 46 72 65 65 28 74 65 6d 70   sqliteFree(temp
2ace0 43 65 6c 6c 29 3b 0a 20 20 20 20 72 65 6c 65 61  Cell);.    relea
2acf0 73 65 54 65 6d 70 43 75 72 73 6f 72 28 26 6c 65  seTempCursor(&le
2ad00 61 66 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  afCur);.  }else{
2ad10 0a 20 20 20 20 54 52 41 43 45 28 28 22 44 45 4c  .    TRACE(("DEL
2ad20 45 54 45 3a 20 74 61 62 6c 65 3d 25 64 20 64 65  ETE: table=%d de
2ad30 6c 65 74 65 20 66 72 6f 6d 20 6c 65 61 66 20 25  lete from leaf %
2ad40 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 43 75  d\n",.       pCu
2ad50 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61  r->pgnoRoot, pPa
2ad60 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  ge->pgno));.    
2ad70 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20  dropCell(pPage, 
2ad80 70 43 75 72 2d 3e 69 64 78 2c 20 63 65 6c 6c 53  pCur->idx, cellS
2ad90 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43  izePtr(pPage, pC
2ada0 65 6c 6c 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  ell));.    rc = 
2adb0 62 61 6c 61 6e 63 65 28 70 50 61 67 65 2c 20 30  balance(pPage, 0
2adc0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
2add0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ade0 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75    moveToRoot(pCu
2adf0 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
2ae00 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72   rc;.}../*.** Cr
2ae10 65 61 74 65 20 61 20 6e 65 77 20 42 54 72 65 65  eate a new BTree
2ae20 20 74 61 62 6c 65 2e 20 20 57 72 69 74 65 20 69   table.  Write i
2ae30 6e 74 6f 20 2a 70 69 54 61 62 6c 65 20 74 68 65  nto *piTable the
2ae40 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20   page.** number 
2ae50 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 70 61 67  for the root pag
2ae60 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  e of the new tab
2ae70 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 79  le..**.** The ty
2ae80 70 65 20 6f 66 20 74 79 70 65 20 69 73 20 64 65  pe of type is de
2ae90 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
2aea0 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 2e  flags parameter.
2aeb0 20 20 4f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 6f    Only the.** fo
2aec0 6c 6c 6f 77 69 6e 67 20 76 61 6c 75 65 73 20 6f  llowing values o
2aed0 66 20 66 6c 61 67 73 20 61 72 65 20 63 75 72 72  f flags are curr
2aee0 65 6e 74 6c 79 20 69 6e 20 75 73 65 2e 20 20 4f  ently in use.  O
2aef0 74 68 65 72 20 76 61 6c 75 65 73 20 66 6f 72 0a  ther values for.
2af00 2a 2a 20 66 6c 61 67 73 20 6d 69 67 68 74 20 6e  ** flags might n
2af10 6f 74 20 77 6f 72 6b 3a 0a 2a 2a 0a 2a 2a 20 20  ot work:.**.**  
2af20 20 20 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 7c     BTREE_INTKEY|
2af30 42 54 52 45 45 5f 4c 45 41 46 44 41 54 41 20 20  BTREE_LEAFDATA  
2af40 20 20 20 55 73 65 64 20 66 6f 72 20 53 51 4c 20     Used for SQL 
2af50 74 61 62 6c 65 73 20 77 69 74 68 20 72 6f 77 69  tables with rowi
2af60 64 20 6b 65 79 73 0a 2a 2a 20 20 20 20 20 42 54  d keys.**     BT
2af70 52 45 45 5f 5a 45 52 4f 44 41 54 41 20 20 20 20  REE_ZERODATA    
2af80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 55 73                Us
2af90 65 64 20 66 6f 72 20 53 51 4c 20 69 6e 64 69 63  ed for SQL indic
2afa0 65 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  es.*/.int sqlite
2afb0 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c  3BtreeCreateTabl
2afc0 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
2afd0 2a 70 69 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c  *piTable, int fl
2afe0 61 67 73 29 7b 0a 20 20 42 74 53 68 61 72 65 64  ags){.  BtShared
2aff0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
2b000 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74    MemPage *pRoot
2b010 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f  ;.  Pgno pgnoRoo
2b020 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  t;.  int rc;.  i
2b030 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  f( pBt->inTransa
2b040 63 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 57 52 49  ction!=TRANS_WRI
2b050 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73  TE ){.    /* Mus
2b060 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61  t start a transa
2b070 63 74 69 6f 6e 20 66 69 72 73 74 20 2a 2f 0a 20  ction first */. 
2b080 20 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 72     return pBt->r
2b090 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45  eadOnly ? SQLITE
2b0a0 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49  _READONLY : SQLI
2b0b0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
2b0c0 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65  assert( !pBt->re
2b0d0 61 64 4f 6e 6c 79 20 29 3b 0a 0a 20 20 2f 2a 20  adOnly );..  /* 
2b0e0 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f  It is illegal to
2b0f0 20 63 72 65 61 74 65 20 61 20 74 61 62 6c 65 20   create a table 
2b100 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 20 61  if any cursors a
2b110 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 20  re open on the. 
2b120 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68   ** database. Th
2b130 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e  is is because in
2b140 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64   auto-vacuum mod
2b150 65 20 74 68 65 20 62 61 63 6b 65 6e 64 20 6d 61  e the backend ma
2b160 79 0a 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 6d  y.  ** need to m
2b170 6f 76 65 20 61 20 64 61 74 61 62 61 73 65 20 70  ove a database p
2b180 61 67 65 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d  age to make room
2b190 20 66 6f 72 20 74 68 65 20 6e 65 77 20 72 6f 6f   for the new roo
2b1a0 74 2d 70 61 67 65 2e 0a 20 20 2a 2a 20 49 66 20  t-page..  ** If 
2b1b0 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 77  an open cursor w
2b1c0 61 73 20 75 73 69 6e 67 20 74 68 65 20 70 61 67  as using the pag
2b1d0 65 20 61 20 70 72 6f 62 6c 65 6d 20 77 6f 75 6c  e a problem woul
2b1e0 64 20 6f 63 63 75 72 2e 0a 20 20 2a 2f 0a 20 20  d occur..  */.  
2b1f0 69 66 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  if( pBt->pCursor
2b200 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2b210 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20  QLITE_LOCKED;.  
2b220 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
2b230 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
2b240 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65  .  rc = allocate
2b250 50 61 67 65 28 70 42 74 2c 20 26 70 52 6f 6f 74  Page(pBt, &pRoot
2b260 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20  , &pgnoRoot, 1, 
2b270 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  0);.  if( rc ) r
2b280 65 74 75 72 6e 20 72 63 3b 0a 23 65 6c 73 65 0a  eturn rc;.#else.
2b290 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
2b2a0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e  acuum ){.    Pgn
2b2b0 6f 20 70 67 6e 6f 4d 6f 76 65 3b 20 20 20 20 20  o pgnoMove;     
2b2c0 20 2f 2a 20 4d 6f 76 65 20 61 20 70 61 67 65 20   /* Move a page 
2b2d0 68 65 72 65 20 74 6f 20 6d 61 6b 65 20 72 6f 6f  here to make roo
2b2e0 6d 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70  m for the root-p
2b2f0 61 67 65 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61  age */.    MemPa
2b300 67 65 20 2a 70 50 61 67 65 4d 6f 76 65 3b 20 2f  ge *pPageMove; /
2b310 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20 6d 6f  * The page to mo
2b320 76 65 20 74 6f 2e 20 2a 2f 0a 0a 20 20 20 20 2f  ve to. */..    /
2b330 2a 20 52 65 61 64 20 74 68 65 20 76 61 6c 75 65  * Read the value
2b340 20 6f 66 20 6d 65 74 61 5b 33 5d 20 66 72 6f 6d   of meta[3] from
2b350 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
2b360 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 72 65   determine where
2b370 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 6f 74   the.    ** root
2b380 20 70 61 67 65 20 6f 66 20 74 68 65 20 6e 65 77   page of the new
2b390 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 67 6f   table should go
2b3a0 2e 20 6d 65 74 61 5b 33 5d 20 69 73 20 74 68 65  . meta[3] is the
2b3b0 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61   largest root-pa
2b3c0 67 65 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65  ge.    ** create
2b3d0 64 20 73 6f 20 66 61 72 2c 20 73 6f 20 74 68 65  d so far, so the
2b3e0 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 69   new root-page i
2b3f0 73 20 28 6d 65 74 61 5b 33 5d 2b 31 29 2e 0a 20  s (meta[3]+1).. 
2b400 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
2b410 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d 65  qlite3BtreeGetMe
2b420 74 61 28 70 2c 20 34 2c 20 26 70 67 6e 6f 52 6f  ta(p, 4, &pgnoRo
2b430 6f 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ot);.    if( rc!
2b440 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
2b450 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 67 6e 6f  urn rc;.    pgno
2b460 52 6f 6f 74 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20  Root++;..    /* 
2b470 54 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67  The new root-pag
2b480 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 6c 6c  e may not be all
2b490 6f 63 61 74 65 64 20 6f 6e 20 61 20 70 6f 69 6e  ocated on a poin
2b4a0 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 6f 72  ter-map page, or
2b4b0 20 74 68 65 0a 20 20 20 20 2a 2a 20 50 45 4e 44   the.    ** PEND
2b4c0 49 4e 47 5f 42 59 54 45 20 70 61 67 65 2e 0a 20  ING_BYTE page.. 
2b4d0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67     */.    if( pg
2b4e0 6e 6f 52 6f 6f 74 3d 3d 50 54 52 4d 41 50 5f 50  noRoot==PTRMAP_P
2b4f0 41 47 45 4e 4f 28 70 42 74 2c 20 70 67 6e 6f 52  AGENO(pBt, pgnoR
2b500 6f 6f 74 29 20 7c 7c 0a 20 20 20 20 20 20 20 20  oot) ||.        
2b510 70 67 6e 6f 52 6f 6f 74 3d 3d 50 45 4e 44 49 4e  pgnoRoot==PENDIN
2b520 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
2b530 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f 52 6f   ){.      pgnoRo
2b540 6f 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ot++;.    }.    
2b550 61 73 73 65 72 74 28 20 70 67 6e 6f 52 6f 6f 74  assert( pgnoRoot
2b560 3e 3d 33 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41  >=3 );..    /* A
2b570 6c 6c 6f 63 61 74 65 20 61 20 70 61 67 65 2e 20  llocate a page. 
2b580 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 75  The page that cu
2b590 72 72 65 6e 74 6c 79 20 72 65 73 69 64 65 73 20  rrently resides 
2b5a0 61 74 20 70 67 6e 6f 52 6f 6f 74 20 77 69 6c 6c  at pgnoRoot will
2b5b0 0a 20 20 20 20 2a 2a 20 62 65 20 6d 6f 76 65 64  .    ** be moved
2b5c0 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65   to the allocate
2b5d0 64 20 70 61 67 65 20 28 75 6e 6c 65 73 73 20 74  d page (unless t
2b5e0 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  he allocated pag
2b5f0 65 20 68 61 70 70 65 6e 73 0a 20 20 20 20 2a 2a  e happens.    **
2b600 20 74 6f 20 72 65 73 69 64 65 20 61 74 20 70 67   to reside at pg
2b610 6e 6f 52 6f 6f 74 29 2e 0a 20 20 20 20 2a 2f 0a  noRoot)..    */.
2b620 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
2b630 65 50 61 67 65 28 70 42 74 2c 20 26 70 50 61 67  ePage(pBt, &pPag
2b640 65 4d 6f 76 65 2c 20 26 70 67 6e 6f 4d 6f 76 65  eMove, &pgnoMove
2b650 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b 0a  , pgnoRoot, 1);.
2b660 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2b670 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
2b680 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
2b690 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 4d 6f 76  .    if( pgnoMov
2b6a0 65 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20  e!=pgnoRoot ){. 
2b6b0 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20       u8 eType;. 
2b6c0 20 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61       Pgno iPtrPa
2b6d0 67 65 3b 0a 0a 20 20 20 20 20 20 72 65 6c 65 61  ge;..      relea
2b6e0 73 65 50 61 67 65 28 70 50 61 67 65 4d 6f 76 65  sePage(pPageMove
2b6f0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65  );.      rc = ge
2b700 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 52  tPage(pBt, pgnoR
2b710 6f 6f 74 2c 20 26 70 52 6f 6f 74 29 3b 0a 20 20  oot, &pRoot);.  
2b720 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2b730 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2b740 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2b750 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70    }.      rc = p
2b760 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 70 67  trmapGet(pBt, pg
2b770 6e 6f 52 6f 6f 74 2c 20 26 65 54 79 70 65 2c 20  noRoot, &eType, 
2b780 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  &iPtrPage);.    
2b790 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2b7a0 5f 4f 4b 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  _OK || eType==PT
2b7b0 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 7c 7c  RMAP_ROOTPAGE ||
2b7c0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46   eType==PTRMAP_F
2b7d0 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20  REEPAGE ){.     
2b7e0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2b7f0 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72  Root);.        r
2b800 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2b810 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
2b820 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f  eType!=PTRMAP_RO
2b830 4f 54 50 41 47 45 20 29 3b 0a 20 20 20 20 20 20  OTPAGE );.      
2b840 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 50  assert( eType!=P
2b850 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
2b860 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
2b870 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28  ite3pager_write(
2b880 70 52 6f 6f 74 2d 3e 61 44 61 74 61 29 3b 0a 20  pRoot->aData);. 
2b890 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2b8a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2b8b0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52    releasePage(pR
2b8c0 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  oot);.        re
2b8d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
2b8e0 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f  .      rc = relo
2b8f0 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 52  catePage(pBt, pR
2b900 6f 6f 74 2c 20 65 54 79 70 65 2c 20 69 50 74 72  oot, eType, iPtr
2b910 50 61 67 65 2c 20 70 67 6e 6f 4d 6f 76 65 29 3b  Page, pgnoMove);
2b920 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
2b930 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20  ge(pRoot);.     
2b940 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2b950 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
2b960 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
2b970 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 50  .      rc = getP
2b980 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f  age(pBt, pgnoRoo
2b990 74 2c 20 26 70 52 6f 6f 74 29 3b 0a 20 20 20 20  t, &pRoot);.    
2b9a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2b9b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2b9c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2b9d0 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
2b9e0 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28  ite3pager_write(
2b9f0 70 52 6f 6f 74 2d 3e 61 44 61 74 61 29 3b 0a 20  pRoot->aData);. 
2ba00 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2ba10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2ba20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52    releasePage(pR
2ba30 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  oot);.        re
2ba40 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
2ba50 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2ba60 20 20 70 52 6f 6f 74 20 3d 20 70 50 61 67 65 4d    pRoot = pPageM
2ba70 6f 76 65 3b 0a 20 20 20 20 7d 20 0a 0a 20 20 20  ove;.    } ..   
2ba80 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 70   /* Update the p
2ba90 6f 69 6e 74 65 72 2d 6d 61 70 20 61 6e 64 20 6d  ointer-map and m
2baa0 65 74 61 2d 64 61 74 61 20 77 69 74 68 20 74 68  eta-data with th
2bab0 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 20  e new root-page 
2bac0 6e 75 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 72  number. */.    r
2bad0 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
2bae0 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 50 54 52  t, pgnoRoot, PTR
2baf0 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30 29  MAP_ROOTPAGE, 0)
2bb00 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
2bb10 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2bb20 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20  e(pRoot);.      
2bb30 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2bb40 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2bb50 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61  3BtreeUpdateMeta
2bb60 28 70 2c 20 34 2c 20 70 67 6e 6f 52 6f 6f 74 29  (p, 4, pgnoRoot)
2bb70 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
2bb80 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2bb90 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20  e(pRoot);.      
2bba0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2bbb0 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ..  }else{.    r
2bbc0 63 20 3d 20 61 6c 6c 6f 63 61 74 65 50 61 67 65  c = allocatePage
2bbd0 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70  (pBt, &pRoot, &p
2bbe0 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a  gnoRoot, 1, 0);.
2bbf0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2bc00 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64  urn rc;.  }.#end
2bc10 69 66 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  if.  assert( sql
2bc20 69 74 65 33 70 61 67 65 72 5f 69 73 77 72 69 74  ite3pager_iswrit
2bc30 65 61 62 6c 65 28 70 52 6f 6f 74 2d 3e 61 44 61  eable(pRoot->aDa
2bc40 74 61 29 20 29 3b 0a 20 20 7a 65 72 6f 50 61 67  ta) );.  zeroPag
2bc50 65 28 70 52 6f 6f 74 2c 20 66 6c 61 67 73 20 7c  e(pRoot, flags |
2bc60 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 73 71   PTF_LEAF);.  sq
2bc70 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
2bc80 28 70 52 6f 6f 74 2d 3e 61 44 61 74 61 29 3b 0a  (pRoot->aData);.
2bc90 20 20 2a 70 69 54 61 62 6c 65 20 3d 20 28 69 6e    *piTable = (in
2bca0 74 29 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 72 65  t)pgnoRoot;.  re
2bcb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2bcc0 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 74  }../*.** Erase t
2bcd0 68 65 20 67 69 76 65 6e 20 64 61 74 61 62 61 73  he given databas
2bce0 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 69  e page and all i
2bcf0 74 73 20 63 68 69 6c 64 72 65 6e 2e 20 20 52 65  ts children.  Re
2bd00 74 75 72 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65  turn.** the page
2bd10 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
2bd20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2bd30 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67  clearDatabasePag
2bd40 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
2bd50 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Bt,           /*
2bd60 20 54 68 65 20 42 54 72 65 65 20 74 68 61 74 20   The BTree that 
2bd70 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 61 62  contains the tab
2bd80 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  le */.  Pgno pgn
2bd90 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  o,            /*
2bda0 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   Page number to 
2bdb0 63 6c 65 61 72 20 2a 2f 0a 20 20 4d 65 6d 50 61  clear */.  MemPa
2bdc0 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20  ge *pParent,    
2bdd0 20 2f 2a 20 50 61 72 65 6e 74 20 70 61 67 65 2e   /* Parent page.
2bde0 20 20 4e 55 4c 4c 20 66 6f 72 20 74 68 65 20 72    NULL for the r
2bdf0 6f 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 66 72 65  oot */.  int fre
2be00 65 50 61 67 65 46 6c 61 67 20 20 20 20 20 20 2f  ePageFlag      /
2be10 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 70 61 67  * Deallocate pag
2be20 65 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  e if true */.){.
2be30 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2be40 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
2be50 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2be60 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b  *pCell;.  int i;
2be70 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e 73 71 6c  ..  if( pgno>sql
2be80 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f  ite3pager_pageco
2be90 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
2bea0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2beb0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2bec0 50 54 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  PT;.  }..  rc = 
2bed0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
2bee0 42 74 2c 20 70 67 6e 6f 2c 20 26 70 50 61 67 65  Bt, pgno, &pPage
2bef0 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20 69 66  , pParent);.  if
2bf00 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61  ( rc ) goto clea
2bf10 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75  rdatabasepage_ou
2bf20 74 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  t;.  rc = sqlite
2bf30 33 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61  3pager_write(pPa
2bf40 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 69 66  ge->aData);.  if
2bf50 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61  ( rc ) goto clea
2bf60 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75  rdatabasepage_ou
2bf70 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  t;.  for(i=0; i<
2bf80 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b  pPage->nCell; i+
2bf90 2b 29 7b 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20  +){.    pCell = 
2bfa0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
2bfb0 69 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61  i);.    if( !pPa
2bfc0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2bfd0 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61 74 61    rc = clearData
2bfe0 62 61 73 65 50 61 67 65 28 70 42 74 2c 20 67 65  basePage(pBt, ge
2bff0 74 34 62 79 74 65 28 70 43 65 6c 6c 29 2c 20 70  t4byte(pCell), p
2c000 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 2c 20 31  Page->pParent, 1
2c010 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
2c020 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61  ) goto cleardata
2c030 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  basepage_out;.  
2c040 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6c 65    }.    rc = cle
2c050 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  arCell(pPage, pC
2c060 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ell);.    if( rc
2c070 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74   ) goto cleardat
2c080 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20  abasepage_out;. 
2c090 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d   }.  if( !pPage-
2c0a0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 63 20  >leaf ){.    rc 
2c0b0 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50  = clearDatabaseP
2c0c0 61 67 65 28 70 42 74 2c 20 67 65 74 34 62 79 74  age(pBt, get4byt
2c0d0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
2c0e0 38 5d 29 2c 20 70 50 61 67 65 2d 3e 70 50 61 72  8]), pPage->pPar
2c0f0 65 6e 74 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  ent, 1);.    if(
2c100 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72   rc ) goto clear
2c110 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74  databasepage_out
2c120 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 72 65 65  ;.  }.  if( free
2c130 50 61 67 65 46 6c 61 67 20 29 7b 0a 20 20 20 20  PageFlag ){.    
2c140 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50  rc = freePage(pP
2c150 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  age);.  }else{. 
2c160 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67     zeroPage(pPag
2c170 65 2c 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e, pPage->aData[
2c180 30 5d 20 7c 20 50 54 46 5f 4c 45 41 46 29 3b 0a  0] | PTF_LEAF);.
2c190 20 20 7d 0a 0a 63 6c 65 61 72 64 61 74 61 62 61    }..cleardataba
2c1a0 73 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 72 65  sepage_out:.  re
2c1b0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
2c1c0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2c1d0 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
2c1e0 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ll information f
2c1f0 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 74 61 62  rom a single tab
2c200 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  le in the databa
2c210 73 65 2e 20 20 69 54 61 62 6c 65 20 69 73 0a 2a  se.  iTable is.*
2c220 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * the page numbe
2c230 72 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 6f 66  r of the root of
2c240 20 74 68 65 20 74 61 62 6c 65 2e 20 20 41 66 74   the table.  Aft
2c250 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
2c260 72 65 74 75 72 6e 73 2c 0a 2a 2a 20 74 68 65 20  returns,.** the 
2c270 72 6f 6f 74 20 70 61 67 65 20 69 73 20 65 6d 70  root page is emp
2c280 74 79 2c 20 62 75 74 20 73 74 69 6c 6c 20 65 78  ty, but still ex
2c290 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ists..**.** This
2c2a0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 66 61   routine will fa
2c2b0 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4c  il with SQLITE_L
2c2c0 4f 43 4b 45 44 20 69 66 20 74 68 65 72 65 20 61  OCKED if there a
2c2d0 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 72  re any open.** r
2c2e0 65 61 64 20 63 75 72 73 6f 72 73 20 6f 6e 20 74  ead cursors on t
2c2f0 68 65 20 74 61 62 6c 65 2e 20 20 4f 70 65 6e 20  he table.  Open 
2c300 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 72  write cursors ar
2c310 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a  e moved to the.*
2c320 2a 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61  * root of the ta
2c330 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ble..*/.int sqli
2c340 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62  te3BtreeClearTab
2c350 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  le(Btree *p, int
2c360 20 69 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20   iTable){.  int 
2c370 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
2c380 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
2c390 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d  if( p->inTrans!=
2c3a0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
2c3b0 20 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 72     return pBt->r
2c3c0 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45  eadOnly ? SQLITE
2c3d0 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49  _READONLY : SQLI
2c3e0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
2c3f0 72 63 20 3d 20 63 68 65 63 6b 52 65 61 64 4c 6f  rc = checkReadLo
2c400 63 6b 73 28 70 2c 20 69 54 61 62 6c 65 2c 20 30  cks(p, iTable, 0
2c410 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
2c420 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2c430 7d 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74 68 65  }..  /* Save the
2c440 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 61 6c 6c   position of all
2c450 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
2c460 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20   this table */. 
2c470 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
2c480 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72  (rc = saveAllCur
2c490 73 6f 72 73 28 70 42 74 2c 20 69 54 61 62 6c 65  sors(pBt, iTable
2c4a0 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 72 65 74  , 0)) ){.    ret
2c4b0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 72  urn rc;.  }..  r
2c4c0 65 74 75 72 6e 20 63 6c 65 61 72 44 61 74 61 62  eturn clearDatab
2c4d0 61 73 65 50 61 67 65 28 70 42 74 2c 20 28 50 67  asePage(pBt, (Pg
2c4e0 6e 6f 29 69 54 61 62 6c 65 2c 20 30 2c 20 30 29  no)iTable, 0, 0)
2c4f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65  ;.}../*.** Erase
2c500 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
2c510 20 69 6e 20 61 20 74 61 62 6c 65 20 61 6e 64 20   in a table and 
2c520 61 64 64 20 74 68 65 20 72 6f 6f 74 20 6f 66 20  add the root of 
2c530 74 68 65 20 74 61 62 6c 65 20 74 6f 0a 2a 2a 20  the table to.** 
2c540 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 45  the freelist.  E
2c550 78 63 65 70 74 2c 20 74 68 65 20 72 6f 6f 74 20  xcept, the root 
2c560 6f 66 20 74 68 65 20 70 72 69 6e 63 69 70 6c 65  of the principle
2c570 20 74 61 62 6c 65 20 28 74 68 65 20 6f 6e 65 20   table (the one 
2c580 6f 6e 0a 2a 2a 20 70 61 67 65 20 31 29 20 69 73  on.** page 1) is
2c590 20 6e 65 76 65 72 20 61 64 64 65 64 20 74 6f 20   never added to 
2c5a0 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a  the freelist..**
2c5b0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2c5c0 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20   will fail with 
2c5d0 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66  SQLITE_LOCKED if
2c5e0 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f   there are any o
2c5f0 70 65 6e 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f  pen.** cursors o
2c600 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  n the table..**.
2c610 2a 2a 20 49 66 20 41 55 54 4f 56 41 43 55 55 4d  ** If AUTOVACUUM
2c620 20 69 73 20 65 6e 61 62 6c 65 64 20 61 6e 64 20   is enabled and 
2c630 74 68 65 20 70 61 67 65 20 61 74 20 69 54 61 62  the page at iTab
2c640 6c 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61  le is not the la
2c650 73 74 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20  st.** root page 
2c660 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
2c670 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 6c  file, then the l
2c680 61 73 74 20 72 6f 6f 74 20 70 61 67 65 20 0a 2a  ast root page .*
2c690 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  * in the databas
2c6a0 65 20 66 69 6c 65 20 69 73 20 6d 6f 76 65 64 20  e file is moved 
2c6b0 69 6e 74 6f 20 74 68 65 20 73 6c 6f 74 20 66 6f  into the slot fo
2c6c0 72 6d 65 72 6c 79 20 6f 63 63 75 70 69 65 64 20  rmerly occupied 
2c6d0 62 79 0a 2a 2a 20 69 54 61 62 6c 65 20 61 6e 64  by.** iTable and
2c6e0 20 74 68 61 74 20 6c 61 73 74 20 73 6c 6f 74 20   that last slot 
2c6f0 66 6f 72 6d 65 72 6c 79 20 6f 63 63 75 70 69 65  formerly occupie
2c700 64 20 62 79 20 74 68 65 20 6c 61 73 74 20 72 6f  d by the last ro
2c710 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 64  ot page.** is ad
2c720 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ded to the freel
2c730 69 73 74 20 69 6e 73 74 65 61 64 20 6f 66 20 69  ist instead of i
2c740 54 61 62 6c 65 2e 20 20 49 6e 20 74 68 69 73 20  Table.  In this 
2c750 73 61 79 2c 20 61 6c 6c 0a 2a 2a 20 72 6f 6f 74  say, all.** root
2c760 20 70 61 67 65 73 20 61 72 65 20 6b 65 70 74 20   pages are kept 
2c770 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
2c780 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2c790 20 66 69 6c 65 2c 20 77 68 69 63 68 0a 2a 2a 20   file, which.** 
2c7a0 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72  is necessary for
2c7b0 20 41 55 54 4f 56 41 43 55 55 4d 20 74 6f 20 77   AUTOVACUUM to w
2c7c0 6f 72 6b 20 72 69 67 68 74 2e 20 20 2a 70 69 4d  ork right.  *piM
2c7d0 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f 20 74  oved is set to t
2c7e0 68 65 20 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62  he .** page numb
2c7f0 65 72 20 74 68 61 74 20 75 73 65 64 20 74 6f 20  er that used to 
2c800 62 65 20 74 68 65 20 6c 61 73 74 20 72 6f 6f 74  be the last root
2c810 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c   page in the fil
2c820 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  e before.** the 
2c830 6d 6f 76 65 2e 20 20 49 66 20 6e 6f 20 70 61 67  move.  If no pag
2c840 65 20 67 65 74 73 20 6d 6f 76 65 64 2c 20 2a 70  e gets moved, *p
2c850 69 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f  iMoved is set to
2c860 20 30 2e 0a 2a 2a 20 54 68 65 20 6c 61 73 74 20   0..** The last 
2c870 72 6f 6f 74 20 70 61 67 65 20 69 73 20 72 65 63  root page is rec
2c880 6f 72 64 65 64 20 69 6e 20 6d 65 74 61 5b 33 5d  orded in meta[3]
2c890 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f   and the value o
2c8a0 66 0a 2a 2a 20 6d 65 74 61 5b 33 5d 20 69 73 20  f.** meta[3] is 
2c8b0 75 70 64 61 74 65 64 20 62 79 20 74 68 69 73 20  updated by this 
2c8c0 70 72 6f 63 65 64 75 72 65 2e 0a 2a 2f 0a 69 6e  procedure..*/.in
2c8d0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72  t sqlite3BtreeDr
2c8e0 6f 70 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70  opTable(Btree *p
2c8f0 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e  , int iTable, in
2c900 74 20 2a 70 69 4d 6f 76 65 64 29 7b 0a 20 20 69  t *piMoved){.  i
2c910 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
2c920 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 42   *pPage = 0;.  B
2c930 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2c940 2d 3e 70 42 74 3b 0a 0a 20 20 69 66 28 20 70 2d  ->pBt;..  if( p-
2c950 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f  >inTrans!=TRANS_
2c960 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72 65 74  WRITE ){.    ret
2c970 75 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  urn pBt->readOnl
2c980 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  y ? SQLITE_READO
2c990 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52  NLY : SQLITE_ERR
2c9a0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 74  OR;.  }..  /* It
2c9b0 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 64   is illegal to d
2c9c0 72 6f 70 20 61 20 74 61 62 6c 65 20 69 66 20 61  rop a table if a
2c9d0 6e 79 20 63 75 72 73 6f 72 73 20 61 72 65 20 6f  ny cursors are o
2c9e0 70 65 6e 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  pen on the.  ** 
2c9f0 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 69  database. This i
2ca00 73 20 62 65 63 61 75 73 65 20 69 6e 20 61 75 74  s because in aut
2ca10 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 74 68  o-vacuum mode th
2ca20 65 20 62 61 63 6b 65 6e 64 20 6d 61 79 0a 20 20  e backend may.  
2ca30 2a 2a 20 6e 65 65 64 20 74 6f 20 6d 6f 76 65 20  ** need to move 
2ca40 61 6e 6f 74 68 65 72 20 72 6f 6f 74 2d 70 61 67  another root-pag
2ca50 65 20 74 6f 20 66 69 6c 6c 20 61 20 67 61 70 20  e to fill a gap 
2ca60 6c 65 66 74 20 62 79 20 74 68 65 20 64 65 6c 65  left by the dele
2ca70 74 65 64 0a 20 20 2a 2a 20 72 6f 6f 74 20 70 61  ted.  ** root pa
2ca80 67 65 2e 20 49 66 20 61 6e 20 6f 70 65 6e 20 63  ge. If an open c
2ca90 75 72 73 6f 72 20 77 61 73 20 75 73 69 6e 67 20  ursor was using 
2caa0 74 68 69 73 20 70 61 67 65 20 61 20 70 72 6f 62  this page a prob
2cab0 6c 65 6d 20 77 6f 75 6c 64 20 0a 20 20 2a 2a 20  lem would .  ** 
2cac0 6f 63 63 75 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  occur..  */.  if
2cad0 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29  ( pBt->pCursor )
2cae0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2caf0 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 7d 0a  ITE_LOCKED;.  }.
2cb00 0a 20 20 72 63 20 3d 20 67 65 74 50 61 67 65 28  .  rc = getPage(
2cb10 70 42 74 2c 20 28 50 67 6e 6f 29 69 54 61 62 6c  pBt, (Pgno)iTabl
2cb20 65 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 69 66  e, &pPage);.  if
2cb30 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2cb40 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
2cb50 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28  BtreeClearTable(
2cb60 70 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 69 66  p, iTable);.  if
2cb70 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 6c 65  ( rc ){.    rele
2cb80 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
2cb90 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2cba0 20 7d 0a 0a 20 20 2a 70 69 4d 6f 76 65 64 20 3d   }..  *piMoved =
2cbb0 20 30 3b 0a 0a 20 20 69 66 28 20 69 54 61 62 6c   0;..  if( iTabl
2cbc0 65 3e 31 20 29 7b 0a 23 69 66 64 65 66 20 53 51  e>1 ){.#ifdef SQ
2cbd0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
2cbe0 43 55 55 4d 0a 20 20 20 20 72 63 20 3d 20 66 72  CUUM.    rc = fr
2cbf0 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  eePage(pPage);. 
2cc00 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2cc10 50 61 67 65 29 3b 0a 23 65 6c 73 65 0a 20 20 20  Page);.#else.   
2cc20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
2cc30 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 50 67  cuum ){.      Pg
2cc40 6e 6f 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a  no maxRootPgno;.
2cc50 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2cc60 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 70  e3BtreeGetMeta(p
2cc70 2c 20 34 2c 20 26 6d 61 78 52 6f 6f 74 50 67 6e  , 4, &maxRootPgn
2cc80 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  o);.      if( rc
2cc90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2cca0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
2ccb0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ge(pPage);.     
2ccc0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2ccd0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
2cce0 20 69 54 61 62 6c 65 3d 3d 6d 61 78 52 6f 6f 74   iTable==maxRoot
2ccf0 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Pgno ){.        
2cd00 2f 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  /* If the table 
2cd10 62 65 69 6e 67 20 64 72 6f 70 70 65 64 20 69 73  being dropped is
2cd20 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
2cd30 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74  the largest root
2cd40 2d 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a  -page.        **
2cd50 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20 64   number in the d
2cd60 61 74 61 62 61 73 65 2c 20 70 75 74 20 74 68 65  atabase, put the
2cd70 20 72 6f 6f 74 20 70 61 67 65 20 6f 6e 20 74 68   root page on th
2cd80 65 20 66 72 65 65 20 6c 69 73 74 2e 20 0a 20 20  e free list. .  
2cd90 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2cda0 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70   rc = freePage(p
2cdb0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Page);.        r
2cdc0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
2cdd0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2cde0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2cdf0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2ce00 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
2ce10 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2ce20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
2ce30 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 20 64   being dropped d
2ce40 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 68 65  oes not have the
2ce50 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61   largest root-pa
2ce60 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75  ge.        ** nu
2ce70 6d 62 65 72 20 69 6e 20 74 68 65 20 64 61 74 61  mber in the data
2ce80 62 61 73 65 2e 20 53 6f 20 6d 6f 76 65 20 74 68  base. So move th
2ce90 65 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73  e page that does
2cea0 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 20   into the .     
2ceb0 20 20 20 2a 2a 20 67 61 70 20 6c 65 66 74 20 62     ** gap left b
2cec0 79 20 74 68 65 20 64 65 6c 65 74 65 64 20 72 6f  y the deleted ro
2ced0 6f 74 2d 70 61 67 65 2e 0a 20 20 20 20 20 20 20  ot-page..       
2cee0 20 2a 2f 0a 20 20 20 20 20 20 20 20 4d 65 6d 50   */.        MemP
2cef0 61 67 65 20 2a 70 4d 6f 76 65 3b 0a 20 20 20 20  age *pMove;.    
2cf00 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2cf10 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
2cf20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70 42 74  rc = getPage(pBt
2cf30 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c 20 26  , maxRootPgno, &
2cf40 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20  pMove);.        
2cf50 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2cf60 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
2cf70 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2cf80 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
2cf90 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42   relocatePage(pB
2cfa0 74 2c 20 70 4d 6f 76 65 2c 20 50 54 52 4d 41 50  t, pMove, PTRMAP
2cfb0 5f 52 4f 4f 54 50 41 47 45 2c 20 30 2c 20 69 54  _ROOTPAGE, 0, iT
2cfc0 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 72  able);.        r
2cfd0 65 6c 65 61 73 65 50 61 67 65 28 70 4d 6f 76 65  eleasePage(pMove
2cfe0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2cff0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2d000 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2d010 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
2d020 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 50         rc = getP
2d030 61 67 65 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74  age(pBt, maxRoot
2d040 50 67 6e 6f 2c 20 26 70 4d 6f 76 65 29 3b 0a 20  Pgno, &pMove);. 
2d050 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2d060 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2d070 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2d080 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2d090 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
2d0a0 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20  (pMove);.       
2d0b0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4d 6f   releasePage(pMo
2d0c0 76 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ve);.        if(
2d0d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2d0e0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
2d0f0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
2d100 0a 20 20 20 20 20 20 20 20 2a 70 69 4d 6f 76 65  .        *piMove
2d110 64 20 3d 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b  d = maxRootPgno;
2d120 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
2d130 2f 2a 20 53 65 74 20 74 68 65 20 6e 65 77 20 27  /* Set the new '
2d140 6d 61 78 2d 72 6f 6f 74 2d 70 61 67 65 27 20 76  max-root-page' v
2d150 61 6c 75 65 20 69 6e 20 74 68 65 20 64 61 74 61  alue in the data
2d160 62 61 73 65 20 68 65 61 64 65 72 2e 20 54 68 69  base header. Thi
2d170 73 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68  s.      ** is th
2d180 65 20 6f 6c 64 20 76 61 6c 75 65 20 6c 65 73 73  e old value less
2d190 20 6f 6e 65 2c 20 6c 65 73 73 20 6f 6e 65 20 6d   one, less one m
2d1a0 6f 72 65 20 69 66 20 74 68 61 74 20 68 61 70 70  ore if that happ
2d1b0 65 6e 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ens to.      ** 
2d1c0 62 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6e  be a root-page n
2d1d0 75 6d 62 65 72 2c 20 6c 65 73 73 20 6f 6e 65 20  umber, less one 
2d1e0 61 67 61 69 6e 20 69 66 20 74 68 61 74 20 69 73  again if that is
2d1f0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 50 45   the.      ** PE
2d200 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 2e  NDING_BYTE_PAGE.
2d210 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2d220 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20  maxRootPgno--;. 
2d230 20 20 20 20 20 69 66 28 20 6d 61 78 52 6f 6f 74       if( maxRoot
2d240 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno==PENDING_BY
2d250 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
2d260 20 20 20 20 20 20 20 20 6d 61 78 52 6f 6f 74 50          maxRootP
2d270 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20  gno--;.      }. 
2d280 20 20 20 20 20 69 66 28 20 6d 61 78 52 6f 6f 74       if( maxRoot
2d290 50 67 6e 6f 3d 3d 50 54 52 4d 41 50 5f 50 41 47  Pgno==PTRMAP_PAG
2d2a0 45 4e 4f 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74  ENO(pBt, maxRoot
2d2b0 50 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20  Pgno) ){.       
2d2c0 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a   maxRootPgno--;.
2d2d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
2d2e0 73 65 72 74 28 20 6d 61 78 52 6f 6f 74 50 67 6e  sert( maxRootPgn
2d2f0 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
2d300 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 20 20  PAGE(pBt) );..  
2d310 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2d320 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28  BtreeUpdateMeta(
2d330 70 2c 20 34 2c 20 6d 61 78 52 6f 6f 74 50 67 6e  p, 4, maxRootPgn
2d340 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  o);.    }else{. 
2d350 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61       rc = freePa
2d360 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ge(pPage);.     
2d370 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
2d380 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ge);.    }.#endi
2d390 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  f.  }else{.    /
2d3a0 2a 20 49 66 20 73 71 6c 69 74 65 33 42 74 72 65  * If sqlite3Btre
2d3b0 65 44 72 6f 70 54 61 62 6c 65 20 77 61 73 20 63  eDropTable was c
2d3c0 61 6c 6c 65 64 20 6f 6e 20 70 61 67 65 20 31 2e  alled on page 1.
2d3d0 20 2a 2f 0a 20 20 20 20 7a 65 72 6f 50 61 67 65   */.    zeroPage
2d3e0 28 70 50 61 67 65 2c 20 50 54 46 5f 49 4e 54 4b  (pPage, PTF_INTK
2d3f0 45 59 7c 50 54 46 5f 4c 45 41 46 20 29 3b 0a 20  EY|PTF_LEAF );. 
2d400 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2d410 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Page);.  }.  ret
2d420 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 0a 0a 2f 2a  urn rc;  .}.../*
2d430 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 6d 65 74  .** Read the met
2d440 61 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75  a-information ou
2d450 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  t of a database 
2d460 66 69 6c 65 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a  file.  Meta[0].*
2d470 2a 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  * is the number 
2d480 6f 66 20 66 72 65 65 20 70 61 67 65 73 20 63 75  of free pages cu
2d490 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 64  rrently in the d
2d4a0 61 74 61 62 61 73 65 2e 20 20 4d 65 74 61 5b 31  atabase.  Meta[1
2d4b0 5d 0a 2a 2a 20 74 68 72 6f 75 67 68 20 6d 65 74  ].** through met
2d4c0 61 5b 31 35 5d 20 61 72 65 20 61 76 61 69 6c 61  a[15] are availa
2d4d0 62 6c 65 20 66 6f 72 20 75 73 65 20 62 79 20 68  ble for use by h
2d4e0 69 67 68 65 72 20 6c 61 79 65 72 73 2e 20 20 4d  igher layers.  M
2d4f0 65 74 61 5b 30 5d 0a 2a 2a 20 69 73 20 72 65 61  eta[0].** is rea
2d500 64 2d 6f 6e 6c 79 2c 20 74 68 65 20 6f 74 68 65  d-only, the othe
2d510 72 73 20 61 72 65 20 72 65 61 64 2f 77 72 69 74  rs are read/writ
2d520 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 73 63  e..** .** The sc
2d530 68 65 6d 61 20 6c 61 79 65 72 20 6e 75 6d 62 65  hema layer numbe
2d540 72 73 20 6d 65 74 61 20 76 61 6c 75 65 73 20 64  rs meta values d
2d550 69 66 66 65 72 65 6e 74 6c 79 2e 20 20 41 74 20  ifferently.  At 
2d560 74 68 65 20 73 63 68 65 6d 61 0a 2a 2a 20 6c 61  the schema.** la
2d570 79 65 72 20 28 61 6e 64 20 74 68 65 20 53 65 74  yer (and the Set
2d580 43 6f 6f 6b 69 65 20 61 6e 64 20 52 65 61 64 43  Cookie and ReadC
2d590 6f 6f 6b 69 65 20 6f 70 63 6f 64 65 73 29 20 74  ookie opcodes) t
2d5a0 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
2d5b0 66 72 65 65 20 70 61 67 65 73 20 69 73 20 6e 6f  free pages is no
2d5c0 74 20 76 69 73 69 62 6c 65 2e 20 20 53 6f 20 43  t visible.  So C
2d5d0 6f 6f 6b 69 65 5b 30 5d 20 69 73 20 74 68 65 20  ookie[0] is the 
2d5e0 73 61 6d 65 20 61 73 20 4d 65 74 61 5b 31 5d 2e  same as Meta[1].
2d5f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
2d600 74 72 65 65 47 65 74 4d 65 74 61 28 42 74 72 65  treeGetMeta(Btre
2d610 65 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 75  e *p, int idx, u
2d620 33 32 20 2a 70 4d 65 74 61 29 7b 0a 20 20 69 6e  32 *pMeta){.  in
2d630 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64  t rc;.  unsigned
2d640 20 63 68 61 72 20 2a 70 50 31 3b 0a 20 20 42 74   char *pP1;.  Bt
2d650 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2d660 3e 70 42 74 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  >pBt;..  /* Read
2d670 69 6e 67 20 61 20 6d 65 74 61 2d 64 61 74 61 20  ing a meta-data 
2d680 76 61 6c 75 65 20 72 65 71 75 69 72 65 73 20 61  value requires a
2d690 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70 61   read-lock on pa
2d6a0 67 65 20 31 20 28 61 6e 64 20 68 65 6e 63 65 0a  ge 1 (and hence.
2d6b0 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f    ** the sqlite_
2d6c0 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 57 65  master table. We
2d6d0 20 67 72 61 62 20 74 68 69 73 20 6c 6f 63 6b 20   grab this lock 
2d6e0 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  regardless of wh
2d6f0 65 74 68 65 72 20 6f 72 0a 20 20 2a 2a 20 6e 6f  ether or.  ** no
2d700 74 20 74 68 65 20 53 51 4c 49 54 45 5f 52 65 61  t the SQLITE_Rea
2d710 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61  dUncommitted fla
2d720 67 20 69 73 20 73 65 74 20 28 74 68 65 20 74 61  g is set (the ta
2d730 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61  ble rooted at pa
2d740 67 65 0a 20 20 2a 2a 20 31 20 69 73 20 74 72 65  ge.  ** 1 is tre
2d750 61 74 65 64 20 61 73 20 61 20 73 70 65 63 69 61  ated as a specia
2d760 6c 20 63 61 73 65 20 62 79 20 71 75 65 72 79 54  l case by queryT
2d770 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 20 6c  ableLock() and l
2d780 6f 63 6b 54 61 62 6c 65 28 29 29 2e 0a 20 20 2a  ockTable())..  *
2d790 2f 0a 20 20 72 63 20 3d 20 71 75 65 72 79 54 61  /.  rc = queryTa
2d7a0 62 6c 65 4c 6f 63 6b 28 70 2c 20 31 2c 20 52 45  bleLock(p, 1, RE
2d7b0 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20  AD_LOCK);.  if( 
2d7c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2d7d0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2d7e0 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 69    }..  assert( i
2d7f0 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 3d 31 35  dx>=0 && idx<=15
2d800 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
2d810 65 33 70 61 67 65 72 5f 67 65 74 28 70 42 74 2d  e3pager_get(pBt-
2d820 3e 70 50 61 67 65 72 2c 20 31 2c 20 28 76 6f 69  >pPager, 1, (voi
2d830 64 2a 2a 29 26 70 50 31 29 3b 0a 20 20 69 66 28  d**)&pP1);.  if(
2d840 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2d850 0a 20 20 2a 70 4d 65 74 61 20 3d 20 67 65 74 34  .  *pMeta = get4
2d860 62 79 74 65 28 26 70 50 31 5b 33 36 20 2b 20 69  byte(&pP1[36 + i
2d870 64 78 2a 34 5d 29 3b 0a 20 20 73 71 6c 69 74 65  dx*4]);.  sqlite
2d880 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70 50 31  3pager_unref(pP1
2d890 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 75 74 6f  );..  /* If auto
2d8a0 76 61 63 75 75 6d 65 64 20 69 73 20 64 69 73 61  vacuumed is disa
2d8b0 62 6c 65 64 20 69 6e 20 74 68 69 73 20 62 75 69  bled in this bui
2d8c0 6c 64 20 62 75 74 20 77 65 20 61 72 65 20 74 72  ld but we are tr
2d8d0 79 69 6e 67 20 74 6f 20 0a 20 20 2a 2a 20 61 63  ying to .  ** ac
2d8e0 63 65 73 73 20 61 6e 20 61 75 74 6f 76 61 63 75  cess an autovacu
2d8f0 75 6d 65 64 20 64 61 74 61 62 61 73 65 2c 20 74  umed database, t
2d900 68 65 6e 20 6d 61 6b 65 20 74 68 65 20 64 61 74  hen make the dat
2d910 61 62 61 73 65 20 72 65 61 64 6f 6e 6c 79 2e 20  abase readonly. 
2d920 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
2d930 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2d940 55 55 4d 0a 20 20 69 66 28 20 69 64 78 3d 3d 34  UUM.  if( idx==4
2d950 20 26 26 20 2a 70 4d 65 74 61 3e 30 20 29 20 70   && *pMeta>0 ) p
2d960 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31  Bt->readOnly = 1
2d970 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47  ;.#endif..  /* G
2d980 72 61 62 20 74 68 65 20 72 65 61 64 2d 6c 6f 63  rab the read-loc
2d990 6b 20 6f 6e 20 70 61 67 65 20 31 2e 20 2a 2f 0a  k on page 1. */.
2d9a0 20 20 72 63 20 3d 20 6c 6f 63 6b 54 61 62 6c 65    rc = lockTable
2d9b0 28 70 2c 20 31 2c 20 52 45 41 44 5f 4c 4f 43 4b  (p, 1, READ_LOCK
2d9c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2d9d0 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6d  }../*.** Write m
2d9e0 65 74 61 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  eta-information 
2d9f0 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61  back into the da
2da00 74 61 62 61 73 65 2e 20 20 4d 65 74 61 5b 30 5d  tabase.  Meta[0]
2da10 20 69 73 0a 2a 2a 20 72 65 61 64 2d 6f 6e 6c 79   is.** read-only
2da20 20 61 6e 64 20 6d 61 79 20 6e 6f 74 20 62 65 20   and may not be 
2da30 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a 69 6e 74 20  written..*/.int 
2da40 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61  sqlite3BtreeUpda
2da50 74 65 4d 65 74 61 28 42 74 72 65 65 20 2a 70 2c  teMeta(Btree *p,
2da60 20 69 6e 74 20 69 64 78 2c 20 75 33 32 20 69 4d   int idx, u32 iM
2da70 65 74 61 29 7b 0a 20 20 42 74 53 68 61 72 65 64  eta){.  BtShared
2da80 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
2da90 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2daa0 2a 70 50 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  *pP1;.  int rc;.
2dab0 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 31    assert( idx>=1
2dac0 20 26 26 20 69 64 78 3c 3d 31 35 20 29 3b 0a 20   && idx<=15 );. 
2dad0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21   if( p->inTrans!
2dae0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
2daf0 20 20 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e      return pBt->
2db00 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54  readOnly ? SQLIT
2db10 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c  E_READONLY : SQL
2db20 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
2db30 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
2db40 61 67 65 31 21 3d 30 20 29 3b 0a 20 20 70 50 31  age1!=0 );.  pP1
2db50 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e   = pBt->pPage1->
2db60 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71  aData;.  rc = sq
2db70 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
2db80 28 70 50 31 29 3b 0a 20 20 69 66 28 20 72 63 20  (pP1);.  if( rc 
2db90 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70  ) return rc;.  p
2dba0 75 74 34 62 79 74 65 28 26 70 50 31 5b 33 36 20  ut4byte(&pP1[36 
2dbb0 2b 20 69 64 78 2a 34 5d 2c 20 69 4d 65 74 61 29  + idx*4], iMeta)
2dbc0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2dbd0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
2dbe0 65 74 75 72 6e 20 74 68 65 20 66 6c 61 67 20 62  eturn the flag b
2dbf0 79 74 65 20 61 74 20 74 68 65 20 62 65 67 69 6e  yte at the begin
2dc00 6e 69 6e 67 20 6f 66 20 74 68 65 20 70 61 67 65  ning of the page
2dc10 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
2dc20 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79  .** is currently
2dc30 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2f   pointing to..*/
2dc40 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2dc50 65 46 6c 61 67 73 28 42 74 43 75 72 73 6f 72 20  eFlags(BtCursor 
2dc60 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44  *pCur){.  /* TOD
2dc70 4f 3a 20 57 68 61 74 20 61 62 6f 75 74 20 43 55  O: What about CU
2dc80 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
2dc90 20 73 74 61 74 65 3f 20 50 72 6f 62 61 62 6c 79   state? Probably
2dca0 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 0a 20 20   need to call.  
2dcb0 2a 2a 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61  ** restoreOrClea
2dcc0 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
2dcd0 29 20 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 4d  ) here..  */.  M
2dce0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
2dcf0 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 72  pCur->pPage;.  r
2dd00 65 74 75 72 6e 20 70 50 61 67 65 20 3f 20 70 50  eturn pPage ? pP
2dd10 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
2dd20 2d 3e 68 64 72 4f 66 66 73 65 74 5d 20 3a 20 30  ->hdrOffset] : 0
2dd30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
2dd40 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50  TE_DEBUG./*.** P
2dd50 72 69 6e 74 20 61 20 64 69 73 61 73 73 65 6d 62  rint a disassemb
2dd60 6c 79 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  ly of the given 
2dd70 70 61 67 65 20 6f 6e 20 73 74 61 6e 64 61 72 64  page on standard
2dd80 20 6f 75 74 70 75 74 2e 20 20 54 68 69 73 20 72   output.  This r
2dd90 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 75 73 65  outine.** is use
2dda0 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  d for debugging 
2ddb0 61 6e 64 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79  and testing only
2ddc0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2ddd0 62 74 72 65 65 50 61 67 65 44 75 6d 70 28 42 74  btreePageDump(Bt
2dde0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74  Shared *pBt, int
2ddf0 20 70 67 6e 6f 2c 20 69 6e 74 20 72 65 63 75 72   pgno, int recur
2de00 73 69 76 65 2c 20 4d 65 6d 50 61 67 65 20 2a 70  sive, MemPage *p
2de10 50 61 72 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72  Parent){.  int r
2de20 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  c;.  MemPage *pP
2de30 61 67 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  age;.  int i, j,
2de40 20 63 3b 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b   c;.  int nFree;
2de50 0a 20 20 75 31 36 20 69 64 78 3b 0a 20 20 69 6e  .  u16 idx;.  in
2de60 74 20 68 64 72 3b 0a 20 20 69 6e 74 20 6e 43 65  t hdr;.  int nCe
2de70 6c 6c 3b 0a 20 20 69 6e 74 20 69 73 49 6e 69 74  ll;.  int isInit
2de80 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
2de90 72 20 2a 64 61 74 61 3b 0a 20 20 63 68 61 72 20  r *data;.  char 
2dea0 72 61 6e 67 65 5b 32 30 5d 3b 0a 20 20 75 6e 73  range[20];.  uns
2deb0 69 67 6e 65 64 20 63 68 61 72 20 70 61 79 6c 6f  igned char paylo
2dec0 61 64 5b 32 30 5d 3b 0a 0a 20 20 72 63 20 3d 20  ad[20];..  rc = 
2ded0 67 65 74 50 61 67 65 28 70 42 74 2c 20 28 50 67  getPage(pBt, (Pg
2dee0 6e 6f 29 70 67 6e 6f 2c 20 26 70 50 61 67 65 29  no)pgno, &pPage)
2def0 3b 0a 20 20 69 73 49 6e 69 74 20 3d 20 70 50 61  ;.  isInit = pPa
2df00 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 69 66  ge->isInit;.  if
2df10 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3d  ( pPage->isInit=
2df20 3d 30 20 29 7b 0a 20 20 20 20 69 6e 69 74 50 61  =0 ){.    initPa
2df30 67 65 28 70 50 61 67 65 2c 20 70 50 61 72 65 6e  ge(pPage, pParen
2df40 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  t);.  }.  if( rc
2df50 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
2df60 63 3b 0a 20 20 7d 0a 20 20 68 64 72 20 3d 20 70  c;.  }.  hdr = p
2df70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
2df80 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
2df90 3e 61 44 61 74 61 3b 0a 20 20 63 20 3d 20 64 61  >aData;.  c = da
2dfa0 74 61 5b 68 64 72 5d 3b 0a 20 20 70 50 61 67 65  ta[hdr];.  pPage
2dfb0 2d 3e 69 6e 74 4b 65 79 20 3d 20 28 63 20 26 20  ->intKey = (c & 
2dfc0 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f  (PTF_INTKEY|PTF_
2dfd0 4c 45 41 46 44 41 54 41 29 29 21 3d 30 3b 0a 20  LEAFDATA))!=0;. 
2dfe0 20 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61   pPage->zeroData
2dff0 20 3d 20 28 63 20 26 20 50 54 46 5f 5a 45 52 4f   = (c & PTF_ZERO
2e000 44 41 54 41 29 21 3d 30 3b 0a 20 20 70 50 61 67  DATA)!=0;.  pPag
2e010 65 2d 3e 6c 65 61 66 44 61 74 61 20 3d 20 28 63  e->leafData = (c
2e020 20 26 20 50 54 46 5f 4c 45 41 46 44 41 54 41 29   & PTF_LEAFDATA)
2e030 21 3d 30 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65  !=0;.  pPage->le
2e040 61 66 20 3d 20 28 63 20 26 20 50 54 46 5f 4c 45  af = (c & PTF_LE
2e050 41 46 29 21 3d 30 3b 0a 20 20 70 50 61 67 65 2d  AF)!=0;.  pPage-
2e060 3e 68 61 73 44 61 74 61 20 3d 20 21 28 70 50 61  >hasData = !(pPa
2e070 67 65 2d 3e 7a 65 72 6f 44 61 74 61 20 7c 7c 20  ge->zeroData || 
2e080 28 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 26 26  (!pPage->leaf &&
2e090 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61   pPage->leafData
2e0a0 29 29 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 67 65  ));.  nCell = ge
2e0b0 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
2e0c0 2b 33 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  +3]);.  sqlite3D
2e0d0 65 62 75 67 50 72 69 6e 74 66 28 22 50 41 47 45  ebugPrintf("PAGE
2e0e0 20 25 64 3a 20 20 66 6c 61 67 73 3d 30 78 25 30   %d:  flags=0x%0
2e0f0 32 78 20 20 66 72 61 67 3d 25 64 20 20 20 70 61  2x  frag=%d   pa
2e100 72 65 6e 74 3d 25 64 5c 6e 22 2c 20 70 67 6e 6f  rent=%d\n", pgno
2e110 2c 0a 20 20 20 20 64 61 74 61 5b 68 64 72 5d 2c  ,.    data[hdr],
2e120 20 64 61 74 61 5b 68 64 72 2b 37 5d 2c 20 0a 20   data[hdr+7], . 
2e130 20 20 20 28 70 50 61 67 65 2d 3e 69 73 49 6e 69     (pPage->isIni
2e140 74 20 26 26 20 70 50 61 67 65 2d 3e 70 50 61 72  t && pPage->pPar
2e150 65 6e 74 29 20 3f 20 70 50 61 67 65 2d 3e 70 50  ent) ? pPage->pP
2e160 61 72 65 6e 74 2d 3e 70 67 6e 6f 20 3a 20 30 29  arent->pgno : 0)
2e170 3b 0a 20 20 61 73 73 65 72 74 28 20 68 64 72 20  ;.  assert( hdr 
2e180 3d 3d 20 28 70 67 6e 6f 3d 3d 31 20 3f 20 31 30  == (pgno==1 ? 10
2e190 30 20 3a 20 30 29 20 29 3b 0a 20 20 69 64 78 20  0 : 0) );.  idx 
2e1a0 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 70 50 61  = hdr + 12 - pPa
2e1b0 67 65 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 66 6f  ge->leaf*4;.  fo
2e1c0 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
2e1d0 69 2b 2b 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e  i++){.    CellIn
2e1e0 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 50 67 6e  fo info;.    Pgn
2e1f0 6f 20 63 68 69 6c 64 3b 0a 20 20 20 20 75 6e 73  o child;.    uns
2e200 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
2e210 6c 3b 0a 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20  l;.    int sz;. 
2e220 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20     int addr;..  
2e230 20 20 61 64 64 72 20 3d 20 67 65 74 32 62 79 74    addr = get2byt
2e240 65 28 26 64 61 74 61 5b 69 64 78 20 2b 20 32 2a  e(&data[idx + 2*
2e250 69 5d 29 3b 0a 20 20 20 20 70 43 65 6c 6c 20 3d  i]);.    pCell =
2e260 20 26 64 61 74 61 5b 61 64 64 72 5d 3b 0a 20 20   &data[addr];.  
2e270 20 20 70 61 72 73 65 43 65 6c 6c 50 74 72 28 70    parseCellPtr(p
2e280 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
2e290 66 6f 29 3b 0a 20 20 20 20 73 7a 20 3d 20 69 6e  fo);.    sz = in
2e2a0 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 20 20 73 70  fo.nSize;.    sp
2e2b0 72 69 6e 74 66 28 72 61 6e 67 65 2c 22 25 64 2e  rintf(range,"%d.
2e2c0 2e 25 64 22 2c 20 61 64 64 72 2c 20 61 64 64 72  .%d", addr, addr
2e2d0 2b 73 7a 2d 31 29 3b 0a 20 20 20 20 69 66 28 20  +sz-1);.    if( 
2e2e0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2e2f0 20 20 20 20 20 63 68 69 6c 64 20 3d 20 30 3b 0a       child = 0;.
2e300 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e310 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74   child = get4byt
2e320 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 7d 0a  e(pCell);.    }.
2e330 20 20 20 20 73 7a 20 3d 20 69 6e 66 6f 2e 6e 44      sz = info.nD
2e340 61 74 61 3b 0a 20 20 20 20 69 66 28 20 21 70 50  ata;.    if( !pP
2e350 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 20 73 7a  age->intKey ) sz
2e360 20 2b 3d 20 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20   += info.nKey;. 
2e370 20 20 20 69 66 28 20 73 7a 3e 73 69 7a 65 6f 66     if( sz>sizeof
2e380 28 70 61 79 6c 6f 61 64 29 2d 31 20 29 20 73 7a  (payload)-1 ) sz
2e390 20 3d 20 73 69 7a 65 6f 66 28 70 61 79 6c 6f 61   = sizeof(payloa
2e3a0 64 29 2d 31 3b 0a 20 20 20 20 6d 65 6d 63 70 79  d)-1;.    memcpy
2e3b0 28 70 61 79 6c 6f 61 64 2c 20 26 70 43 65 6c 6c  (payload, &pCell
2e3c0 5b 69 6e 66 6f 2e 6e 48 65 61 64 65 72 5d 2c 20  [info.nHeader], 
2e3d0 73 7a 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  sz);.    for(j=0
2e3e0 3b 20 6a 3c 73 7a 3b 20 6a 2b 2b 29 7b 0a 20 20  ; j<sz; j++){.  
2e3f0 20 20 20 20 69 66 28 20 70 61 79 6c 6f 61 64 5b      if( payload[
2e400 6a 5d 3c 30 78 32 30 20 7c 7c 20 70 61 79 6c 6f  j]<0x20 || paylo
2e410 61 64 5b 6a 5d 3e 30 78 37 66 20 29 20 70 61 79  ad[j]>0x7f ) pay
2e420 6c 6f 61 64 5b 6a 5d 20 3d 20 27 2e 27 3b 0a 20  load[j] = '.';. 
2e430 20 20 20 7d 0a 20 20 20 20 70 61 79 6c 6f 61 64     }.    payload
2e440 5b 73 7a 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71  [sz] = 0;.    sq
2e450 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
2e460 28 0a 20 20 20 20 20 20 22 63 65 6c 6c 20 25 32  (.      "cell %2
2e470 64 3a 20 69 3d 25 2d 31 30 73 20 63 68 6c 64 3d  d: i=%-10s chld=
2e480 25 2d 34 64 20 6e 6b 3d 25 2d 34 6c 6c 64 20 6e  %-4d nk=%-4lld n
2e490 64 3d 25 2d 34 64 20 70 61 79 6c 6f 61 64 3d 25  d=%-4d payload=%
2e4a0 73 5c 6e 22 2c 0a 20 20 20 20 20 20 69 2c 20 72  s\n",.      i, r
2e4b0 61 6e 67 65 2c 20 63 68 69 6c 64 2c 20 69 6e 66  ange, child, inf
2e4c0 6f 2e 6e 4b 65 79 2c 20 69 6e 66 6f 2e 6e 44 61  o.nKey, info.nDa
2e4d0 74 61 2c 20 70 61 79 6c 6f 61 64 0a 20 20 20 20  ta, payload.    
2e4e0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50  );.  }.  if( !pP
2e4f0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2e500 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
2e510 6e 74 66 28 22 72 69 67 68 74 5f 63 68 69 6c 64  ntf("right_child
2e520 3a 20 25 64 5c 6e 22 2c 20 67 65 74 34 62 79 74  : %d\n", get4byt
2e530 65 28 26 64 61 74 61 5b 68 64 72 2b 38 5d 29 29  e(&data[hdr+8]))
2e540 3b 0a 20 20 7d 0a 20 20 6e 46 72 65 65 20 3d 20  ;.  }.  nFree = 
2e550 30 3b 0a 20 20 69 20 3d 20 30 3b 0a 20 20 69 64  0;.  i = 0;.  id
2e560 78 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  x = get2byte(&da
2e570 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 77 68  ta[hdr+1]);.  wh
2e580 69 6c 65 28 20 69 64 78 3e 30 20 26 26 20 69 64  ile( idx>0 && id
2e590 78 3c 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  x<pPage->pBt->us
2e5a0 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
2e5b0 69 6e 74 20 73 7a 20 3d 20 67 65 74 32 62 79 74  int sz = get2byt
2e5c0 65 28 26 64 61 74 61 5b 69 64 78 2b 32 5d 29 3b  e(&data[idx+2]);
2e5d0 0a 20 20 20 20 73 70 72 69 6e 74 66 28 72 61 6e  .    sprintf(ran
2e5e0 67 65 2c 22 25 64 2e 2e 25 64 22 2c 20 69 64 78  ge,"%d..%d", idx
2e5f0 2c 20 69 64 78 2b 73 7a 2d 31 29 3b 0a 20 20 20  , idx+sz-1);.   
2e600 20 6e 46 72 65 65 20 2b 3d 20 73 7a 3b 0a 20 20   nFree += sz;.  
2e610 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
2e620 69 6e 74 66 28 22 66 72 65 65 62 6c 6f 63 6b 20  intf("freeblock 
2e630 25 32 64 3a 20 69 3d 25 2d 31 30 73 20 73 69 7a  %2d: i=%-10s siz
2e640 65 3d 25 2d 34 64 20 74 6f 74 61 6c 3d 25 64 5c  e=%-4d total=%d\
2e650 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 20 72 61  n",.       i, ra
2e660 6e 67 65 2c 20 73 7a 2c 20 6e 46 72 65 65 29 3b  nge, sz, nFree);
2e670 0a 20 20 20 20 69 64 78 20 3d 20 67 65 74 32 62  .    idx = get2b
2e680 79 74 65 28 26 64 61 74 61 5b 69 64 78 5d 29 3b  yte(&data[idx]);
2e690 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20  .    i++;.  }.  
2e6a0 69 66 28 20 69 64 78 21 3d 30 20 29 7b 0a 20 20  if( idx!=0 ){.  
2e6b0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
2e6c0 69 6e 74 66 28 22 45 52 52 4f 52 3a 20 6e 65 78  intf("ERROR: nex
2e6d0 74 20 66 72 65 65 62 6c 6f 63 6b 20 69 6e 64 65  t freeblock inde
2e6e0 78 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 3a 20  x out of range: 
2e6f0 25 64 5c 6e 22 2c 20 69 64 78 29 3b 0a 20 20 7d  %d\n", idx);.  }
2e700 0a 20 20 69 66 28 20 72 65 63 75 72 73 69 76 65  .  if( recursive
2e710 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66   && !pPage->leaf
2e720 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
2e730 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
2e740 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63        unsigned c
2e750 68 61 72 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e  har *pCell = fin
2e760 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
2e770 0a 20 20 20 20 20 20 62 74 72 65 65 50 61 67 65  .      btreePage
2e780 44 75 6d 70 28 70 42 74 2c 20 67 65 74 34 62 79  Dump(pBt, get4by
2e790 74 65 28 70 43 65 6c 6c 29 2c 20 31 2c 20 70 50  te(pCell), 1, pP
2e7a0 61 67 65 29 3b 0a 20 20 20 20 20 20 69 64 78 20  age);.      idx 
2e7b0 3d 20 67 65 74 32 62 79 74 65 28 70 43 65 6c 6c  = get2byte(pCell
2e7c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 74 72  );.    }.    btr
2e7d0 65 65 50 61 67 65 44 75 6d 70 28 70 42 74 2c 20  eePageDump(pBt, 
2e7e0 67 65 74 34 62 79 74 65 28 26 64 61 74 61 5b 68  get4byte(&data[h
2e7f0 64 72 2b 38 5d 29 2c 20 31 2c 20 70 50 61 67 65  dr+8]), 1, pPage
2e800 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  );.  }.  pPage->
2e810 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 3b  isInit = isInit;
2e820 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  .  sqlite3pager_
2e830 75 6e 72 65 66 28 64 61 74 61 29 3b 0a 20 20 66  unref(data);.  f
2e840 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20  flush(stdout);. 
2e850 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2e860 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  K;.}.int sqlite3
2e870 42 74 72 65 65 50 61 67 65 44 75 6d 70 28 42 74  BtreePageDump(Bt
2e880 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 67 6e 6f  ree *p, int pgno
2e890 2c 20 69 6e 74 20 72 65 63 75 72 73 69 76 65 29  , int recursive)
2e8a0 7b 0a 20 20 72 65 74 75 72 6e 20 62 74 72 65 65  {.  return btree
2e8b0 50 61 67 65 44 75 6d 70 28 70 2d 3e 70 42 74 2c  PageDump(p->pBt,
2e8c0 20 70 67 6e 6f 2c 20 72 65 63 75 72 73 69 76 65   pgno, recursive
2e8d0 2c 20 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  , 0);.}.#endif..
2e8e0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
2e8f0 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
2e900 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
2e910 29 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 61 52 65  )./*.** Fill aRe
2e920 73 75 6c 74 5b 5d 20 77 69 74 68 20 69 6e 66 6f  sult[] with info
2e930 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
2e940 65 20 65 6e 74 72 79 20 61 6e 64 20 70 61 67 65  e entry and page
2e950 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 63 75 72   that the.** cur
2e960 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
2e970 74 6f 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 61 52 65  to..** .**   aRe
2e980 73 75 6c 74 5b 30 5d 20 3d 20 20 54 68 65 20 70  sult[0] =  The p
2e990 61 67 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20  age number.**   
2e9a0 61 52 65 73 75 6c 74 5b 31 5d 20 3d 20 20 54 68  aResult[1] =  Th
2e9b0 65 20 65 6e 74 72 79 20 6e 75 6d 62 65 72 0a 2a  e entry number.*
2e9c0 2a 20 20 20 61 52 65 73 75 6c 74 5b 32 5d 20 3d  *   aResult[2] =
2e9d0 20 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f    Total number o
2e9e0 66 20 65 6e 74 72 69 65 73 20 6f 6e 20 74 68 69  f entries on thi
2e9f0 73 20 70 61 67 65 0a 2a 2a 20 20 20 61 52 65 73  s page.**   aRes
2ea00 75 6c 74 5b 33 5d 20 3d 20 20 43 65 6c 6c 20 73  ult[3] =  Cell s
2ea10 69 7a 65 20 28 6c 6f 63 61 6c 20 70 61 79 6c 6f  ize (local paylo
2ea20 61 64 20 2b 20 68 65 61 64 65 72 29 0a 2a 2a 20  ad + header).** 
2ea30 20 20 61 52 65 73 75 6c 74 5b 34 5d 20 3d 20 20    aResult[4] =  
2ea40 4e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62  Number of free b
2ea50 79 74 65 73 20 6f 6e 20 74 68 69 73 20 70 61 67  ytes on this pag
2ea60 65 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 35  e.**   aResult[5
2ea70 5d 20 3d 20 20 4e 75 6d 62 65 72 20 6f 66 20 66  ] =  Number of f
2ea80 72 65 65 20 62 6c 6f 63 6b 73 20 6f 6e 20 74 68  ree blocks on th
2ea90 65 20 70 61 67 65 0a 2a 2a 20 20 20 61 52 65 73  e page.**   aRes
2eaa0 75 6c 74 5b 36 5d 20 3d 20 20 54 6f 74 61 6c 20  ult[6] =  Total 
2eab0 70 61 79 6c 6f 61 64 20 73 69 7a 65 20 28 6c 6f  payload size (lo
2eac0 63 61 6c 20 2b 20 6f 76 65 72 66 6c 6f 77 29 0a  cal + overflow).
2ead0 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 37 5d 20  **   aResult[7] 
2eae0 3d 20 20 48 65 61 64 65 72 20 73 69 7a 65 20 69  =  Header size i
2eaf0 6e 20 62 79 74 65 73 0a 2a 2a 20 20 20 61 52 65  n bytes.**   aRe
2eb00 73 75 6c 74 5b 38 5d 20 3d 20 20 4c 6f 63 61 6c  sult[8] =  Local
2eb10 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 0a 2a 2a   payload size.**
2eb20 20 20 20 61 52 65 73 75 6c 74 5b 39 5d 20 3d 20     aResult[9] = 
2eb30 20 50 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d   Parent page num
2eb40 62 65 72 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ber.**.** This r
2eb50 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
2eb60 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64  or testing and d
2eb70 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
2eb80 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
2eb90 65 65 43 75 72 73 6f 72 49 6e 66 6f 28 42 74 43  eeCursorInfo(BtC
2eba0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
2ebb0 20 2a 61 52 65 73 75 6c 74 2c 20 69 6e 74 20 75   *aResult, int u
2ebc0 70 43 6e 74 29 7b 0a 20 20 69 6e 74 20 63 6e 74  pCnt){.  int cnt
2ebd0 2c 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65  , idx;.  MemPage
2ebe0 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
2ebf0 70 50 61 67 65 3b 0a 20 20 42 74 43 75 72 73 6f  pPage;.  BtCurso
2ec00 72 20 74 6d 70 43 75 72 3b 0a 0a 20 20 69 6e 74  r tmpCur;..  int
2ec10 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43   rc = restoreOrC
2ec20 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
2ec30 6f 6e 28 70 43 75 72 2c 20 31 29 3b 0a 20 20 69  on(pCur, 1);.  i
2ec40 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2ec50 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
2ec60 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  c;.  }..  assert
2ec70 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
2ec80 29 3b 0a 20 20 67 65 74 54 65 6d 70 43 75 72 73  );.  getTempCurs
2ec90 6f 72 28 70 43 75 72 2c 20 26 74 6d 70 43 75 72  or(pCur, &tmpCur
2eca0 29 3b 0a 20 20 77 68 69 6c 65 28 20 75 70 43 6e  );.  while( upCn
2ecb0 74 2d 2d 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54  t-- ){.    moveT
2ecc0 6f 50 61 72 65 6e 74 28 26 74 6d 70 43 75 72 29  oParent(&tmpCur)
2ecd0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 20 3d 20  ;.  }.  pPage = 
2ece0 74 6d 70 43 75 72 2e 70 50 61 67 65 3b 0a 20 20  tmpCur.pPage;.  
2ecf0 61 52 65 73 75 6c 74 5b 30 5d 20 3d 20 73 71 6c  aResult[0] = sql
2ed00 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 6e 75  ite3pager_pagenu
2ed10 6d 62 65 72 28 70 50 61 67 65 2d 3e 61 44 61 74  mber(pPage->aDat
2ed20 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 52  a);.  assert( aR
2ed30 65 73 75 6c 74 5b 30 5d 3d 3d 70 50 61 67 65 2d  esult[0]==pPage-
2ed40 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 52 65 73 75  >pgno );.  aResu
2ed50 6c 74 5b 31 5d 20 3d 20 74 6d 70 43 75 72 2e 69  lt[1] = tmpCur.i
2ed60 64 78 3b 0a 20 20 61 52 65 73 75 6c 74 5b 32 5d  dx;.  aResult[2]
2ed70 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
2ed80 0a 20 20 69 66 28 20 74 6d 70 43 75 72 2e 69 64  .  if( tmpCur.id
2ed90 78 3e 3d 30 20 26 26 20 74 6d 70 43 75 72 2e 69  x>=0 && tmpCur.i
2eda0 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  dx<pPage->nCell 
2edb0 29 7b 0a 20 20 20 20 67 65 74 43 65 6c 6c 49 6e  ){.    getCellIn
2edc0 66 6f 28 26 74 6d 70 43 75 72 29 3b 0a 20 20 20  fo(&tmpCur);.   
2edd0 20 61 52 65 73 75 6c 74 5b 33 5d 20 3d 20 74 6d   aResult[3] = tm
2ede0 70 43 75 72 2e 69 6e 66 6f 2e 6e 53 69 7a 65 3b  pCur.info.nSize;
2edf0 0a 20 20 20 20 61 52 65 73 75 6c 74 5b 36 5d 20  .    aResult[6] 
2ee00 3d 20 74 6d 70 43 75 72 2e 69 6e 66 6f 2e 6e 44  = tmpCur.info.nD
2ee10 61 74 61 3b 0a 20 20 20 20 61 52 65 73 75 6c 74  ata;.    aResult
2ee20 5b 37 5d 20 3d 20 74 6d 70 43 75 72 2e 69 6e 66  [7] = tmpCur.inf
2ee30 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 20 20 61  o.nHeader;.    a
2ee40 52 65 73 75 6c 74 5b 38 5d 20 3d 20 74 6d 70 43  Result[8] = tmpC
2ee50 75 72 2e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a  ur.info.nLocal;.
2ee60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 52 65    }else{.    aRe
2ee70 73 75 6c 74 5b 33 5d 20 3d 20 30 3b 0a 20 20 20  sult[3] = 0;.   
2ee80 20 61 52 65 73 75 6c 74 5b 36 5d 20 3d 20 30 3b   aResult[6] = 0;
2ee90 0a 20 20 20 20 61 52 65 73 75 6c 74 5b 37 5d 20  .    aResult[7] 
2eea0 3d 20 30 3b 0a 20 20 20 20 61 52 65 73 75 6c 74  = 0;.    aResult
2eeb0 5b 38 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61  [8] = 0;.  }.  a
2eec0 52 65 73 75 6c 74 5b 34 5d 20 3d 20 70 50 61 67  Result[4] = pPag
2eed0 65 2d 3e 6e 46 72 65 65 3b 0a 20 20 63 6e 74 20  e->nFree;.  cnt 
2eee0 3d 20 30 3b 0a 20 20 69 64 78 20 3d 20 67 65 74  = 0;.  idx = get
2eef0 32 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  2byte(&pPage->aD
2ef00 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
2ef10 66 73 65 74 2b 31 5d 29 3b 0a 20 20 77 68 69 6c  fset+1]);.  whil
2ef20 65 28 20 69 64 78 3e 30 20 26 26 20 69 64 78 3c  e( idx>0 && idx<
2ef30 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
2ef40 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 63 6e  leSize ){.    cn
2ef50 74 2b 2b 3b 0a 20 20 20 20 69 64 78 20 3d 20 67  t++;.    idx = g
2ef60 65 74 32 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et2byte(&pPage->
2ef70 61 44 61 74 61 5b 69 64 78 5d 29 3b 0a 20 20 7d  aData[idx]);.  }
2ef80 0a 20 20 61 52 65 73 75 6c 74 5b 35 5d 20 3d 20  .  aResult[5] = 
2ef90 63 6e 74 3b 0a 20 20 69 66 28 20 70 50 61 67 65  cnt;.  if( pPage
2efa0 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20 7c 7c 20  ->pParent==0 || 
2efb0 69 73 52 6f 6f 74 50 61 67 65 28 70 50 61 67 65  isRootPage(pPage
2efc0 29 20 29 7b 0a 20 20 20 20 61 52 65 73 75 6c 74  ) ){.    aResult
2efd0 5b 39 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  [9] = 0;.  }else
2efe0 7b 0a 20 20 20 20 61 52 65 73 75 6c 74 5b 39 5d  {.    aResult[9]
2eff0 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e   = pPage->pParen
2f000 74 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72  t->pgno;.  }.  r
2f010 65 6c 65 61 73 65 54 65 6d 70 43 75 72 73 6f 72  eleaseTempCursor
2f020 28 26 74 6d 70 43 75 72 29 3b 0a 20 20 72 65 74  (&tmpCur);.  ret
2f030 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2f040 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
2f050 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 72 20  eturn the pager 
2f060 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2f070 61 20 42 54 72 65 65 2e 20 20 54 68 69 73 20 72  a BTree.  This r
2f080 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
2f090 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e  or.** testing an
2f0a0 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79  d debugging only
2f0b0 2e 0a 2a 2f 0a 50 61 67 65 72 20 2a 73 71 6c 69  ..*/.Pager *sqli
2f0c0 74 65 33 42 74 72 65 65 50 61 67 65 72 28 42 74  te3BtreePager(Bt
2f0d0 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  ree *p){.  retur
2f0e0 6e 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  n p->pBt->pPager
2f0f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2f100 73 74 72 75 63 74 75 72 65 20 69 73 20 70 61 73  structure is pas
2f110 73 65 64 20 61 72 6f 75 6e 64 20 74 68 72 6f 75  sed around throu
2f120 67 68 20 61 6c 6c 20 74 68 65 20 73 61 6e 69 74  gh all the sanit
2f130 79 20 63 68 65 63 6b 69 6e 67 20 72 6f 75 74 69  y checking routi
2f140 6e 65 73 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  nes.** in order 
2f150 74 6f 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66  to keep track of
2f160 20 73 6f 6d 65 20 67 6c 6f 62 61 6c 20 73 74 61   some global sta
2f170 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  te information..
2f180 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
2f190 74 20 49 6e 74 65 67 72 69 74 79 43 6b 20 49 6e  t IntegrityCk In
2f1a0 74 65 67 72 69 74 79 43 6b 3b 0a 73 74 72 75 63  tegrityCk;.struc
2f1b0 74 20 49 6e 74 65 67 72 69 74 79 43 6b 20 7b 0a  t IntegrityCk {.
2f1c0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
2f1d0 20 20 20 20 2f 2a 20 54 68 65 20 74 72 65 65 20      /* The tree 
2f1e0 62 65 69 6e 67 20 63 68 65 63 6b 65 64 20 6f 75  being checked ou
2f1f0 74 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 70 50  t */.  Pager *pP
2f200 61 67 65 72 3b 20 2f 2a 20 54 68 65 20 61 73 73  ager; /* The ass
2f210 6f 63 69 61 74 65 64 20 70 61 67 65 72 2e 20 20  ociated pager.  
2f220 41 6c 73 6f 20 61 63 63 65 73 73 69 62 6c 65 20  Also accessible 
2f230 62 79 20 70 42 74 2d 3e 70 50 61 67 65 72 20 2a  by pBt->pPager *
2f240 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20  /.  int nPage;  
2f250 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2f260 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
2f270 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  abase */.  int *
2f280 61 6e 52 65 66 3b 20 20 20 20 2f 2a 20 4e 75 6d  anRef;    /* Num
2f290 62 65 72 20 6f 66 20 74 69 6d 65 73 20 65 61 63  ber of times eac
2f2a0 68 20 70 61 67 65 20 69 73 20 72 65 66 65 72 65  h page is refere
2f2b0 6e 63 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  nced */.  char *
2f2c0 7a 45 72 72 4d 73 67 3b 20 2f 2a 20 41 6e 20 65  zErrMsg; /* An e
2f2d0 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 20 4e  rror message.  N
2f2e0 55 4c 4c 20 6f 66 20 6e 6f 20 65 72 72 6f 72 73  ULL of no errors
2f2f0 20 73 65 65 6e 2e 20 2a 2f 0a 7d 3b 0a 0a 23 69   seen. */.};..#i
2f300 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2f310 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
2f320 4b 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  K./*.** Append a
2f330 20 6d 65 73 73 61 67 65 20 74 6f 20 74 68 65 20   message to the 
2f340 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74  error message st
2f350 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ring..*/.static 
2f360 76 6f 69 64 20 63 68 65 63 6b 41 70 70 65 6e 64  void checkAppend
2f370 4d 73 67 28 0a 20 20 49 6e 74 65 67 72 69 74 79  Msg(.  Integrity
2f380 43 6b 20 2a 70 43 68 65 63 6b 2c 0a 20 20 63 68  Ck *pCheck,.  ch
2f390 61 72 20 2a 7a 4d 73 67 31 2c 0a 20 20 63 6f 6e  ar *zMsg1,.  con
2f3a0 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
2f3b0 2c 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20 76 61 5f  ,.  ....){.  va_
2f3c0 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20  list ap;.  char 
2f3d0 2a 7a 4d 73 67 32 3b 0a 20 20 76 61 5f 73 74 61  *zMsg2;.  va_sta
2f3e0 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
2f3f0 0a 20 20 7a 4d 73 67 32 20 3d 20 73 71 6c 69 74  .  zMsg2 = sqlit
2f400 65 33 56 4d 50 72 69 6e 74 66 28 7a 46 6f 72 6d  e3VMPrintf(zForm
2f410 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e  at, ap);.  va_en
2f420 64 28 61 70 29 3b 0a 20 20 69 66 28 20 7a 4d 73  d(ap);.  if( zMs
2f430 67 31 3d 3d 30 20 29 20 7a 4d 73 67 31 20 3d 20  g1==0 ) zMsg1 = 
2f440 22 22 3b 0a 20 20 69 66 28 20 70 43 68 65 63 6b  "";.  if( pCheck
2f450 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ->zErrMsg ){.   
2f460 20 63 68 61 72 20 2a 7a 4f 6c 64 20 3d 20 70 43   char *zOld = pC
2f470 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 3b 0a 20  heck->zErrMsg;. 
2f480 20 20 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d     pCheck->zErrM
2f490 73 67 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  sg = 0;.    sqli
2f4a0 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 43  te3SetString(&pC
2f4b0 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 2c 20 7a  heck->zErrMsg, z
2f4c0 4f 6c 64 2c 20 22 5c 6e 22 2c 20 7a 4d 73 67 31  Old, "\n", zMsg1
2f4d0 2c 20 7a 4d 73 67 32 2c 20 28 63 68 61 72 2a 29  , zMsg2, (char*)
2f4e0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  0);.    sqliteFr
2f4f0 65 65 28 7a 4f 6c 64 29 3b 0a 20 20 7d 65 6c 73  ee(zOld);.  }els
2f500 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  e{.    sqlite3Se
2f510 74 53 74 72 69 6e 67 28 26 70 43 68 65 63 6b 2d  tString(&pCheck-
2f520 3e 7a 45 72 72 4d 73 67 2c 20 7a 4d 73 67 31 2c  >zErrMsg, zMsg1,
2f530 20 7a 4d 73 67 32 2c 20 28 63 68 61 72 2a 29 30   zMsg2, (char*)0
2f540 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46  );.  }.  sqliteF
2f550 72 65 65 28 7a 4d 73 67 32 29 3b 0a 7d 0a 23 65  ree(zMsg2);.}.#e
2f560 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
2f570 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48  MIT_INTEGRITY_CH
2f580 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ECK */..#ifndef 
2f590 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45  SQLITE_OMIT_INTE
2f5a0 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a  GRITY_CHECK./*.*
2f5b0 2a 20 41 64 64 20 31 20 74 6f 20 74 68 65 20 72  * Add 1 to the r
2f5c0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
2f5d0 6f 72 20 70 61 67 65 20 69 50 61 67 65 2e 20 20  or page iPage.  
2f5e0 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 73  If this is the s
2f5f0 65 63 6f 6e 64 0a 2a 2a 20 72 65 66 65 72 65 6e  econd.** referen
2f600 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 2c 20  ce to the page, 
2f610 61 64 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  add an error mes
2f620 73 61 67 65 20 74 6f 20 70 43 68 65 63 6b 2d 3e  sage to pCheck->
2f630 7a 45 72 72 4d 73 67 2e 0a 2a 2a 20 52 65 74 75  zErrMsg..** Retu
2f640 72 6e 20 31 20 69 66 20 74 68 65 72 65 20 61 72  rn 1 if there ar
2f650 65 20 32 20 6f 72 65 20 6d 6f 72 65 20 72 65 66  e 2 ore more ref
2f660 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
2f670 61 67 65 20 61 6e 64 20 30 20 69 66 0a 2a 2a 20  age and 0 if.** 
2f680 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
2f690 69 72 73 74 20 72 65 66 65 72 65 6e 63 65 20 74  irst reference t
2f6a0 6f 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a  o the page..**.*
2f6b0 2a 20 41 6c 73 6f 20 63 68 65 63 6b 20 74 68 61  * Also check tha
2f6c0 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  t the page numbe
2f6d0 72 20 69 73 20 69 6e 20 62 6f 75 6e 64 73 2e 0a  r is in bounds..
2f6e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68  */.static int ch
2f6f0 65 63 6b 52 65 66 28 49 6e 74 65 67 72 69 74 79  eckRef(Integrity
2f700 43 6b 20 2a 70 43 68 65 63 6b 2c 20 69 6e 74 20  Ck *pCheck, int 
2f710 69 50 61 67 65 2c 20 63 68 61 72 20 2a 7a 43 6f  iPage, char *zCo
2f720 6e 74 65 78 74 29 7b 0a 20 20 69 66 28 20 69 50  ntext){.  if( iP
2f730 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  age==0 ) return 
2f740 31 3b 0a 20 20 69 66 28 20 69 50 61 67 65 3e 70  1;.  if( iPage>p
2f750 43 68 65 63 6b 2d 3e 6e 50 61 67 65 20 7c 7c 20  Check->nPage || 
2f760 69 50 61 67 65 3c 30 20 29 7b 0a 20 20 20 20 63  iPage<0 ){.    c
2f770 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
2f780 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20  heck, zContext, 
2f790 22 69 6e 76 61 6c 69 64 20 70 61 67 65 20 6e 75  "invalid page nu
2f7a0 6d 62 65 72 20 25 64 22 2c 20 69 50 61 67 65 29  mber %d", iPage)
2f7b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
2f7c0 20 20 7d 0a 20 20 69 66 28 20 70 43 68 65 63 6b    }.  if( pCheck
2f7d0 2d 3e 61 6e 52 65 66 5b 69 50 61 67 65 5d 3d 3d  ->anRef[iPage]==
2f7e0 31 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70  1 ){.    checkAp
2f7f0 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
2f800 7a 43 6f 6e 74 65 78 74 2c 20 22 32 6e 64 20 72  zContext, "2nd r
2f810 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
2f820 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20   %d", iPage);.  
2f830 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
2f840 20 20 72 65 74 75 72 6e 20 20 28 70 43 68 65 63    return  (pChec
2f850 6b 2d 3e 61 6e 52 65 66 5b 69 50 61 67 65 5d 2b  k->anRef[iPage]+
2f860 2b 29 3e 31 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  +)>1;.}..#ifndef
2f870 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2f880 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 43 68  OVACUUM./*.** Ch
2f890 65 63 6b 20 74 68 61 74 20 74 68 65 20 65 6e 74  eck that the ent
2f8a0 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65  ry in the pointe
2f8b0 72 2d 6d 61 70 20 66 6f 72 20 70 61 67 65 20 69  r-map for page i
2f8c0 43 68 69 6c 64 20 6d 61 70 73 20 74 6f 20 0a 2a  Child maps to .*
2f8d0 2a 20 70 61 67 65 20 69 50 61 72 65 6e 74 2c 20  * page iParent, 
2f8e0 70 6f 69 6e 74 65 72 20 74 79 70 65 20 70 74 72  pointer type ptr
2f8f0 54 79 70 65 2e 20 49 66 20 6e 6f 74 2c 20 61 70  Type. If not, ap
2f900 70 65 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65  pend an error me
2f910 73 73 61 67 65 0a 2a 2a 20 74 6f 20 70 43 68 65  ssage.** to pChe
2f920 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ck..*/.static vo
2f930 69 64 20 63 68 65 63 6b 50 74 72 6d 61 70 28 0a  id checkPtrmap(.
2f940 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70    IntegrityCk *p
2f950 43 68 65 63 6b 2c 20 20 20 2f 2a 20 49 6e 74 65  Check,   /* Inte
2f960 67 72 69 74 79 20 63 68 65 63 6b 20 63 6f 6e 74  grity check cont
2f970 65 78 74 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43  ext */.  Pgno iC
2f980 68 69 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20  hild,           
2f990 2f 2a 20 43 68 69 6c 64 20 70 61 67 65 20 6e 75  /* Child page nu
2f9a0 6d 62 65 72 20 2a 2f 0a 20 20 75 38 20 65 54 79  mber */.  u8 eTy
2f9b0 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
2f9c0 20 2f 2a 20 45 78 70 65 63 74 65 64 20 70 6f 69   /* Expected poi
2f9d0 6e 74 65 72 20 6d 61 70 20 74 79 70 65 20 2a 2f  nter map type */
2f9e0 0a 20 20 50 67 6e 6f 20 69 50 61 72 65 6e 74 2c  .  Pgno iParent,
2f9f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
2fa00 65 63 74 65 64 20 70 6f 69 6e 74 65 72 20 6d 61  ected pointer ma
2fa10 70 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75  p parent page nu
2fa20 6d 62 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a  mber */.  char *
2fa30 7a 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20  zContext        
2fa40 20 2f 2a 20 43 6f 6e 74 65 78 74 20 64 65 73 63   /* Context desc
2fa50 72 69 70 74 69 6f 6e 20 28 75 73 65 64 20 66 6f  ription (used fo
2fa60 72 20 65 72 72 6f 72 20 6d 73 67 29 20 2a 2f 0a  r error msg) */.
2fa70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  ){.  int rc;.  u
2fa80 38 20 65 50 74 72 6d 61 70 54 79 70 65 3b 0a 20  8 ePtrmapType;. 
2fa90 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 50 61 72   Pgno iPtrmapPar
2faa0 65 6e 74 3b 0a 0a 20 20 72 63 20 3d 20 70 74 72  ent;..  rc = ptr
2fab0 6d 61 70 47 65 74 28 70 43 68 65 63 6b 2d 3e 70  mapGet(pCheck->p
2fac0 42 74 2c 20 69 43 68 69 6c 64 2c 20 26 65 50 74  Bt, iChild, &ePt
2fad0 72 6d 61 70 54 79 70 65 2c 20 26 69 50 74 72 6d  rmapType, &iPtrm
2fae0 61 70 50 61 72 65 6e 74 29 3b 0a 20 20 69 66 28  apParent);.  if(
2faf0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2fb00 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e  {.    checkAppen
2fb10 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
2fb20 6e 74 65 78 74 2c 20 22 46 61 69 6c 65 64 20 74  ntext, "Failed t
2fb30 6f 20 72 65 61 64 20 70 74 72 6d 61 70 20 6b 65  o read ptrmap ke
2fb40 79 3d 25 64 22 2c 20 69 43 68 69 6c 64 29 3b 0a  y=%d", iChild);.
2fb50 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
2fb60 0a 20 20 69 66 28 20 65 50 74 72 6d 61 70 54 79  .  if( ePtrmapTy
2fb70 70 65 21 3d 65 54 79 70 65 20 7c 7c 20 69 50 74  pe!=eType || iPt
2fb80 72 6d 61 70 50 61 72 65 6e 74 21 3d 69 50 61 72  rmapParent!=iPar
2fb90 65 6e 74 20 29 7b 0a 20 20 20 20 63 68 65 63 6b  ent ){.    check
2fba0 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
2fbb0 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20  , zContext, .   
2fbc0 20 20 20 22 42 61 64 20 70 74 72 20 6d 61 70 20     "Bad ptr map 
2fbd0 65 6e 74 72 79 20 6b 65 79 3d 25 64 20 65 78 70  entry key=%d exp
2fbe0 65 63 74 65 64 3d 28 25 64 2c 25 64 29 20 67 6f  ected=(%d,%d) go
2fbf0 74 3d 28 25 64 2c 25 64 29 22 2c 20 0a 20 20 20  t=(%d,%d)", .   
2fc00 20 20 20 69 43 68 69 6c 64 2c 20 65 54 79 70 65     iChild, eType
2fc10 2c 20 69 50 61 72 65 6e 74 2c 20 65 50 74 72 6d  , iParent, ePtrm
2fc20 61 70 54 79 70 65 2c 20 69 50 74 72 6d 61 70 50  apType, iPtrmapP
2fc30 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65  arent);.  }.}.#e
2fc40 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  ndif../*.** Chec
2fc50 6b 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20  k the integrity 
2fc60 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  of the freelist 
2fc70 6f 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f  or of an overflo
2fc80 77 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2a 20  w page list..** 
2fc90 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
2fca0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
2fcb0 6f 6e 20 74 68 65 20 6c 69 73 74 20 69 73 20 4e  on the list is N
2fcc0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2fcd0 20 63 68 65 63 6b 4c 69 73 74 28 0a 20 20 49 6e   checkList(.  In
2fce0 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63  tegrityCk *pChec
2fcf0 6b 2c 20 20 2f 2a 20 49 6e 74 65 67 72 69 74 79  k,  /* Integrity
2fd00 20 63 68 65 63 6b 69 6e 67 20 63 6f 6e 74 65 78   checking contex
2fd10 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 46 72 65  t */.  int isFre
2fd20 65 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20  eList,       /* 
2fd30 54 72 75 65 20 66 6f 72 20 61 20 66 72 65 65 6c  True for a freel
2fd40 69 73 74 2e 20 20 46 61 6c 73 65 20 66 6f 72 20  ist.  False for 
2fd50 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6c 69  overflow page li
2fd60 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 67  st */.  int iPag
2fd70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
2fd80 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   Page number for
2fd90 20 66 69 72 73 74 20 70 61 67 65 20 69 6e 20 74   first page in t
2fda0 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  he list */.  int
2fdb0 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   N,             
2fdc0 20 20 20 2f 2a 20 45 78 70 65 63 74 65 64 20 6e     /* Expected n
2fdd0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
2fde0 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20  n the list */.  
2fdf0 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74 20 20  char *zContext  
2fe00 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74        /* Context
2fe10 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61   for error messa
2fe20 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ges */.){.  int 
2fe30 69 3b 0a 20 20 69 6e 74 20 65 78 70 65 63 74 65  i;.  int expecte
2fe40 64 20 3d 20 4e 3b 0a 20 20 69 6e 74 20 69 46 69  d = N;.  int iFi
2fe50 72 73 74 20 3d 20 69 50 61 67 65 3b 0a 20 20 77  rst = iPage;.  w
2fe60 68 69 6c 65 28 20 4e 2d 2d 20 3e 20 30 20 29 7b  hile( N-- > 0 ){
2fe70 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
2fe80 61 72 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20 69  ar *pOvfl;.    i
2fe90 66 28 20 69 50 61 67 65 3c 31 20 29 7b 0a 20 20  f( iPage<1 ){.  
2fea0 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
2feb0 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74  sg(pCheck, zCont
2fec0 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20 22 25  ext,.         "%
2fed0 64 20 6f 66 20 25 64 20 70 61 67 65 73 20 6d 69  d of %d pages mi
2fee0 73 73 69 6e 67 20 66 72 6f 6d 20 6f 76 65 72 66  ssing from overf
2fef0 6c 6f 77 20 6c 69 73 74 20 73 74 61 72 74 69 6e  low list startin
2ff00 67 20 61 74 20 25 64 22 2c 0a 20 20 20 20 20 20  g at %d",.      
2ff10 20 20 20 20 4e 2b 31 2c 20 65 78 70 65 63 74 65      N+1, expecte
2ff20 64 2c 20 69 46 69 72 73 74 29 3b 0a 20 20 20 20  d, iFirst);.    
2ff30 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
2ff40 20 20 20 69 66 28 20 63 68 65 63 6b 52 65 66 28     if( checkRef(
2ff50 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c 20 7a  pCheck, iPage, z
2ff60 43 6f 6e 74 65 78 74 29 20 29 20 62 72 65 61 6b  Context) ) break
2ff70 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
2ff80 33 70 61 67 65 72 5f 67 65 74 28 70 43 68 65 63  3pager_get(pChec
2ff90 6b 2d 3e 70 50 61 67 65 72 2c 20 28 50 67 6e 6f  k->pPager, (Pgno
2ffa0 29 69 50 61 67 65 2c 20 28 76 6f 69 64 2a 2a 29  )iPage, (void**)
2ffb0 26 70 4f 76 66 6c 29 20 29 7b 0a 20 20 20 20 20  &pOvfl) ){.     
2ffc0 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
2ffd0 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
2ffe0 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 67 65 74  , "failed to get
2fff0 20 70 61 67 65 20 25 64 22 2c 20 69 50 61 67 65   page %d", iPage
30000 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
30010 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73      }.    if( is
30020 46 72 65 65 4c 69 73 74 20 29 7b 0a 20 20 20 20  FreeList ){.    
30030 20 20 69 6e 74 20 6e 20 3d 20 67 65 74 34 62 79    int n = get4by
30040 74 65 28 26 70 4f 76 66 6c 5b 34 5d 29 3b 0a 23  te(&pOvfl[4]);.#
30050 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
30060 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
30070 20 20 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e      if( pCheck->
30080 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
30090 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  ){.        check
300a0 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 69  Ptrmap(pCheck, i
300b0 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45  Page, PTRMAP_FRE
300c0 45 50 41 47 45 2c 20 30 2c 20 7a 43 6f 6e 74 65  EPAGE, 0, zConte
300d0 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  xt);.      }.#en
300e0 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 6e 3e  dif.      if( n>
300f0 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 75 73 61  pCheck->pBt->usa
30100 62 6c 65 53 69 7a 65 2f 34 2d 38 20 29 7b 0a 20  bleSize/4-8 ){. 
30110 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65         checkAppe
30120 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
30130 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20 20  ontext,.        
30140 20 20 20 22 66 72 65 65 6c 69 73 74 20 6c 65 61     "freelist lea
30150 66 20 63 6f 75 6e 74 20 74 6f 6f 20 62 69 67 20  f count too big 
30160 6f 6e 20 70 61 67 65 20 25 64 22 2c 20 69 50 61  on page %d", iPa
30170 67 65 29 3b 0a 20 20 20 20 20 20 20 20 4e 2d 2d  ge);.        N--
30180 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
30190 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
301a0 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<n; i++){.     
301b0 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50       Pgno iFreeP
301c0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
301d0 70 4f 76 66 6c 5b 38 2b 69 2a 34 5d 29 3b 0a 23  pOvfl[8+i*4]);.#
301e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
301f0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
30200 20 20 20 20 20 20 20 20 69 66 28 20 70 43 68 65          if( pChe
30210 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63  ck->pBt->autoVac
30220 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  uum ){.         
30230 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70     checkPtrmap(p
30240 43 68 65 63 6b 2c 20 69 46 72 65 65 50 61 67 65  Check, iFreePage
30250 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  , PTRMAP_FREEPAG
30260 45 2c 20 30 2c 20 7a 43 6f 6e 74 65 78 74 29 3b  E, 0, zContext);
30270 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  .          }.#en
30280 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 63 68  dif.          ch
30290 65 63 6b 52 65 66 28 70 43 68 65 63 6b 2c 20 69  eckRef(pCheck, i
302a0 46 72 65 65 50 61 67 65 2c 20 7a 43 6f 6e 74 65  FreePage, zConte
302b0 78 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  xt);.        }. 
302c0 20 20 20 20 20 20 20 4e 20 2d 3d 20 6e 3b 0a 20         N -= n;. 
302d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66       }.    }.#if
302e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
302f0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
30300 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49  else{.      /* I
30310 66 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  f this database 
30320 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61  supports auto-va
30330 63 75 75 6d 20 61 6e 64 20 69 50 61 67 65 20 69  cuum and iPage i
30340 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a 20  s not the last. 
30350 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20       ** page in 
30360 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 6c 69  this overflow li
30370 73 74 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74  st, check that t
30380 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
30390 6e 74 72 79 20 66 6f 72 0a 20 20 20 20 20 20 2a  ntry for.      *
303a0 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
303b0 70 61 67 65 20 6d 61 74 63 68 65 73 20 69 50 61  page matches iPa
303c0 67 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ge..      */.   
303d0 20 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 70     if( pCheck->p
303e0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26  Bt->autoVacuum &
303f0 26 20 4e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  & N>0 ){.       
30400 20 69 20 3d 20 67 65 74 34 62 79 74 65 28 70 4f   i = get4byte(pO
30410 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 63 68  vfl);.        ch
30420 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b  eckPtrmap(pCheck
30430 2c 20 69 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  , i, PTRMAP_OVER
30440 46 4c 4f 57 32 2c 20 69 50 61 67 65 2c 20 7a 43  FLOW2, iPage, zC
30450 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d  ontext);.      }
30460 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
30470 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79    iPage = get4by
30480 74 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 73  te(pOvfl);.    s
30490 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
304a0 66 28 70 4f 76 66 6c 29 3b 0a 20 20 7d 0a 7d 0a  f(pOvfl);.  }.}.
304b0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
304c0 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f  _OMIT_INTEGRITY_
304d0 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65  CHECK */..#ifnde
304e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
304f0 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a  TEGRITY_CHECK./*
30500 0a 2a 2a 20 44 6f 20 76 61 72 69 6f 75 73 20 73  .** Do various s
30510 61 6e 69 74 79 20 63 68 65 63 6b 73 20 6f 6e 20  anity checks on 
30520 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 6f 66  a single page of
30530 20 61 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e   a tree.  Return
30540 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 64 65 70  .** the tree dep
30550 74 68 2e 20 20 52 6f 6f 74 20 70 61 67 65 73 20  th.  Root pages 
30560 72 65 74 75 72 6e 20 30 2e 20 20 50 61 72 65 6e  return 0.  Paren
30570 74 73 20 6f 66 20 72 6f 6f 74 20 70 61 67 65 73  ts of root pages
30580 0a 2a 2a 20 72 65 74 75 72 6e 20 31 2c 20 61 6e  .** return 1, an
30590 64 20 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a 20 0a  d so forth..** .
305a0 2a 2a 20 54 68 65 73 65 20 63 68 65 63 6b 73 20  ** These checks 
305b0 61 72 65 20 64 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20  are done:.**.** 
305c0 20 20 20 20 20 31 2e 20 20 4d 61 6b 65 20 73 75       1.  Make su
305d0 72 65 20 74 68 61 74 20 63 65 6c 6c 73 20 61 6e  re that cells an
305e0 64 20 66 72 65 65 62 6c 6f 63 6b 73 20 64 6f 20  d freeblocks do 
305f0 6e 6f 74 20 6f 76 65 72 6c 61 70 0a 2a 2a 20 20  not overlap.**  
30600 20 20 20 20 20 20 20 20 62 75 74 20 63 6f 6d 62          but comb
30610 69 6e 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c  ine to completel
30620 79 20 63 6f 76 65 72 20 74 68 65 20 70 61 67 65  y cover the page
30630 2e 0a 2a 2a 20 20 4e 4f 20 20 32 2e 20 20 4d 61  ..**  NO  2.  Ma
30640 6b 65 20 73 75 72 65 20 63 65 6c 6c 20 6b 65 79  ke sure cell key
30650 73 20 61 72 65 20 69 6e 20 6f 72 64 65 72 2e 0a  s are in order..
30660 2a 2a 20 20 4e 4f 20 20 33 2e 20 20 4d 61 6b 65  **  NO  3.  Make
30670 20 73 75 72 65 20 6e 6f 20 6b 65 79 20 69 73 20   sure no key is 
30680 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
30690 61 6c 20 74 6f 20 7a 4c 6f 77 65 72 42 6f 75 6e  al to zLowerBoun
306a0 64 2e 0a 2a 2a 20 20 4e 4f 20 20 34 2e 20 20 4d  d..**  NO  4.  M
306b0 61 6b 65 20 73 75 72 65 20 6e 6f 20 6b 65 79 20  ake sure no key 
306c0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
306d0 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 55 70 70  or equal to zUpp
306e0 65 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20 20 20 20  erBound..**     
306f0 20 35 2e 20 20 43 68 65 63 6b 20 74 68 65 20 69   5.  Check the i
30700 6e 74 65 67 72 69 74 79 20 6f 66 20 6f 76 65 72  ntegrity of over
30710 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 20 20  flow pages..**  
30720 20 20 20 20 36 2e 20 20 52 65 63 75 72 73 69 76      6.  Recursiv
30730 65 6c 79 20 63 61 6c 6c 20 63 68 65 63 6b 54 72  ely call checkTr
30740 65 65 50 61 67 65 20 6f 6e 20 61 6c 6c 20 63 68  eePage on all ch
30750 69 6c 64 72 65 6e 2e 0a 2a 2a 20 20 20 20 20 20  ildren..**      
30760 37 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20  7.  Verify that 
30770 74 68 65 20 64 65 70 74 68 20 6f 66 20 61 6c 6c  the depth of all
30780 20 63 68 69 6c 64 72 65 6e 20 69 73 20 74 68 65   children is the
30790 20 73 61 6d 65 2e 0a 2a 2a 20 20 20 20 20 20 38   same..**      8
307a0 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 69  .  Make sure thi
307b0 73 20 70 61 67 65 20 69 73 20 61 74 20 6c 65 61  s page is at lea
307c0 73 74 20 33 33 25 20 66 75 6c 6c 20 6f 72 20 65  st 33% full or e
307d0 6c 73 65 20 69 74 20 69 73 0a 2a 2a 20 20 20 20  lse it is.**    
307e0 20 20 20 20 20 20 74 68 65 20 72 6f 6f 74 20 6f        the root o
307f0 66 20 74 68 65 20 74 72 65 65 2e 0a 2a 2f 0a 73  f the tree..*/.s
30800 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 54  tatic int checkT
30810 72 65 65 50 61 67 65 28 0a 20 20 49 6e 74 65 67  reePage(.  Integ
30820 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20  rityCk *pCheck, 
30830 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72 20   /* Context for 
30840 74 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b  the sanity check
30850 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 67 65 2c   */.  int iPage,
30860 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
30870 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
30880 65 20 70 61 67 65 20 74 6f 20 63 68 65 63 6b 20  e page to check 
30890 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  */.  MemPage *pP
308a0 61 72 65 6e 74 2c 20 20 20 20 20 2f 2a 20 50 61  arent,     /* Pa
308b0 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 63  rent page */.  c
308c0 68 61 72 20 2a 7a 50 61 72 65 6e 74 43 6f 6e 74  har *zParentCont
308d0 65 78 74 20 20 2f 2a 20 50 61 72 65 6e 74 20 63  ext  /* Parent c
308e0 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 4d  ontext */.){.  M
308f0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
30900 20 69 6e 74 20 69 2c 20 72 63 2c 20 64 65 70 74   int i, rc, dept
30910 68 2c 20 64 32 2c 20 70 67 6e 6f 2c 20 63 6e 74  h, d2, pgno, cnt
30920 3b 0a 20 20 69 6e 74 20 68 64 72 2c 20 63 65 6c  ;.  int hdr, cel
30930 6c 53 74 61 72 74 3b 0a 20 20 69 6e 74 20 6e 43  lStart;.  int nC
30940 65 6c 6c 3b 0a 20 20 75 38 20 2a 64 61 74 61 3b  ell;.  u8 *data;
30950 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
30960 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  ;.  int usableSi
30970 7a 65 3b 0a 20 20 63 68 61 72 20 7a 43 6f 6e 74  ze;.  char zCont
30980 65 78 74 5b 31 30 30 5d 3b 0a 20 20 63 68 61 72  ext[100];.  char
30990 20 2a 68 69 74 3b 0a 0a 20 20 73 70 72 69 6e 74   *hit;..  sprint
309a0 66 28 7a 43 6f 6e 74 65 78 74 2c 20 22 50 61 67  f(zContext, "Pag
309b0 65 20 25 64 3a 20 22 2c 20 69 50 61 67 65 29 3b  e %d: ", iPage);
309c0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
309d0 74 20 74 68 65 20 70 61 67 65 20 65 78 69 73 74  t the page exist
309e0 73 0a 20 20 2a 2f 0a 20 20 70 42 74 20 3d 20 70  s.  */.  pBt = p
309f0 43 68 65 63 6b 2d 3e 70 42 74 3b 0a 20 20 75 73  Check->pBt;.  us
30a00 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
30a10 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69 66  usableSize;.  if
30a20 28 20 69 50 61 67 65 3d 3d 30 20 29 20 72 65 74  ( iPage==0 ) ret
30a30 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 63 68 65  urn 0;.  if( che
30a40 63 6b 52 65 66 28 70 43 68 65 63 6b 2c 20 69 50  ckRef(pCheck, iP
30a50 61 67 65 2c 20 7a 50 61 72 65 6e 74 43 6f 6e 74  age, zParentCont
30a60 65 78 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ext) ) return 0;
30a70 0a 20 20 69 66 28 20 28 72 63 20 3d 20 67 65 74  .  if( (rc = get
30a80 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29  Page(pBt, (Pgno)
30a90 69 50 61 67 65 2c 20 26 70 50 61 67 65 29 29 21  iPage, &pPage))!
30aa0 3d 30 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41  =0 ){.    checkA
30ab0 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
30ac0 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20   zContext,.     
30ad0 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 67 65 74    "unable to get
30ae0 20 74 68 65 20 70 61 67 65 2e 20 65 72 72 6f 72   the page. error
30af0 20 63 6f 64 65 3d 25 64 22 2c 20 72 63 29 3b 0a   code=%d", rc);.
30b00 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
30b10 7d 0a 20 20 69 66 28 20 28 72 63 20 3d 20 69 6e  }.  if( (rc = in
30b20 69 74 50 61 67 65 28 70 50 61 67 65 2c 20 70 50  itPage(pPage, pP
30b30 61 72 65 6e 74 29 29 21 3d 30 20 29 7b 0a 20 20  arent))!=0 ){.  
30b40 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
30b50 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78  (pCheck, zContex
30b60 74 2c 20 22 69 6e 69 74 50 61 67 65 28 29 20 72  t, "initPage() r
30b70 65 74 75 72 6e 73 20 65 72 72 6f 72 20 63 6f 64  eturns error cod
30b80 65 20 25 64 22 2c 20 72 63 29 3b 0a 20 20 20 20  e %d", rc);.    
30b90 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
30ba0 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  e);.    return 0
30bb0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
30bc0 6b 20 6f 75 74 20 61 6c 6c 20 74 68 65 20 63 65  k out all the ce
30bd0 6c 6c 73 2e 0a 20 20 2a 2f 0a 20 20 64 65 70 74  lls..  */.  dept
30be0 68 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  h = 0;.  for(i=0
30bf0 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ; i<pPage->nCell
30c00 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
30c10 70 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 73  pCell;.    int s
30c20 7a 3b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20  z;.    CellInfo 
30c30 69 6e 66 6f 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  info;..    /* Ch
30c40 65 63 6b 20 70 61 79 6c 6f 61 64 20 6f 76 65 72  eck payload over
30c50 66 6c 6f 77 20 70 61 67 65 73 0a 20 20 20 20 2a  flow pages.    *
30c60 2f 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 43  /.    sprintf(zC
30c70 6f 6e 74 65 78 74 2c 20 22 4f 6e 20 74 72 65 65  ontext, "On tree
30c80 20 70 61 67 65 20 25 64 20 63 65 6c 6c 20 25 64   page %d cell %d
30c90 3a 20 22 2c 20 69 50 61 67 65 2c 20 69 29 3b 0a  : ", iPage, i);.
30ca0 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
30cb0 43 65 6c 6c 28 70 50 61 67 65 2c 69 29 3b 0a 20  Cell(pPage,i);. 
30cc0 20 20 20 70 61 72 73 65 43 65 6c 6c 50 74 72 28     parseCellPtr(
30cd0 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
30ce0 6e 66 6f 29 3b 0a 20 20 20 20 73 7a 20 3d 20 69  nfo);.    sz = i
30cf0 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20 69  nfo.nData;.    i
30d00 66 28 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65  f( !pPage->intKe
30d10 79 20 29 20 73 7a 20 2b 3d 20 69 6e 66 6f 2e 6e  y ) sz += info.n
30d20 4b 65 79 3b 0a 20 20 20 20 69 66 28 20 73 7a 3e  Key;.    if( sz>
30d30 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
30d40 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d       int nPage =
30d50 20 28 73 7a 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63   (sz - info.nLoc
30d60 61 6c 20 2b 20 75 73 61 62 6c 65 53 69 7a 65 20  al + usableSize 
30d70 2d 20 35 29 2f 28 75 73 61 62 6c 65 53 69 7a 65  - 5)/(usableSize
30d80 20 2d 20 34 29 3b 0a 20 20 20 20 20 20 50 67 6e   - 4);.      Pgn
30d90 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 67 65 74  o pgnoOvfl = get
30da0 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
30db0 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 23  o.iOverflow]);.#
30dc0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
30dd0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
30de0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
30df0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
30e00 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70     checkPtrmap(p
30e10 43 68 65 63 6b 2c 20 70 67 6e 6f 4f 76 66 6c 2c  Check, pgnoOvfl,
30e20 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
30e30 31 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65  1, iPage, zConte
30e40 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  xt);.      }.#en
30e50 64 69 66 0a 20 20 20 20 20 20 63 68 65 63 6b 4c  dif.      checkL
30e60 69 73 74 28 70 43 68 65 63 6b 2c 20 30 2c 20 70  ist(pCheck, 0, p
30e70 67 6e 6f 4f 76 66 6c 2c 20 6e 50 61 67 65 2c 20  gnoOvfl, nPage, 
30e80 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d  zContext);.    }
30e90 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 73  ..    /* Check s
30ea0 61 6e 69 74 79 20 6f 66 20 6c 65 66 74 20 63 68  anity of left ch
30eb0 69 6c 64 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  ild page..    */
30ec0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
30ed0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70  >leaf ){.      p
30ee0 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70  gno = get4byte(p
30ef0 43 65 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53  Cell);.#ifndef S
30f00 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
30f10 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20  ACUUM.      if( 
30f20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
30f30 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  ){.        check
30f40 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 70  Ptrmap(pCheck, p
30f50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
30f60 45 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65  E, iPage, zConte
30f70 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  xt);.      }.#en
30f80 64 69 66 0a 20 20 20 20 20 20 64 32 20 3d 20 63  dif.      d2 = c
30f90 68 65 63 6b 54 72 65 65 50 61 67 65 28 70 43 68  heckTreePage(pCh
30fa0 65 63 6b 2c 70 67 6e 6f 2c 70 50 61 67 65 2c 7a  eck,pgno,pPage,z
30fb0 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  Context);.      
30fc0 69 66 28 20 69 3e 30 20 26 26 20 64 32 21 3d 64  if( i>0 && d2!=d
30fd0 65 70 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  epth ){.        
30fe0 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
30ff0 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c  Check, zContext,
31000 20 22 43 68 69 6c 64 20 70 61 67 65 20 64 65 70   "Child page dep
31010 74 68 20 64 69 66 66 65 72 73 22 29 3b 0a 20 20  th differs");.  
31020 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 70 74      }.      dept
31030 68 20 3d 20 64 32 3b 0a 20 20 20 20 7d 0a 20 20  h = d2;.    }.  
31040 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  }.  if( !pPage->
31050 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f  leaf ){.    pgno
31060 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
31070 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
31080 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
31090 20 20 20 20 73 70 72 69 6e 74 66 28 7a 43 6f 6e      sprintf(zCon
310a0 74 65 78 74 2c 20 22 4f 6e 20 70 61 67 65 20 25  text, "On page %
310b0 64 20 61 74 20 72 69 67 68 74 20 63 68 69 6c 64  d at right child
310c0 3a 20 22 2c 20 69 50 61 67 65 29 3b 0a 23 69 66  : ", iPage);.#if
310d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
310e0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
310f0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
31100 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 63 68 65  uum ){.      che
31110 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c  ckPtrmap(pCheck,
31120 20 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54   pgno, PTRMAP_BT
31130 52 45 45 2c 20 69 50 61 67 65 2c 20 30 29 3b 0a  REE, iPage, 0);.
31140 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
31150 20 63 68 65 63 6b 54 72 65 65 50 61 67 65 28 70   checkTreePage(p
31160 43 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 70 50 61  Check, pgno, pPa
31170 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20  ge, zContext);. 
31180 20 7d 0a 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20   }. .  /* Check 
31190 66 6f 72 20 63 6f 6d 70 6c 65 74 65 20 63 6f 76  for complete cov
311a0 65 72 61 67 65 20 6f 66 20 74 68 65 20 70 61 67  erage of the pag
311b0 65 0a 20 20 2a 2f 0a 20 20 64 61 74 61 20 3d 20  e.  */.  data = 
311c0 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
311d0 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
311e0 4f 66 66 73 65 74 3b 0a 20 20 68 69 74 20 3d 20  Offset;.  hit = 
311f0 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 75 73  sqliteMalloc( us
31200 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69 66  ableSize );.  if
31210 28 20 68 69 74 20 29 7b 0a 20 20 20 20 6d 65 6d  ( hit ){.    mem
31220 73 65 74 28 68 69 74 2c 20 31 2c 20 67 65 74 32  set(hit, 1, get2
31230 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
31240 5d 29 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d  ]));.    nCell =
31250 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
31260 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20 63 65 6c  hdr+3]);.    cel
31270 6c 53 74 61 72 74 20 3d 20 68 64 72 20 2b 20 31  lStart = hdr + 1
31280 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61  2 - 4*pPage->lea
31290 66 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  f;.    for(i=0; 
312a0 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
312b0 20 20 20 20 20 69 6e 74 20 70 63 20 3d 20 67 65       int pc = ge
312c0 74 32 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c  t2byte(&data[cel
312d0 6c 53 74 61 72 74 2b 69 2a 32 5d 29 3b 0a 20 20  lStart+i*2]);.  
312e0 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 63      int size = c
312f0 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
31300 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20  , &data[pc]);.  
31310 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
31320 20 69 66 28 20 28 70 63 2b 73 69 7a 65 2d 31 29   if( (pc+size-1)
31330 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20  >=usableSize || 
31340 70 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  pc<0 ){.        
31350 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
31360 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20  Check, 0, .     
31370 20 20 20 20 20 20 20 22 43 6f 72 72 75 70 74 69         "Corrupti
31380 6f 6e 20 64 65 74 65 63 74 65 64 20 69 6e 20 63  on detected in c
31390 65 6c 6c 20 25 64 20 6f 6e 20 70 61 67 65 20 25  ell %d on page %
313a0 64 22 2c 69 2c 69 50 61 67 65 2c 30 29 3b 0a 20  d",i,iPage,0);. 
313b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
313c0 20 20 20 20 66 6f 72 28 6a 3d 70 63 2b 73 69 7a      for(j=pc+siz
313d0 65 2d 31 3b 20 6a 3e 3d 70 63 3b 20 6a 2d 2d 29  e-1; j>=pc; j--)
313e0 20 68 69 74 5b 6a 5d 2b 2b 3b 0a 20 20 20 20 20   hit[j]++;.     
313f0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72   }.    }.    for
31400 28 63 6e 74 3d 30 2c 20 69 3d 67 65 74 32 62 79  (cnt=0, i=get2by
31410 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29  te(&data[hdr+1])
31420 3b 20 69 3e 30 20 26 26 20 69 3c 75 73 61 62 6c  ; i>0 && i<usabl
31430 65 53 69 7a 65 20 26 26 20 63 6e 74 3c 31 30 30  eSize && cnt<100
31440 30 30 3b 20 0a 20 20 20 20 20 20 20 20 20 20 20  00; .           
31450 63 6e 74 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  cnt++){.      in
31460 74 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74  t size = get2byt
31470 65 28 26 64 61 74 61 5b 69 2b 32 5d 29 3b 0a 20  e(&data[i+2]);. 
31480 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
31490 20 20 69 66 28 20 28 69 2b 73 69 7a 65 2d 31 29    if( (i+size-1)
314a0 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20  >=usableSize || 
314b0 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  i<0 ){.        c
314c0 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
314d0 68 65 63 6b 2c 20 30 2c 20 20 0a 20 20 20 20 20  heck, 0,  .     
314e0 20 20 20 20 20 20 20 22 43 6f 72 72 75 70 74 69         "Corrupti
314f0 6f 6e 20 64 65 74 65 63 74 65 64 20 69 6e 20 63  on detected in c
31500 65 6c 6c 20 25 64 20 6f 6e 20 70 61 67 65 20 25  ell %d on page %
31510 64 22 2c 69 2c 69 50 61 67 65 2c 30 29 3b 0a 20  d",i,iPage,0);. 
31520 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
31530 20 20 20 20 66 6f 72 28 6a 3d 69 2b 73 69 7a 65      for(j=i+size
31540 2d 31 3b 20 6a 3e 3d 69 3b 20 6a 2d 2d 29 20 68  -1; j>=i; j--) h
31550 69 74 5b 6a 5d 2b 2b 3b 0a 20 20 20 20 20 20 7d  it[j]++;.      }
31560 0a 20 20 20 20 20 20 69 20 3d 20 67 65 74 32 62  .      i = get2b
31570 79 74 65 28 26 64 61 74 61 5b 69 5d 29 3b 0a 20  yte(&data[i]);. 
31580 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 63     }.    for(i=c
31590 6e 74 3d 30 3b 20 69 3c 75 73 61 62 6c 65 53 69  nt=0; i<usableSi
315a0 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ze; i++){.      
315b0 69 66 28 20 68 69 74 5b 69 5d 3d 3d 30 20 29 7b  if( hit[i]==0 ){
315c0 0a 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a  .        cnt++;.
315d0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
315e0 68 69 74 5b 69 5d 3e 31 20 29 7b 0a 20 20 20 20  hit[i]>1 ){.    
315f0 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
31600 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 0a 20 20  sg(pCheck, 0,.  
31610 20 20 20 20 20 20 20 20 22 4d 75 6c 74 69 70 6c          "Multipl
31620 65 20 75 73 65 73 20 66 6f 72 20 62 79 74 65 20  e uses for byte 
31630 25 64 20 6f 66 20 70 61 67 65 20 25 64 22 2c 20  %d of page %d", 
31640 69 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20  i, iPage);.     
31650 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
31660 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
31670 63 6e 74 21 3d 64 61 74 61 5b 68 64 72 2b 37 5d  cnt!=data[hdr+7]
31680 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41   ){.      checkA
31690 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
316a0 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22   0, .          "
316b0 46 72 61 67 6d 65 6e 74 65 64 20 73 70 61 63 65  Fragmented space
316c0 20 69 73 20 25 64 20 62 79 74 65 20 72 65 70 6f   is %d byte repo
316d0 72 74 65 64 20 61 73 20 25 64 20 6f 6e 20 70 61  rted as %d on pa
316e0 67 65 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20  ge %d",.        
316f0 20 20 63 6e 74 2c 20 64 61 74 61 5b 68 64 72 2b    cnt, data[hdr+
31700 37 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20  7], iPage);.    
31710 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  }.  }.  sqliteFr
31720 65 65 28 68 69 74 29 3b 0a 0a 20 20 72 65 6c 65  ee(hit);..  rele
31730 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
31740 20 20 72 65 74 75 72 6e 20 64 65 70 74 68 2b 31    return depth+1
31750 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
31760 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52  LITE_OMIT_INTEGR
31770 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69  ITY_CHECK */..#i
31780 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
31790 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
317a0 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  K./*.** This rou
317b0 74 69 6e 65 20 64 6f 65 73 20 61 20 63 6f 6d 70  tine does a comp
317c0 6c 65 74 65 20 63 68 65 63 6b 20 6f 66 20 74 68  lete check of th
317d0 65 20 67 69 76 65 6e 20 42 54 72 65 65 20 66 69  e given BTree fi
317e0 6c 65 2e 20 20 61 52 6f 6f 74 5b 5d 20 69 73 0a  le.  aRoot[] is.
317f0 2a 2a 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70  ** an array of p
31800 61 67 65 73 20 6e 75 6d 62 65 72 73 20 77 65 72  ages numbers wer
31810 65 20 65 61 63 68 20 70 61 67 65 20 6e 75 6d 62  e each page numb
31820 65 72 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70  er is the root p
31830 61 67 65 20 6f 66 0a 2a 2a 20 61 20 74 61 62 6c  age of.** a tabl
31840 65 2e 20 20 6e 52 6f 6f 74 20 69 73 20 74 68 65  e.  nRoot is the
31850 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   number of entri
31860 65 73 20 69 6e 20 61 52 6f 6f 74 2e 0a 2a 2a 0a  es in aRoot..**.
31870 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67  ** If everything
31880 20 63 68 65 63 6b 73 20 6f 75 74 2c 20 74 68 69   checks out, thi
31890 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
318a0 73 20 4e 55 4c 4c 2e 20 20 49 66 20 73 6f 6d 65  s NULL.  If some
318b0 74 68 69 6e 67 20 69 73 0a 2a 2a 20 61 6d 69 73  thing is.** amis
318c0 73 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  s, an error mess
318d0 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  age is written i
318e0 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69  nto memory obtai
318f0 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28  ned from malloc(
31900 29 0a 2a 2a 20 61 6e 64 20 61 20 70 6f 69 6e 74  ).** and a point
31910 65 72 20 74 6f 20 74 68 61 74 20 65 72 72 6f 72  er to that error
31920 20 6d 65 73 73 61 67 65 20 69 73 20 72 65 74 75   message is retu
31930 72 6e 65 64 2e 20 20 54 68 65 20 63 61 6c 6c 69  rned.  The calli
31940 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  ng function.** i
31950 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
31960 72 20 66 72 65 65 69 6e 67 20 74 68 65 20 65 72  r freeing the er
31970 72 6f 72 20 6d 65 73 73 61 67 65 20 77 68 65 6e  ror message when
31980 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2f 0a   it is done..*/.
31990 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72  char *sqlite3Btr
319a0 65 65 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b  eeIntegrityCheck
319b0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a  (Btree *p, int *
319c0 61 52 6f 6f 74 2c 20 69 6e 74 20 6e 52 6f 6f 74  aRoot, int nRoot
319d0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
319e0 74 20 6e 52 65 66 3b 0a 20 20 49 6e 74 65 67 72  t nRef;.  Integr
319f0 69 74 79 43 6b 20 73 43 68 65 63 6b 3b 0a 20 20  ityCk sCheck;.  
31a00 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
31a10 70 2d 3e 70 42 74 3b 0a 0a 20 20 6e 52 65 66 20  p->pBt;..  nRef 
31a20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72  = sqlite3pager_r
31a30 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  efcount(pBt->pPa
31a40 67 65 72 29 3b 0a 20 20 69 66 28 20 6c 6f 63 6b  ger);.  if( lock
31a50 42 74 72 65 65 57 69 74 68 52 65 74 72 79 28 70  BtreeWithRetry(p
31a60 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
31a70 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
31a80 65 53 74 72 44 75 70 28 22 55 6e 61 62 6c 65 20  eStrDup("Unable 
31a90 74 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 61  to acquire a rea
31aa0 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
31ab0 74 61 62 61 73 65 22 29 3b 0a 20 20 7d 0a 20 20  tabase");.  }.  
31ac0 73 43 68 65 63 6b 2e 70 42 74 20 3d 20 70 42 74  sCheck.pBt = pBt
31ad0 3b 0a 20 20 73 43 68 65 63 6b 2e 70 50 61 67 65  ;.  sCheck.pPage
31ae0 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b  r = pBt->pPager;
31af0 0a 20 20 73 43 68 65 63 6b 2e 6e 50 61 67 65 20  .  sCheck.nPage 
31b00 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70  = sqlite3pager_p
31b10 61 67 65 63 6f 75 6e 74 28 73 43 68 65 63 6b 2e  agecount(sCheck.
31b20 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 73  pPager);.  if( s
31b30 43 68 65 63 6b 2e 6e 50 61 67 65 3d 3d 30 20 29  Check.nPage==0 )
31b40 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65  {.    unlockBtre
31b50 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
31b60 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
31b70 7d 0a 20 20 73 43 68 65 63 6b 2e 61 6e 52 65 66  }.  sCheck.anRef
31b80 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
31b90 61 77 28 20 28 73 43 68 65 63 6b 2e 6e 50 61 67  aw( (sCheck.nPag
31ba0 65 2b 31 29 2a 73 69 7a 65 6f 66 28 73 43 68 65  e+1)*sizeof(sChe
31bb0 63 6b 2e 61 6e 52 65 66 5b 30 5d 29 20 29 3b 0a  ck.anRef[0]) );.
31bc0 20 20 69 66 28 20 21 73 43 68 65 63 6b 2e 61 6e    if( !sCheck.an
31bd0 52 65 66 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63  Ref ){.    unloc
31be0 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
31bf0 42 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  Bt);.    return 
31c00 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
31c10 55 6e 61 62 6c 65 20 74 6f 20 6d 61 6c 6c 6f 63  Unable to malloc
31c20 20 25 64 20 62 79 74 65 73 22 2c 20 0a 20 20 20   %d bytes", .   
31c30 20 20 20 20 20 28 73 43 68 65 63 6b 2e 6e 50 61       (sCheck.nPa
31c40 67 65 2b 31 29 2a 73 69 7a 65 6f 66 28 73 43 68  ge+1)*sizeof(sCh
31c50 65 63 6b 2e 61 6e 52 65 66 5b 30 5d 29 29 3b 0a  eck.anRef[0]));.
31c60 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
31c70 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65 3b 20  <=sCheck.nPage; 
31c80 69 2b 2b 29 7b 20 73 43 68 65 63 6b 2e 61 6e 52  i++){ sCheck.anR
31c90 65 66 5b 69 5d 20 3d 20 30 3b 20 7d 0a 20 20 69  ef[i] = 0; }.  i
31ca0 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f   = PENDING_BYTE_
31cb0 50 41 47 45 28 70 42 74 29 3b 0a 20 20 69 66 28  PAGE(pBt);.  if(
31cc0 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65   i<=sCheck.nPage
31cd0 20 29 7b 0a 20 20 20 20 73 43 68 65 63 6b 2e 61   ){.    sCheck.a
31ce0 6e 52 65 66 5b 69 5d 20 3d 20 31 3b 0a 20 20 7d  nRef[i] = 1;.  }
31cf0 0a 20 20 73 43 68 65 63 6b 2e 7a 45 72 72 4d 73  .  sCheck.zErrMs
31d00 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 68 65  g = 0;..  /* Che
31d10 63 6b 20 74 68 65 20 69 6e 74 65 67 72 69 74 79  ck the integrity
31d20 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   of the freelist
31d30 0a 20 20 2a 2f 0a 20 20 63 68 65 63 6b 4c 69 73  .  */.  checkLis
31d40 74 28 26 73 43 68 65 63 6b 2c 20 31 2c 20 67 65  t(&sCheck, 1, ge
31d50 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
31d60 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 2c  ge1->aData[32]),
31d70 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74  .            get
31d80 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
31d90 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 2c 20  e1->aData[36]), 
31da0 22 4d 61 69 6e 20 66 72 65 65 6c 69 73 74 3a 20  "Main freelist: 
31db0 22 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  ");..  /* Check 
31dc0 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 73 2e 0a  all the tables..
31dd0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
31de0 69 3c 6e 52 6f 6f 74 3b 20 69 2b 2b 29 7b 0a 20  i<nRoot; i++){. 
31df0 20 20 20 69 66 28 20 61 52 6f 6f 74 5b 69 5d 3d     if( aRoot[i]=
31e00 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23  =0 ) continue;.#
31e10 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
31e20 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
31e30 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
31e40 61 63 75 75 6d 20 26 26 20 61 52 6f 6f 74 5b 69  acuum && aRoot[i
31e50 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 63 68 65  ]>1 ){.      che
31e60 63 6b 50 74 72 6d 61 70 28 26 73 43 68 65 63 6b  ckPtrmap(&sCheck
31e70 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 50 54 52 4d  , aRoot[i], PTRM
31e80 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30 2c 20  AP_ROOTPAGE, 0, 
31e90 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  0);.    }.#endif
31ea0 0a 20 20 20 20 63 68 65 63 6b 54 72 65 65 50 61  .    checkTreePa
31eb0 67 65 28 26 73 43 68 65 63 6b 2c 20 61 52 6f 6f  ge(&sCheck, aRoo
31ec0 74 5b 69 5d 2c 20 30 2c 20 22 4c 69 73 74 20 6f  t[i], 0, "List o
31ed0 66 20 74 72 65 65 20 72 6f 6f 74 73 3a 20 22 29  f tree roots: ")
31ee0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
31ef0 20 73 75 72 65 20 65 76 65 72 79 20 70 61 67 65   sure every page
31f00 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20   in the file is 
31f10 72 65 66 65 72 65 6e 63 65 64 0a 20 20 2a 2f 0a  referenced.  */.
31f20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 73 43    for(i=1; i<=sC
31f30 68 65 63 6b 2e 6e 50 61 67 65 3b 20 69 2b 2b 29  heck.nPage; i++)
31f40 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
31f50 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
31f60 20 20 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61      if( sCheck.a
31f70 6e 52 65 66 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20  nRef[i]==0 ){.  
31f80 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
31f90 73 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 22  sg(&sCheck, 0, "
31fa0 50 61 67 65 20 25 64 20 69 73 20 6e 65 76 65 72  Page %d is never
31fb0 20 75 73 65 64 22 2c 20 69 29 3b 0a 20 20 20 20   used", i);.    
31fc0 7d 0a 23 65 6c 73 65 0a 20 20 20 20 2f 2a 20 49  }.#else.    /* I
31fd0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
31fe0 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63  upports auto-vac
31ff0 75 75 6d 2c 20 6d 61 6b 65 20 73 75 72 65 20 6e  uum, make sure n
32000 6f 20 74 61 62 6c 65 73 20 63 6f 6e 74 61 69 6e  o tables contain
32010 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63  .    ** referenc
32020 65 73 20 74 6f 20 70 6f 69 6e 74 65 72 2d 6d 61  es to pointer-ma
32030 70 20 70 61 67 65 73 2e 0a 20 20 20 20 2a 2f 0a  p pages..    */.
32040 20 20 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61      if( sCheck.a
32050 6e 52 65 66 5b 69 5d 3d 3d 30 20 26 26 20 0a 20  nRef[i]==0 && . 
32060 20 20 20 20 20 20 28 50 54 52 4d 41 50 5f 50 41        (PTRMAP_PA
32070 47 45 4e 4f 28 70 42 74 2c 20 69 29 21 3d 69 20  GENO(pBt, i)!=i 
32080 7c 7c 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63  || !pBt->autoVac
32090 75 75 6d 29 20 29 7b 0a 20 20 20 20 20 20 63 68  uum) ){.      ch
320a0 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43  eckAppendMsg(&sC
320b0 68 65 63 6b 2c 20 30 2c 20 22 50 61 67 65 20 25  heck, 0, "Page %
320c0 64 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 22  d is never used"
320d0 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , i);.    }.    
320e0 69 66 28 20 73 43 68 65 63 6b 2e 61 6e 52 65 66  if( sCheck.anRef
320f0 5b 69 5d 21 3d 30 20 26 26 20 0a 20 20 20 20 20  [i]!=0 && .     
32100 20 20 28 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f    (PTRMAP_PAGENO
32110 28 70 42 74 2c 20 69 29 3d 3d 69 20 26 26 20 70  (pBt, i)==i && p
32120 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 20  Bt->autoVacuum) 
32130 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70  ){.      checkAp
32140 70 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c  pendMsg(&sCheck,
32150 20 30 2c 20 22 50 6f 69 6e 74 65 72 20 6d 61 70   0, "Pointer map
32160 20 70 61 67 65 20 25 64 20 69 73 20 72 65 66 65   page %d is refe
32170 72 65 6e 63 65 64 22 2c 20 69 29 3b 0a 20 20 20  renced", i);.   
32180 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20   }.#endif.  }.. 
32190 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
321a0 69 73 20 61 6e 61 6c 79 73 69 73 20 64 69 64 20  is analysis did 
321b0 6e 6f 74 20 6c 65 61 76 65 20 61 6e 79 20 75 6e  not leave any un
321c0 72 65 66 28 29 20 70 61 67 65 73 0a 20 20 2a 2f  ref() pages.  */
321d0 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  .  unlockBtreeIf
321e0 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 69  Unused(pBt);.  i
321f0 66 28 20 6e 52 65 66 20 21 3d 20 73 71 6c 69 74  f( nRef != sqlit
32200 65 33 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74  e3pager_refcount
32210 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b  (pBt->pPager) ){
32220 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64  .    checkAppend
32230 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20  Msg(&sCheck, 0, 
32240 0a 20 20 20 20 20 20 22 4f 75 74 73 74 61 6e 64  .      "Outstand
32250 69 6e 67 20 70 61 67 65 20 63 6f 75 6e 74 20 67  ing page count g
32260 6f 65 73 20 66 72 6f 6d 20 25 64 20 74 6f 20 25  oes from %d to %
32270 64 20 64 75 72 69 6e 67 20 74 68 69 73 20 61 6e  d during this an
32280 61 6c 79 73 69 73 22 2c 0a 20 20 20 20 20 20 6e  alysis",.      n
32290 52 65 66 2c 20 73 71 6c 69 74 65 33 70 61 67 65  Ref, sqlite3page
322a0 72 5f 72 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e  r_refcount(pBt->
322b0 70 50 61 67 65 72 29 0a 20 20 20 20 29 3b 0a 20  pPager).    );. 
322c0 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 20   }..  /* Clean  
322d0 75 70 20 61 6e 64 20 72 65 70 6f 72 74 20 65 72  up and report er
322e0 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  rors..  */.  sql
322f0 69 74 65 46 72 65 65 28 73 43 68 65 63 6b 2e 61  iteFree(sCheck.a
32300 6e 52 65 66 29 3b 0a 20 20 72 65 74 75 72 6e 20  nRef);.  return 
32310 73 43 68 65 63 6b 2e 7a 45 72 72 4d 73 67 3b 0a  sCheck.zErrMsg;.
32320 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
32330 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54  TE_OMIT_INTEGRIT
32340 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 2f 2a 0a 2a  Y_CHECK */../*.*
32350 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c  * Return the ful
32360 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  l pathname of th
32370 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74  e underlying dat
32380 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63  abase file..*/.c
32390 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
323a0 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
323b0 6d 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  me(Btree *p){.  
323c0 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e  assert( p->pBt->
323d0 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 72  pPager!=0 );.  r
323e0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 70 61 67  eturn sqlite3pag
323f0 65 72 5f 66 69 6c 65 6e 61 6d 65 28 70 2d 3e 70  er_filename(p->p
32400 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a  Bt->pPager);.}..
32410 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
32420 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
32430 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20   directory that 
32440 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74  contains the dat
32450 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63  abase file..*/.c
32460 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
32470 65 33 42 74 72 65 65 47 65 74 44 69 72 6e 61 6d  e3BtreeGetDirnam
32480 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61  e(Btree *p){.  a
32490 73 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 70  ssert( p->pBt->p
324a0 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 72 65  Pager!=0 );.  re
324b0 74 75 72 6e 20 73 71 6c 69 74 65 33 70 61 67 65  turn sqlite3page
324c0 72 5f 64 69 72 6e 61 6d 65 28 70 2d 3e 70 42 74  r_dirname(p->pBt
324d0 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a  ->pPager);.}../*
324e0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70  .** Return the p
324f0 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a  athname of the j
32500 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
32510 74 68 69 73 20 64 61 74 61 62 61 73 65 2e 20 54  this database. T
32520 68 65 20 72 65 74 75 72 6e 0a 2a 2a 20 76 61 6c  he return.** val
32530 75 65 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ue of this routi
32540 6e 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 72  ne is the same r
32550 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
32560 74 68 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ther the journal
32570 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65   file.** has bee
32580 6e 20 63 72 65 61 74 65 64 20 6f 72 20 6e 6f 74  n created or not
32590 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
325a0 2a 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74  *sqlite3BtreeGet
325b0 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 42 74 72 65  Journalname(Btre
325c0 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  e *p){.  assert(
325d0 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 21   p->pBt->pPager!
325e0 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  =0 );.  return s
325f0 71 6c 69 74 65 33 70 61 67 65 72 5f 6a 6f 75 72  qlite3pager_jour
32600 6e 61 6c 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e  nalname(p->pBt->
32610 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 23 69 66 6e  pPager);.}..#ifn
32620 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
32630 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 43 6f 70  VACUUM./*.** Cop
32640 79 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 63  y the complete c
32650 6f 6e 74 65 6e 74 20 6f 66 20 70 42 74 46 72 6f  ontent of pBtFro
32660 6d 20 69 6e 74 6f 20 70 42 74 54 6f 2e 20 20 41  m into pBtTo.  A
32670 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
32680 6d 75 73 74 20 62 65 20 61 63 74 69 76 65 20 66  must be active f
32690 6f 72 20 62 6f 74 68 20 66 69 6c 65 73 2e 0a 2a  or both files..*
326a0 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66  *.** The size of
326b0 20 66 69 6c 65 20 70 42 74 46 72 6f 6d 20 6d 61   file pBtFrom ma
326c0 79 20 62 65 20 72 65 64 75 63 65 64 20 62 79 20  y be reduced by 
326d0 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  this operation..
326e0 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67  ** If anything g
326f0 6f 65 73 20 77 72 6f 6e 67 2c 20 74 68 65 20 74  oes wrong, the t
32700 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 70 42  ransaction on pB
32710 74 46 72 6f 6d 20 69 73 20 72 6f 6c 6c 65 64 20  tFrom is rolled 
32720 62 61 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  back..*/.int sql
32730 69 74 65 33 42 74 72 65 65 43 6f 70 79 46 69 6c  ite3BtreeCopyFil
32740 65 28 42 74 72 65 65 20 2a 70 54 6f 2c 20 42 74  e(Btree *pTo, Bt
32750 72 65 65 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69  ree *pFrom){.  i
32760 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
32770 4b 3b 0a 20 20 50 67 6e 6f 20 69 2c 20 6e 50 61  K;.  Pgno i, nPa
32780 67 65 2c 20 6e 54 6f 50 61 67 65 2c 20 69 53 6b  ge, nToPage, iSk
32790 69 70 3b 0a 0a 20 20 42 74 53 68 61 72 65 64 20  ip;..  BtShared 
327a0 2a 70 42 74 54 6f 20 3d 20 70 54 6f 2d 3e 70 42  *pBtTo = pTo->pB
327b0 74 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  t;.  BtShared *p
327c0 42 74 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e  BtFrom = pFrom->
327d0 70 42 74 3b 0a 0a 20 20 69 66 28 20 70 54 6f 2d  pBt;..  if( pTo-
327e0 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f  >inTrans!=TRANS_
327f0 57 52 49 54 45 20 7c 7c 20 70 46 72 6f 6d 2d 3e  WRITE || pFrom->
32800 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57  inTrans!=TRANS_W
32810 52 49 54 45 20 29 7b 0a 20 20 20 20 72 65 74 75  RITE ){.    retu
32820 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
32830 0a 20 20 7d 0a 20 20 69 66 28 20 70 42 74 54 6f  .  }.  if( pBtTo
32840 2d 3e 70 43 75 72 73 6f 72 20 29 20 72 65 74 75  ->pCursor ) retu
32850 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
32860 20 20 6e 54 6f 50 61 67 65 20 3d 20 73 71 6c 69    nToPage = sqli
32870 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75  te3pager_pagecou
32880 6e 74 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72  nt(pBtTo->pPager
32890 29 3b 0a 20 20 6e 50 61 67 65 20 3d 20 73 71 6c  );.  nPage = sql
328a0 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f  ite3pager_pageco
328b0 75 6e 74 28 70 42 74 46 72 6f 6d 2d 3e 70 50 61  unt(pBtFrom->pPa
328c0 67 65 72 29 3b 0a 20 20 69 53 6b 69 70 20 3d 20  ger);.  iSkip = 
328d0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
328e0 45 28 70 42 74 54 6f 29 3b 0a 20 20 66 6f 72 28  E(pBtTo);.  for(
328f0 69 3d 31 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=1; rc==SQLITE_
32900 4f 4b 20 26 26 20 69 3c 3d 6e 50 61 67 65 3b 20  OK && i<=nPage; 
32910 69 2b 2b 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a  i++){.    void *
32920 70 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20 69  pPage;.    if( i
32930 3d 3d 69 53 6b 69 70 20 29 20 63 6f 6e 74 69 6e  ==iSkip ) contin
32940 75 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ue;.    rc = sql
32950 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 70 42  ite3pager_get(pB
32960 74 46 72 6f 6d 2d 3e 70 50 61 67 65 72 2c 20 69  tFrom->pPager, i
32970 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20 69  , &pPage);.    i
32980 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20  f( rc ) break;. 
32990 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70     rc = sqlite3p
329a0 61 67 65 72 5f 6f 76 65 72 77 72 69 74 65 28 70  ager_overwrite(p
329b0 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20 69 2c  BtTo->pPager, i,
329c0 20 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28   pPage);.    if(
329d0 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20   rc ) break;.   
329e0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
329f0 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a  ref(pPage);.  }.
32a00 20 20 66 6f 72 28 69 3d 6e 50 61 67 65 2b 31 3b    for(i=nPage+1;
32a10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
32a20 26 20 69 3c 3d 6e 54 6f 50 61 67 65 3b 20 69 2b  & i<=nToPage; i+
32a30 2b 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 50  +){.    void *pP
32a40 61 67 65 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d  age;.    if( i==
32a50 69 53 6b 69 70 20 29 20 63 6f 6e 74 69 6e 75 65  iSkip ) continue
32a60 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
32a70 65 33 70 61 67 65 72 5f 67 65 74 28 70 42 74 54  e3pager_get(pBtT
32a80 6f 2d 3e 70 50 61 67 65 72 2c 20 69 2c 20 26 70  o->pPager, i, &p
32a90 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
32aa0 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 72  c ) break;.    r
32ab0 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
32ac0 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20  _write(pPage);. 
32ad0 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
32ae0 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  unref(pPage);.  
32af0 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64    sqlite3pager_d
32b00 6f 6e 74 5f 77 72 69 74 65 28 70 42 74 54 6f 2d  ont_write(pBtTo-
32b10 3e 70 50 61 67 65 72 2c 20 69 29 3b 0a 20 20 7d  >pPager, i);.  }
32b20 0a 20 20 69 66 28 20 21 72 63 20 26 26 20 6e 50  .  if( !rc && nP
32b30 61 67 65 3c 6e 54 6f 50 61 67 65 20 29 7b 0a 20  age<nToPage ){. 
32b40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70     rc = sqlite3p
32b50 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 42  ager_truncate(pB
32b60 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20 6e 50 61  tTo->pPager, nPa
32b70 67 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  ge);.  }.  if( r
32b80 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  c ){.    sqlite3
32b90 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 54  BtreeRollback(pT
32ba0 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
32bb0 20 72 63 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20   rc;  .}.#endif 
32bc0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
32bd0 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ACUUM */../*.** 
32be0 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
32bf0 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  if a transaction
32c00 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69   is active..*/.i
32c10 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  nt sqlite3BtreeI
32c20 73 49 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a  sInTrans(Btree *
32c30 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 20  p){.  return (p 
32c40 26 26 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  && (p->inTrans==
32c50 54 52 41 4e 53 5f 57 52 49 54 45 29 29 3b 0a 7d  TRANS_WRITE));.}
32c60 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e  ../*.** Return n
32c70 6f 6e 2d 7a 65 72 6f 20 69 66 20 61 20 73 74 61  on-zero if a sta
32c80 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
32c90 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2f  on is active..*/
32ca0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
32cb0 65 49 73 49 6e 53 74 6d 74 28 42 74 72 65 65 20  eIsInStmt(Btree 
32cc0 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70  *p){.  return (p
32cd0 2d 3e 70 42 74 20 26 26 20 70 2d 3e 70 42 74 2d  ->pBt && p->pBt-
32ce0 3e 69 6e 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a  >inStmt);.}../*.
32cf0 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  ** Return non-ze
32d00 72 6f 20 69 66 20 61 20 72 65 61 64 20 28 6f 72  ro if a read (or
32d10 20 77 72 69 74 65 29 20 74 72 61 6e 73 61 63 74   write) transact
32d20 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
32d30 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
32d40 65 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28  eeIsInReadTrans(
32d50 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74  Btree *p){.  ret
32d60 75 72 6e 20 28 70 20 26 26 20 28 70 2d 3e 69 6e  urn (p && (p->in
32d70 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans!=TRANS_NON
32d80 45 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  E));.}../*.** Th
32d90 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
32da0 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74  op if no write-t
32db0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75  ransaction is cu
32dc0 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f  rrently active o
32dd0 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  n pBt..**.** Oth
32de0 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65  erwise, sync the
32df0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
32e00 6f 72 20 74 68 65 20 62 74 72 65 65 20 70 42 74  or the btree pBt
32e10 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73  . zMaster points
32e20 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20   to.** the name 
32e30 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
32e40 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68  nal file that sh
32e50 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20  ould be written 
32e60 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69  into the.** indi
32e70 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66  vidual journal f
32e80 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c  ile, or is NULL,
32e90 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d   indicating no m
32ea0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
32eb0 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64  le .** (single d
32ec0 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
32ed0 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ion)..**.** When
32ee0 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c   this is called,
32ef0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
32f00 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  nal should alrea
32f10 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20  dy have been.** 
32f20 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74  created, populat
32f30 65 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75  ed with this jou
32f40 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64  rnal pointer and
32f50 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
32f60 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73  .**.** Once this
32f70 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20   is routine has 
32f80 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e  returned, the on
32f90 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69 72 65  ly thing require
32fa0 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74  d to commit.** t
32fb0 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  he write-transac
32fc0 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61  tion for this da
32fd0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74  tabase file is t
32fe0 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  o delete the jou
32ff0 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rnal..*/.int sql
33000 69 74 65 33 42 74 72 65 65 53 79 6e 63 28 42 74  ite3BtreeSync(Bt
33010 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  ree *p, const ch
33020 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
33030 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
33040 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  OK;.  if( p->inT
33050 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
33060 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65  E ){.    BtShare
33070 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
33080 0a 20 20 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63  .    Pgno nTrunc
33090 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
330a0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
330b0 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
330c0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
330d0 20 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56        rc = autoV
330e0 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 2c  acuumCommit(pBt,
330f0 20 26 6e 54 72 75 6e 63 29 3b 20 0a 20 20 20 20   &nTrunc); .    
33100 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
33110 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
33120 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
33130 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
33140 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70     rc = sqlite3p
33150 61 67 65 72 5f 73 79 6e 63 28 70 42 74 2d 3e 70  ager_sync(pBt->p
33160 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20  Pager, zMaster, 
33170 6e 54 72 75 6e 63 29 3b 0a 20 20 7d 0a 20 20 72  nTrunc);.  }.  r
33180 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
33190 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
331a0 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
331b0 65 72 20 74 6f 20 61 20 62 6c 6f 62 20 6f 66 20  er to a blob of 
331c0 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
331d0 64 20 77 69 74 68 0a 2a 2a 20 61 20 73 69 6e 67  d with.** a sing
331e0 6c 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e  le shared-btree.
331f0 20 54 68 65 20 6d 65 6d 6f 72 79 20 69 73 20 75   The memory is u
33200 73 65 64 20 62 79 20 63 6c 69 65 6e 74 20 63 6f  sed by client co
33210 64 65 20 66 6f 72 20 69 74 27 73 20 6f 77 6e 0a  de for it's own.
33220 2a 2a 20 70 75 72 70 6f 73 65 73 20 28 66 6f 72  ** purposes (for
33230 20 65 78 61 6d 70 6c 65 2c 20 74 6f 20 73 74 6f   example, to sto
33240 72 65 20 61 20 68 69 67 68 2d 6c 65 76 65 6c 20  re a high-level 
33250 73 63 68 65 6d 61 20 61 73 73 6f 63 69 61 74 65  schema associate
33260 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20 73  d with .** the s
33270 68 61 72 65 64 2d 62 74 72 65 65 29 2e 20 54 68  hared-btree). Th
33280 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 6d 61  e btree layer ma
33290 6e 61 67 65 73 20 72 65 66 65 72 65 6e 63 65 20  nages reference 
332a0 63 6f 75 6e 74 69 6e 67 20 69 73 73 75 65 73 2e  counting issues.
332b0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
332c0 20 74 69 6d 65 20 74 68 69 73 20 69 73 20 63 61   time this is ca
332d0 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72 65 64  lled on a shared
332e0 2d 62 74 72 65 65 2c 20 6e 42 79 74 65 73 20 62  -btree, nBytes b
332f0 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a  ytes of memory.*
33300 2a 20 61 72 65 20 61 6c 6c 6f 63 61 74 65 64 2c  * are allocated,
33310 20 7a 65 72 6f 65 64 2c 20 61 6e 64 20 72 65 74   zeroed, and ret
33320 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
33330 6c 65 72 2e 20 46 6f 72 20 65 61 63 68 20 73 75  ler. For each su
33340 62 73 65 71 75 65 6e 74 20 0a 2a 2a 20 63 61 6c  bsequent .** cal
33350 6c 20 74 68 65 20 6e 42 79 74 65 73 20 70 61 72  l the nBytes par
33360 61 6d 65 74 65 72 20 69 73 20 69 67 6e 6f 72 65  ameter is ignore
33370 64 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20  d and a pointer 
33380 74 6f 20 74 68 65 20 73 61 6d 65 20 62 6c 6f 62  to the same blob
33390 0a 2a 2a 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65  .** of memory re
333a0 74 75 72 6e 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 4a  turned. .**.** J
333b0 75 73 74 20 62 65 66 6f 72 65 20 74 68 65 20 73  ust before the s
333c0 68 61 72 65 64 2d 62 74 72 65 65 20 69 73 20 63  hared-btree is c
333d0 6c 6f 73 65 64 2c 20 74 68 65 20 66 75 6e 63 74  losed, the funct
333e0 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74 68  ion passed as th
333f0 65 20 0a 2a 2a 20 78 46 72 65 65 20 61 72 67 75  e .** xFree argu
33400 6d 65 6e 74 20 77 68 65 6e 20 74 68 65 20 6d 65  ment when the me
33410 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
33420 77 61 73 20 6d 61 64 65 20 69 73 20 69 6e 76 6f  was made is invo
33430 6b 65 64 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 62  ked on the .** b
33440 6c 6f 62 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64  lob of allocated
33450 20 6d 65 6d 6f 72 79 2e 20 54 68 69 73 20 66 75   memory. This fu
33460 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6e 6f  nction should no
33470 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 46 72 65  t call sqliteFre
33480 65 28 29 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 65  e().** on the me
33490 6d 6f 72 79 2c 20 74 68 65 20 62 74 72 65 65 20  mory, the btree 
334a0 6c 61 79 65 72 20 64 6f 65 73 20 74 68 61 74 2e  layer does that.
334b0 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
334c0 33 42 74 72 65 65 53 63 68 65 6d 61 28 42 74 72  3BtreeSchema(Btr
334d0 65 65 20 2a 70 2c 20 69 6e 74 20 6e 42 79 74 65  ee *p, int nByte
334e0 73 2c 20 76 6f 69 64 28 2a 78 46 72 65 65 29 28  s, void(*xFree)(
334f0 76 6f 69 64 20 2a 29 29 7b 0a 20 20 42 74 53 68  void *)){.  BtSh
33500 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
33510 42 74 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  Bt;.  if( !pBt->
33520 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 70  pSchema ){.    p
33530 42 74 2d 3e 70 53 63 68 65 6d 61 20 3d 20 73 71  Bt->pSchema = sq
33540 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e 42 79 74 65  liteMalloc(nByte
33550 73 29 3b 0a 20 20 20 20 70 42 74 2d 3e 78 46 72  s);.    pBt->xFr
33560 65 65 53 63 68 65 6d 61 20 3d 20 78 46 72 65 65  eeSchema = xFree
33570 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
33580 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 7d 0a 0a  Bt->pSchema;.}..
33590 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
335a0 65 20 69 66 20 61 6e 6f 74 68 65 72 20 75 73 65  e if another use
335b0 72 20 6f 66 20 74 68 65 20 73 61 6d 65 20 73 68  r of the same sh
335c0 61 72 65 64 20 62 74 72 65 65 20 61 73 20 74 68  ared btree as th
335d0 65 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 68 61  e argument.** ha
335e0 6e 64 6c 65 20 68 6f 6c 64 73 20 61 6e 20 65 78  ndle holds an ex
335f0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20  clusive lock on 
33600 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
33610 72 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20  r table..*/.int 
33620 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65  sqlite3BtreeSche
33630 6d 61 4c 6f 63 6b 65 64 28 42 74 72 65 65 20 2a  maLocked(Btree *
33640 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 71 75  p){.  return (qu
33650 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  eryTableLock(p, 
33660 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41  MASTER_ROOT, REA
33670 44 5f 4c 4f 43 4b 29 21 3d 53 51 4c 49 54 45 5f  D_LOCK)!=SQLITE_
33680 4f 4b 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  OK);.}...#ifndef
33690 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
336a0 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20  RED_CACHE./*.** 
336b0 4f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e  Obtain a lock on
336c0 20 74 68 65 20 74 61 62 6c 65 20 77 68 6f 73 65   the table whose
336d0 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 69 54   root page is iT
336e0 61 62 2e 20 20 54 68 65 0a 2a 2a 20 6c 6f 63 6b  ab.  The.** lock
336f0 20 69 73 20 61 20 77 72 69 74 65 20 6c 6f 63 6b   is a write lock
33700 20 69 66 20 69 73 57 72 69 74 65 6c 6f 63 6b 20   if isWritelock 
33710 69 73 20 74 72 75 65 20 6f 72 20 61 20 72 65 61  is true or a rea
33720 64 20 6c 6f 63 6b 0a 2a 2a 20 69 66 20 69 74 20  d lock.** if it 
33730 69 73 20 66 61 6c 73 65 2e 0a 2a 2f 0a 69 6e 74  is false..*/.int
33740 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 6f 63   sqlite3BtreeLoc
33750 6b 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c  kTable(Btree *p,
33760 20 69 6e 74 20 69 54 61 62 2c 20 75 38 20 69 73   int iTab, u8 is
33770 57 72 69 74 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e  WriteLock){.  in
33780 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
33790 3b 0a 20 20 75 38 20 6c 6f 63 6b 54 79 70 65 20  ;.  u8 lockType 
337a0 3d 20 28 69 73 57 72 69 74 65 4c 6f 63 6b 3f 57  = (isWriteLock?W
337b0 52 49 54 45 5f 4c 4f 43 4b 3a 52 45 41 44 5f 4c  RITE_LOCK:READ_L
337c0 4f 43 4b 29 3b 0a 20 20 72 63 20 3d 20 71 75 65  OCK);.  rc = que
337d0 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69  ryTableLock(p, i
337e0 54 61 62 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a  Tab, lockType);.
337f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
33800 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
33810 6c 6f 63 6b 54 61 62 6c 65 28 70 2c 20 69 54 61  lockTable(p, iTa
33820 62 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20  b, lockType);.  
33830 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
33840 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
33850 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 62  he following deb
33860 75 67 67 69 6e 67 20 69 6e 74 65 72 66 61 63 65  ugging interface
33870 20 68 61 73 20 74 6f 20 62 65 20 69 6e 20 74 68   has to be in th
33880 69 73 20 66 69 6c 65 20 28 72 61 74 68 65 72 0a  is file (rather.
33890 2a 2a 20 74 68 61 6e 20 69 6e 2c 20 66 6f 72 20  ** than in, for 
338a0 65 78 61 6d 70 6c 65 2c 20 74 65 73 74 31 2e 63  example, test1.c
338b0 29 20 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e  ) so that it can
338c0 20 67 65 74 20 61 63 63 65 73 73 20 74 6f 0a 2a   get access to.*
338d0 2a 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e  * the definition
338e0 20 6f 66 20 42 74 53 68 61 72 65 64 2e 0a 2a 2f   of BtShared..*/
338f0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
33900 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 64 65  ITE_DEBUG) && de
33910 66 69 6e 65 64 28 54 43 4c 53 48 29 0a 23 69 6e  fined(TCLSH).#in
33920 63 6c 75 64 65 20 3c 74 63 6c 2e 68 3e 0a 69 6e  clude <tcl.h>.in
33930 74 20 73 71 6c 69 74 65 33 5f 73 68 61 72 65 64  t sqlite3_shared
33940 5f 63 61 63 68 65 5f 72 65 70 6f 72 74 28 0a 20  _cache_report(. 
33950 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
33960 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
33970 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
33980 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
33990 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
339a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
339b0 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
339c0 45 0a 20 20 63 6f 6e 73 74 20 54 68 72 65 61 64  E.  const Thread
339d0 44 61 74 61 20 2a 70 54 64 20 3d 20 73 71 6c 69  Data *pTd = sqli
339e0 74 65 33 54 68 72 65 61 64 44 61 74 61 52 65 61  te3ThreadDataRea
339f0 64 4f 6e 6c 79 28 29 3b 0a 20 20 69 66 28 20 70  dOnly();.  if( p
33a00 54 64 2d 3e 75 73 65 53 68 61 72 65 64 44 61 74  Td->useSharedDat
33a10 61 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65  a ){.    BtShare
33a20 64 20 2a 70 42 74 3b 0a 20 20 20 20 54 63 6c 5f  d *pBt;.    Tcl_
33a30 4f 62 6a 20 2a 70 52 65 74 20 3d 20 54 63 6c 5f  Obj *pRet = Tcl_
33a40 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 66 6f  NewObj();.    fo
33a50 72 28 70 42 74 3d 70 54 64 2d 3e 70 42 74 72 65  r(pBt=pTd->pBtre
33a60 65 3b 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d  e; pBt; pBt=pBt-
33a70 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 63  >pNext){.      c
33a80 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
33a90 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
33aa0 66 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50  filename(pBt->pP
33ab0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 54 63 6c  ager);.      Tcl
33ac0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
33ad0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52  ement(interp, pR
33ae0 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  et, Tcl_NewStrin
33af0 67 4f 62 6a 28 7a 46 69 6c 65 2c 20 2d 31 29 29  gObj(zFile, -1))
33b00 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74  ;.      Tcl_List
33b10 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
33b20 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54  (interp, pRet, T
33b30 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 70 42 74  cl_NewIntObj(pBt
33b40 2d 3e 6e 52 65 66 29 29 3b 0a 20 20 20 20 7d 0a  ->nRef));.    }.
33b50 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
33b60 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65  sult(interp, pRe
33b70 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  t);.  }.#endif. 
33b80 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
33b90 7d 0a 23 65 6e 64 69 66 0a                       }.#endif.