/ Hex Artifact Content
Login

Artifact 4d4bef16fbf4f53ec3b161cfe5bb19bbc27a281d:


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 35 20 32 30 30 37 2f 30  c,v 1.335 2007/0
0190: 32 2f 31 30 20 31 39 3a 32 32 3a 33 36 20 64 72  2/10 19:22:36 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 2f 2a 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: 20 20 7b 20 73 71 6c 69 74 65 33 44 65 62 75 67    { sqlite3Debug
4a40: 50 72 69 6e 74 66 20 58 3b 20 66 66 6c 75 73 68  Printf X; fflush
4a50: 28 73 74 64 6f 75 74 29 3b 20 7d 20 2a 2f 20 5c  (stdout); } */ \
4a60: 0a 7b 20 70 72 69 6e 74 66 20 58 3b 20 66 66 6c  .{ printf X; ffl
4a70: 75 73 68 28 73 74 64 6f 75 74 29 3b 20 7d 0a 69  ush(stdout); }.i
4a80: 6e 74 20 73 71 6c 69 74 65 33 5f 62 74 72 65 65  nt sqlite3_btree
4a90: 5f 74 72 61 63 65 3d 30 3b 20 20 2f 2a 20 54 72  _trace=0;  /* Tr
4aa0: 75 65 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61  ue to enable tra
4ab0: 63 69 6e 67 20 2a 2f 0a 23 65 6c 73 65 0a 23 20  cing */.#else.# 
4ac0: 64 65 66 69 6e 65 20 54 52 41 43 45 28 58 29 0a  define TRACE(X).
4ad0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f  #endif../*.** Fo
4ae0: 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
4af0: 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n.*/.static int 
4b00: 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 42  checkReadLocks(B
4b10: 74 72 65 65 2a 2c 50 67 6e 6f 2c 42 74 43 75 72  tree*,Pgno,BtCur
4b20: 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65  sor*);../*.** Re
4b30: 61 64 20 6f 72 20 77 72 69 74 65 20 61 20 74 77  ad or write a tw
4b40: 6f 2d 20 61 6e 64 20 66 6f 75 72 2d 62 79 74 65  o- and four-byte
4b50: 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
4b60: 67 65 72 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73  ger values..*/.s
4b70: 74 61 74 69 63 20 75 33 32 20 67 65 74 32 62 79  tatic u32 get2by
4b80: 74 65 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  te(unsigned char
4b90: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 28   *p){.  return (
4ba0: 70 5b 30 5d 3c 3c 38 29 20 7c 20 70 5b 31 5d 3b  p[0]<<8) | p[1];
4bb0: 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20 67 65  .}.static u32 ge
4bc0: 74 34 62 79 74 65 28 75 6e 73 69 67 6e 65 64 20  t4byte(unsigned 
4bd0: 63 68 61 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  char *p){.  retu
4be0: 72 6e 20 28 70 5b 30 5d 3c 3c 32 34 29 20 7c 20  rn (p[0]<<24) | 
4bf0: 28 70 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 70 5b  (p[1]<<16) | (p[
4c00: 32 5d 3c 3c 38 29 20 7c 20 70 5b 33 5d 3b 0a 7d  2]<<8) | p[3];.}
4c10: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75 74  .static void put
4c20: 32 62 79 74 65 28 75 6e 73 69 67 6e 65 64 20 63  2byte(unsigned c
4c30: 68 61 72 20 2a 70 2c 20 75 33 32 20 76 29 7b 0a  har *p, u32 v){.
4c40: 20 20 70 5b 30 5d 20 3d 20 76 3e 3e 38 3b 0a 20    p[0] = v>>8;. 
4c50: 20 70 5b 31 5d 20 3d 20 76 3b 0a 7d 0a 73 74 61   p[1] = v;.}.sta
4c60: 74 69 63 20 76 6f 69 64 20 70 75 74 34 62 79 74  tic void put4byt
4c70: 65 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  e(unsigned char 
4c80: 2a 70 2c 20 75 33 32 20 76 29 7b 0a 20 20 70 5b  *p, u32 v){.  p[
4c90: 30 5d 20 3d 20 76 3e 3e 32 34 3b 0a 20 20 70 5b  0] = v>>24;.  p[
4ca0: 31 5d 20 3d 20 76 3e 3e 31 36 3b 0a 20 20 70 5b  1] = v>>16;.  p[
4cb0: 32 5d 20 3d 20 76 3e 3e 38 3b 0a 20 20 70 5b 33  2] = v>>8;.  p[3
4cc0: 5d 20 3d 20 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ] = v;.}../*.** 
4cd0: 52 6f 75 74 69 6e 65 73 20 74 6f 20 72 65 61 64  Routines to read
4ce0: 20 61 6e 64 20 77 72 69 74 65 20 76 61 72 69 61   and write varia
4cf0: 62 6c 65 2d 6c 65 6e 67 74 68 20 69 6e 74 65 67  ble-length integ
4d00: 65 72 73 2e 20 20 54 68 65 73 65 20 75 73 65 64  ers.  These used
4d10: 20 74 6f 0a 2a 2a 20 62 65 20 64 65 66 69 6e 65   to.** be define
4d20: 64 20 6c 6f 63 61 6c 6c 79 2c 20 62 75 74 20 6e  d locally, but n
4d30: 6f 77 20 77 65 20 75 73 65 20 74 68 65 20 76 61  ow we use the va
4d40: 72 69 6e 74 20 72 6f 75 74 69 6e 65 73 20 69 6e  rint routines in
4d50: 20 74 68 65 20 75 74 69 6c 2e 63 0a 2a 2a 20 66   the util.c.** f
4d60: 69 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ile..*/.#define 
4d70: 67 65 74 56 61 72 69 6e 74 20 20 20 20 73 71 6c  getVarint    sql
4d80: 69 74 65 33 47 65 74 56 61 72 69 6e 74 0a 2f 2a  ite3GetVarint./*
4d90: 20 23 64 65 66 69 6e 65 20 67 65 74 56 61 72 69   #define getVari
4da0: 6e 74 33 32 20 20 73 71 6c 69 74 65 33 47 65 74  nt32  sqlite3Get
4db0: 56 61 72 69 6e 74 33 32 20 2a 2f 0a 23 64 65 66  Varint32 */.#def
4dc0: 69 6e 65 20 67 65 74 56 61 72 69 6e 74 33 32 28  ine getVarint32(
4dd0: 41 2c 42 29 20 20 28 28 2a 42 3d 2a 28 41 29 29  A,B)  ((*B=*(A))
4de0: 3c 3d 30 78 37 66 3f 31 3a 73 71 6c 69 74 65 33  <=0x7f?1:sqlite3
4df0: 47 65 74 56 61 72 69 6e 74 33 32 28 41 2c 42 29  GetVarint32(A,B)
4e00: 29 0a 23 64 65 66 69 6e 65 20 70 75 74 56 61 72  ).#define putVar
4e10: 69 6e 74 20 20 20 20 73 71 6c 69 74 65 33 50 75  int    sqlite3Pu
4e20: 74 56 61 72 69 6e 74 0a 0a 2f 2a 20 54 68 65 20  tVarint../* The 
4e30: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 74 68  database page th
4e40: 65 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 6f  e PENDING_BYTE o
4e50: 63 63 75 70 69 65 73 2e 20 54 68 69 73 20 70 61  ccupies. This pa
4e60: 67 65 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  ge is never used
4e70: 2e 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20  ..** TODO: This 
4e80: 6d 61 63 72 6f 20 69 73 20 76 65 72 79 20 73 69  macro is very si
4e90: 6d 69 6c 61 72 79 20 74 6f 20 50 41 47 45 52 5f  milary to PAGER_
4ea0: 4d 4a 5f 50 47 4e 4f 28 29 20 69 6e 20 70 61 67  MJ_PGNO() in pag
4eb0: 65 72 2e 63 2e 20 54 68 65 79 0a 2a 2a 20 73 68  er.c. They.** sh
4ec0: 6f 75 6c 64 20 70 6f 73 73 69 62 6c 79 20 62 65  ould possibly be
4ed0: 20 63 6f 6e 73 6f 6c 69 64 61 74 65 64 20 28 70   consolidated (p
4ee0: 72 65 73 75 6d 61 62 6c 79 20 69 6e 20 70 61 67  resumably in pag
4ef0: 65 72 2e 68 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  er.h)..**.** If 
4f00: 64 69 73 6b 20 49 2f 4f 20 69 73 20 6f 6d 69 74  disk I/O is omit
4f10: 74 65 64 20 28 6d 65 61 6e 69 6e 67 20 74 68 61  ted (meaning tha
4f20: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  t the database i
4f30: 73 20 73 74 6f 72 65 64 20 70 75 72 65 6c 79 0a  s stored purely.
4f40: 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 29 20 74 68  ** in memory) th
4f50: 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70  en there is no p
4f60: 65 6e 64 69 6e 67 20 62 79 74 65 2e 0a 2a 2f 0a  ending byte..*/.
4f70: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
4f80: 49 54 5f 44 49 53 4b 49 4f 0a 23 20 64 65 66 69  IT_DISKIO.# defi
4f90: 6e 65 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  ne PENDING_BYTE_
4fa0: 50 41 47 45 28 70 42 74 29 20 20 30 78 37 66 66  PAGE(pBt)  0x7ff
4fb0: 66 66 66 66 66 0a 23 65 6c 73 65 0a 23 20 64 65  fffff.#else.# de
4fc0: 66 69 6e 65 20 50 45 4e 44 49 4e 47 5f 42 59 54  fine PENDING_BYT
4fd0: 45 5f 50 41 47 45 28 70 42 74 29 20 28 28 50 45  E_PAGE(pBt) ((PE
4fe0: 4e 44 49 4e 47 5f 42 59 54 45 2f 28 70 42 74 29  NDING_BYTE/(pBt)
4ff0: 2d 3e 70 61 67 65 53 69 7a 65 29 2b 31 29 0a 23  ->pageSize)+1).#
5000: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c  endif../*.** A l
5010: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 74 68  inked list of th
5020: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
5030: 63 74 75 72 65 73 20 69 73 20 73 74 6f 72 65 64  ctures is stored
5040: 20 61 74 20 42 74 53 68 61 72 65 64 2e 70 4c 6f   at BtShared.pLo
5050: 63 6b 2e 0a 2a 2a 20 4c 6f 63 6b 73 20 61 72 65  ck..** Locks are
5060: 20 61 64 64 65 64 20 28 6f 72 20 75 70 67 72 61   added (or upgra
5070: 64 65 64 20 66 72 6f 6d 20 52 45 41 44 5f 4c 4f  ded from READ_LO
5080: 43 4b 20 74 6f 20 57 52 49 54 45 5f 4c 4f 43 4b  CK to WRITE_LOCK
5090: 29 20 77 68 65 6e 20 61 20 63 75 72 73 6f 72 20  ) when a cursor 
50a0: 0a 2a 2a 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e  .** is opened on
50b0: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
50c0: 72 6f 6f 74 20 70 61 67 65 20 42 74 53 68 61 72  root page BtShar
50d0: 65 64 2e 69 54 61 62 6c 65 2e 20 4c 6f 63 6b 73  ed.iTable. Locks
50e0: 20 61 72 65 20 72 65 6d 6f 76 65 64 0a 2a 2a 20   are removed.** 
50f0: 66 72 6f 6d 20 74 68 69 73 20 6c 69 73 74 20 77  from this list w
5100: 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
5110: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 6f  n is committed o
5120: 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 6f  r rolled back, o
5130: 72 20 77 68 65 6e 0a 2a 2a 20 61 20 62 74 72 65  r when.** a btre
5140: 65 20 68 61 6e 64 6c 65 20 69 73 20 63 6c 6f 73  e handle is clos
5150: 65 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 42 74  ed..*/.struct Bt
5160: 4c 6f 63 6b 20 7b 0a 20 20 42 74 72 65 65 20 2a  Lock {.  Btree *
5170: 70 42 74 72 65 65 3b 20 20 20 20 20 20 20 20 2f  pBtree;        /
5180: 2a 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 68  * Btree handle h
5190: 6f 6c 64 69 6e 67 20 74 68 69 73 20 6c 6f 63 6b  olding this lock
51a0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54 61 62 6c   */.  Pgno iTabl
51b0: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  e;          /* R
51c0: 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c  oot page of tabl
51d0: 65 20 2a 2f 0a 20 20 75 38 20 65 4c 6f 63 6b 3b  e */.  u8 eLock;
51e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
51f0: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49  READ_LOCK or WRI
5200: 54 45 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 42 74 4c  TE_LOCK */.  BtL
5210: 6f 63 6b 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  ock *pNext;     
5220: 20 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 42 74     /* Next in Bt
5230: 53 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 73  Shared.pLock lis
5240: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 43 61 6e 64  t */.};../* Cand
5250: 69 64 61 74 65 20 76 61 6c 75 65 73 20 66 6f 72  idate values for
5260: 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 2a 2f   BtLock.eLock */
5270: 0a 23 64 65 66 69 6e 65 20 52 45 41 44 5f 4c 4f  .#define READ_LO
5280: 43 4b 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65  CK     1.#define
5290: 20 57 52 49 54 45 5f 4c 4f 43 4b 20 20 20 20 32   WRITE_LOCK    2
52a0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
52b0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
52c0: 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20  E.  /*.  ** The 
52d0: 66 75 6e 63 74 69 6f 6e 73 20 71 75 65 72 79 54  functions queryT
52e0: 61 62 6c 65 4c 6f 63 6b 28 29 2c 20 6c 6f 63 6b  ableLock(), lock
52f0: 54 61 62 6c 65 28 29 20 61 6e 64 20 75 6e 6c 6f  Table() and unlo
5300: 63 6b 41 6c 6c 54 61 62 6c 65 73 28 29 0a 20 20  ckAllTables().  
5310: 2a 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65 6e  ** manipulate en
5320: 74 72 69 65 73 20 69 6e 20 74 68 65 20 42 74 53  tries in the BtS
5330: 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b  hared.pLock link
5340: 65 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f 20  ed list used to 
5350: 73 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72 65  store.  ** share
5360: 64 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c 65  d-cache table le
5370: 76 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74 68  vel locks. If th
5380: 65 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d  e library is com
5390: 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a 20  piled with the. 
53a0: 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65   ** shared-cache
53b0: 20 66 65 61 74 75 72 65 20 64 69 73 61 62 6c 65   feature disable
53c0: 64 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  d, then there is
53d0: 20 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20 75   only ever one u
53e0: 73 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68  ser.  ** of each
53f0: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
5400: 75 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73 20  ure and so this 
5410: 6c 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20 6e  locking is not n
5420: 65 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a 20  ecessary. .  ** 
5430: 53 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c 6f  So define the lo
5440: 63 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63 74  ck related funct
5450: 69 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a  ions as no-ops..
5460: 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 71    */.  #define q
5470: 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 61 2c  ueryTableLock(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 6c 6f 63 6b 54 61 62   #define lockTab
54a0: 6c 65 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45  le(a,b,c) SQLITE
54b0: 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 75 6e  _OK.  #define un
54c0: 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28 61 29  lockAllTables(a)
54d0: 0a 23 65 6c 73 65 0a 0a 0a 2f 2a 0a 2a 2a 20 51  .#else.../*.** Q
54e0: 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20 62  uery to see if b
54f0: 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d 61  tree handle p ma
5500: 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  y obtain a lock 
5510: 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a  of type eLock .*
5520: 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  * (READ_LOCK or 
5530: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74  WRITE_LOCK) on t
5540: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
5550: 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52 65  ot-page iTab. Re
5560: 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  turn.** SQLITE_O
5570: 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61  K if the lock ma
5580: 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28 62  y be obtained (b
5590: 79 20 63 61 6c 6c 69 6e 67 20 6c 6f 63 6b 54 61  y calling lockTa
55a0: 62 6c 65 28 29 29 2c 20 6f 72 0a 2a 2a 20 53 51  ble()), or.** SQ
55b0: 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e  LITE_LOCKED if n
55c0: 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ot..*/.static in
55d0: 74 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b  t queryTableLock
55e0: 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20  (Btree *p, Pgno 
55f0: 69 54 61 62 2c 20 75 38 20 65 4c 6f 63 6b 29 7b  iTab, u8 eLock){
5600: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
5610: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c   = p->pBt;.  BtL
5620: 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 2f  ock *pIter;..  /
5630: 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  * This is a no-o
5640: 70 20 69 66 20 74 68 65 20 73 68 61 72 65 64 2d  p if the shared-
5650: 63 61 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61  cache is not ena
5660: 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 30 3d  bled */.  if( 0=
5670: 3d 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61  =sqlite3ThreadDa
5680: 74 61 52 65 61 64 4f 6e 6c 79 28 29 2d 3e 75 73  taReadOnly()->us
5690: 65 53 68 61 72 65 64 44 61 74 61 20 29 7b 0a 20  eSharedData ){. 
56a0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
56b0: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  _OK;.  }..  /* T
56c0: 68 69 73 20 28 61 6c 6f 6e 67 20 77 69 74 68 20  his (along with 
56d0: 6c 6f 63 6b 54 61 62 6c 65 28 29 29 20 69 73 20  lockTable()) is 
56e0: 77 68 65 72 65 20 74 68 65 20 52 65 61 64 55 6e  where the ReadUn
56f0: 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69  committed flag i
5700: 73 0a 20 20 2a 2a 20 64 65 61 6c 74 20 77 69 74  s.  ** dealt wit
5710: 68 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72  h. If the caller
5720: 20 69 73 20 71 75 65 72 79 69 6e 67 20 66 6f 72   is querying for
5730: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 61 6e 64   a read-lock and
5740: 20 74 68 65 20 66 6c 61 67 20 69 73 0a 20 20 2a   the flag is.  *
5750: 2a 20 73 65 74 2c 20 69 74 20 69 73 20 75 6e 63  * set, it is unc
5760: 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 67 72 61  onditionally gra
5770: 6e 74 65 64 20 2d 20 65 76 65 6e 20 69 66 20 74  nted - even if t
5780: 68 65 72 65 20 61 72 65 20 77 72 69 74 65 2d 6c  here are write-l
5790: 6f 63 6b 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  ocks.  ** on the
57a0: 20 74 61 62 6c 65 2e 20 49 66 20 61 20 77 72 69   table. If a wri
57b0: 74 65 2d 6c 6f 63 6b 20 69 73 20 72 65 71 75 65  te-lock is reque
57c0: 73 74 65 64 2c 20 74 68 65 20 52 65 61 64 55 6e  sted, the ReadUn
57d0: 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 0a 20  committed flag. 
57e0: 20 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69   ** is not consi
57f0: 64 65 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  dered..  **.  **
5800: 20 49 6e 20 66 75 6e 63 74 69 6f 6e 20 6c 6f 63   In function loc
5810: 6b 54 61 62 6c 65 28 29 2c 20 69 66 20 61 20 72  kTable(), if a r
5820: 65 61 64 2d 6c 6f 63 6b 20 69 73 20 64 65 6d 61  ead-lock is dema
5830: 6e 64 65 64 20 61 6e 64 20 74 68 65 20 0a 20 20  nded and the .  
5840: 2a 2a 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  ** ReadUncommitt
5850: 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  ed flag is set, 
5860: 6e 6f 20 65 6e 74 72 79 20 69 73 20 61 64 64 65  no entry is adde
5870: 64 20 74 6f 20 74 68 65 20 6c 6f 63 6b 73 20 6c  d to the locks l
5880: 69 73 74 20 0a 20 20 2a 2a 20 28 42 74 53 68 61  ist .  ** (BtSha
5890: 72 65 64 2e 70 4c 6f 63 6b 29 2e 0a 20 20 2a 2a  red.pLock)..  **
58a0: 0a 20 20 2a 2a 20 54 6f 20 73 75 6d 6d 61 72 69  .  ** To summari
58b0: 7a 65 3a 20 49 66 20 74 68 65 20 52 65 61 64 55  ze: If the ReadU
58c0: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20  ncommitted flag 
58d0: 69 73 20 73 65 74 2c 20 74 68 65 6e 20 72 65 61  is set, then rea
58e0: 64 20 63 75 72 73 6f 72 73 20 64 6f 0a 20 20 2a  d cursors do.  *
58f0: 2a 20 6e 6f 74 20 63 72 65 61 74 65 20 6f 72 20  * not create or 
5900: 72 65 73 70 65 63 74 20 74 61 62 6c 65 20 6c 6f  respect table lo
5910: 63 6b 73 2e 20 54 68 65 20 6c 6f 63 6b 69 6e 67  cks. The locking
5920: 20 70 72 6f 63 65 64 75 72 65 20 66 6f 72 20 61   procedure for a
5930: 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 63 75 72   .  ** write-cur
5940: 73 6f 72 20 64 6f 65 73 20 6e 6f 74 20 63 68 61  sor does not cha
5950: 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  nge..  */.  if( 
5960: 0a 20 20 20 20 21 70 2d 3e 70 53 71 6c 69 74 65  .    !p->pSqlite
5970: 20 7c 7c 20 0a 20 20 20 20 30 3d 3d 28 70 2d 3e   || .    0==(p->
5980: 70 53 71 6c 69 74 65 2d 3e 66 6c 61 67 73 26 53  pSqlite->flags&S
5990: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
59a0: 69 74 74 65 64 29 20 7c 7c 20 0a 20 20 20 20 65  itted) || .    e
59b0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
59c0: 20 7c 7c 0a 20 20 20 20 69 54 61 62 3d 3d 4d 41   ||.    iTab==MA
59d0: 53 54 45 52 5f 52 4f 4f 54 0a 20 20 29 7b 0a 20  STER_ROOT.  ){. 
59e0: 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74     for(pIter=pBt
59f0: 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
5a00: 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
5a10: 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  xt){.      if( p
5a20: 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20  Iter->pBtree!=p 
5a30: 26 26 20 70 49 74 65 72 2d 3e 69 54 61 62 6c 65  && pIter->iTable
5a40: 3d 3d 69 54 61 62 20 26 26 20 0a 20 20 20 20 20  ==iTab && .     
5a50: 20 20 20 20 20 28 70 49 74 65 72 2d 3e 65 4c 6f       (pIter->eLo
5a60: 63 6b 21 3d 65 4c 6f 63 6b 20 7c 7c 20 65 4c 6f  ck!=eLock || eLo
5a70: 63 6b 21 3d 52 45 41 44 5f 4c 4f 43 4b 29 20 29  ck!=READ_LOCK) )
5a80: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
5a90: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a   SQLITE_LOCKED;.
5aa0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
5ab0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
5ac0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
5ad0: 64 64 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  dd a lock on the
5ae0: 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74   table with root
5af0: 2d 70 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20  -page iTable to 
5b00: 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
5b10: 20 75 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65   used.** by Btre
5b20: 65 20 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61  e handle p. Para
5b30: 6d 65 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74  meter eLock must
5b40: 20 62 65 20 65 69 74 68 65 72 20 52 45 41 44 5f   be either READ_
5b50: 4c 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54  LOCK or .** WRIT
5b60: 45 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51  E_LOCK..**.** SQ
5b70: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
5b80: 6e 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  ned if the lock 
5b90: 69 73 20 61 64 64 65 64 20 73 75 63 63 65 73 73  is added success
5ba0: 66 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 42 55  fully. SQLITE_BU
5bb0: 53 59 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45  SY and.** SQLITE
5bc0: 5f 4e 4f 4d 45 4d 20 6d 61 79 20 61 6c 73 6f 20  _NOMEM may also 
5bd0: 62 65 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  be returned..*/.
5be0: 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 54  static int lockT
5bf0: 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 50  able(Btree *p, P
5c00: 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38 20 65  gno iTable, u8 e
5c10: 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65  Lock){.  BtShare
5c20: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
5c30: 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b  .  BtLock *pLock
5c40: 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a   = 0;.  BtLock *
5c50: 70 49 74 65 72 3b 0a 0a 20 20 2f 2a 20 54 68 69  pIter;..  /* Thi
5c60: 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  s is a no-op if 
5c70: 74 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65  the shared-cache
5c80: 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20   is not enabled 
5c90: 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69  */.  if( 0==sqli
5ca0: 74 65 33 54 68 72 65 61 64 44 61 74 61 52 65 61  te3ThreadDataRea
5cb0: 64 4f 6e 6c 79 28 29 2d 3e 75 73 65 53 68 61 72  dOnly()->useShar
5cc0: 65 64 44 61 74 61 20 29 7b 0a 20 20 20 20 72 65  edData ){.    re
5cd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
5ce0: 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 53    }..  assert( S
5cf0: 51 4c 49 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 54  QLITE_OK==queryT
5d00: 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62  ableLock(p, iTab
5d10: 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20  le, eLock) );.. 
5d20: 20 2f 2a 20 49 66 20 74 68 65 20 72 65 61 64 2d   /* If the read-
5d30: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  uncommitted flag
5d40: 20 69 73 20 73 65 74 20 61 6e 64 20 61 20 72 65   is set and a re
5d50: 61 64 2d 6c 6f 63 6b 20 69 73 20 72 65 71 75 65  ad-lock is reque
5d60: 73 74 65 64 2c 0a 20 20 2a 2a 20 72 65 74 75 72  sted,.  ** retur
5d70: 6e 20 65 61 72 6c 79 20 77 69 74 68 6f 75 74 20  n early without 
5d80: 61 64 64 69 6e 67 20 61 6e 20 65 6e 74 72 79 20  adding an entry 
5d90: 74 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  to the BtShared.
5da0: 70 4c 6f 63 6b 20 6c 69 73 74 2e 20 53 65 65 0a  pLock list. See.
5db0: 20 20 2a 2a 20 63 6f 6d 6d 65 6e 74 20 69 6e 20    ** comment in 
5dc0: 66 75 6e 63 74 69 6f 6e 20 71 75 65 72 79 54 61  function queryTa
5dd0: 62 6c 65 4c 6f 63 6b 28 29 20 66 6f 72 20 6d 6f  bleLock() for mo
5de0: 72 65 20 69 6e 66 6f 20 6f 6e 20 68 61 6e 64 6c  re info on handl
5df0: 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20 52 65  ing .  ** the Re
5e00: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  adUncommitted fl
5e10: 61 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a  ag..  */.  if( .
5e20: 20 20 20 20 28 70 2d 3e 70 53 71 6c 69 74 65 29      (p->pSqlite)
5e30: 20 26 26 20 0a 20 20 20 20 28 70 2d 3e 70 53 71   && .    (p->pSq
5e40: 6c 69 74 65 2d 3e 66 6c 61 67 73 26 53 51 4c 49  lite->flags&SQLI
5e50: 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  TE_ReadUncommitt
5e60: 65 64 29 20 26 26 20 0a 20 20 20 20 28 65 4c 6f  ed) && .    (eLo
5e70: 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29 20 26  ck==READ_LOCK) &
5e80: 26 0a 20 20 20 20 69 54 61 62 6c 65 21 3d 4d 41  &.    iTable!=MA
5e90: 53 54 45 52 5f 52 4f 4f 54 0a 20 20 29 7b 0a 20  STER_ROOT.  ){. 
5ea0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5eb0: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  _OK;.  }..  /* F
5ec0: 69 72 73 74 20 73 65 61 72 63 68 20 74 68 65 20  irst search the 
5ed0: 6c 69 73 74 20 66 6f 72 20 61 6e 20 65 78 69 73  list for an exis
5ee0: 74 69 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69  ting lock on thi
5ef0: 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f  s table. */.  fo
5f00: 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f  r(pIter=pBt->pLo
5f10: 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72  ck; pIter; pIter
5f20: 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a  =pIter->pNext){.
5f30: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69      if( pIter->i
5f40: 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26  Table==iTable &&
5f50: 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d   pIter->pBtree==
5f60: 70 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b  p ){.      pLock
5f70: 20 3d 20 70 49 74 65 72 3b 0a 20 20 20 20 20 20   = pIter;.      
5f80: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
5f90: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61 62  ..  /* If the ab
5fa0: 6f 76 65 20 73 65 61 72 63 68 20 64 69 64 20 6e  ove search did n
5fb0: 6f 74 20 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b  ot find a BtLock
5fc0: 20 73 74 72 75 63 74 20 61 73 73 6f 63 69 61 74   struct associat
5fd0: 69 6e 67 20 42 74 72 65 65 20 70 0a 20 20 2a 2a  ing Btree p.  **
5fe0: 20 77 69 74 68 20 74 61 62 6c 65 20 69 54 61 62   with table iTab
5ff0: 6c 65 2c 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65  le, allocate one
6000: 20 61 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74   and link it int
6010: 6f 20 74 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f  o the list..  */
6020: 0a 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b  .  if( !pLock ){
6030: 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74  .    pLock = (Bt
6040: 4c 6f 63 6b 20 2a 29 73 71 6c 69 74 65 4d 61 6c  Lock *)sqliteMal
6050: 6c 6f 63 28 73 69 7a 65 6f 66 28 42 74 4c 6f 63  loc(sizeof(BtLoc
6060: 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4c  k));.    if( !pL
6070: 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ock ){.      ret
6080: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
6090: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63  ;.    }.    pLoc
60a0: 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  k->iTable = iTab
60b0: 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70  le;.    pLock->p
60c0: 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70  Btree = p;.    p
60d0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42  Lock->pNext = pB
60e0: 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42  t->pLock;.    pB
60f0: 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b  t->pLock = pLock
6100: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
6110: 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b  the BtLock.eLock
6120: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65   variable to the
6130: 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20   maximum of the 
6140: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a  current lock.  *
6150: 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  * and the reques
6160: 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d  ted lock. This m
6170: 65 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d  eans if a write-
6180: 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79  lock was already
6190: 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61   held.  ** and a
61a0: 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65   read-lock reque
61b0: 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69  sted, we don't i
61c0: 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67  ncorrectly downg
61d0: 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20  rade the lock.. 
61e0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52   */.  assert( WR
61f0: 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f  ITE_LOCK>READ_LO
6200: 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63  CK );.  if( eLoc
6210: 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29  k>pLock->eLock )
6220: 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f  {.    pLock->eLo
6230: 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = eLock;.  }.
6240: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
6250: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
6260: 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61  lease all the ta
6270: 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73  ble locks (locks
6280: 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61   obtained via ca
6290: 6c 6c 73 20 74 6f 20 74 68 65 20 6c 6f 63 6b 54  lls to the lockT
62a0: 61 62 6c 65 28 29 0a 2a 2a 20 70 72 6f 63 65 64  able().** proced
62b0: 75 72 65 29 20 68 65 6c 64 20 62 79 20 42 74 72  ure) held by Btr
62c0: 65 65 20 68 61 6e 64 6c 65 20 70 2e 0a 2a 2f 0a  ee handle p..*/.
62d0: 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f  static void unlo
62e0: 63 6b 41 6c 6c 54 61 62 6c 65 73 28 42 74 72 65  ckAllTables(Btre
62f0: 65 20 2a 70 29 7b 0a 20 20 42 74 4c 6f 63 6b 20  e *p){.  BtLock 
6300: 2a 2a 70 70 49 74 65 72 20 3d 20 26 70 2d 3e 70  **ppIter = &p->p
6310: 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a  Bt->pLock;..  /*
6320: 20 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 63   If the shared-c
6330: 61 63 68 65 20 65 78 74 65 6e 73 69 6f 6e 20 69  ache extension i
6340: 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 2c 20 74  s not enabled, t
6350: 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 6e  here should be n
6360: 6f 0a 20 20 2a 2a 20 6c 6f 63 6b 73 20 69 6e 20  o.  ** locks in 
6370: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f  the BtShared.pLo
6380: 63 6b 20 6c 69 73 74 2c 20 6d 61 6b 69 6e 67 20  ck list, making 
6390: 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 61  this procedure a
63a0: 20 6e 6f 2d 6f 70 2e 20 41 73 73 65 72 74 0a 20   no-op. Assert. 
63b0: 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 69 73   ** that this is
63c0: 20 74 68 65 20 63 61 73 65 2e 0a 20 20 2a 2f 0a   the case..  */.
63d0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
63e0: 33 54 68 72 65 61 64 44 61 74 61 52 65 61 64 4f  3ThreadDataReadO
63f0: 6e 6c 79 28 29 2d 3e 75 73 65 53 68 61 72 65 64  nly()->useShared
6400: 44 61 74 61 20 7c 7c 20 30 3d 3d 2a 70 70 49 74  Data || 0==*ppIt
6410: 65 72 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20  er );..  while( 
6420: 2a 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20 42  *ppIter ){.    B
6430: 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a  tLock *pLock = *
6440: 70 70 49 74 65 72 3b 0a 20 20 20 20 69 66 28 20  ppIter;.    if( 
6450: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70  pLock->pBtree==p
6460: 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 49 74 65   ){.      *ppIte
6470: 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74  r = pLock->pNext
6480: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  ;.      sqliteFr
6490: 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 7d  ee(pLock);.    }
64a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 49 74  else{.      ppIt
64b0: 65 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65  er = &pLock->pNe
64c0: 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  xt;.    }.  }.}.
64d0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
64e0: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
64f0: 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f  HE */..static vo
6500: 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d  id releasePage(M
6510: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20  emPage *pPage); 
6520: 20 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65   /* Forward refe
6530: 72 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  rence */../*.** 
6540: 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74  Save the current
6550: 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
6560: 20 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65   in the variable
6570: 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20  s BtCursor.nKey 
6580: 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72  .** and BtCursor
6590: 2e 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f  .pKey. The curso
65a0: 72 27 73 20 73 74 61 74 65 20 69 73 20 73 65 74  r's state is set
65b0: 20 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49   to CURSOR_REQUI
65c0: 52 45 53 45 45 4b 2e 0a 2a 2f 0a 73 74 61 74 69  RESEEK..*/.stati
65d0: 63 20 69 6e 74 20 73 61 76 65 43 75 72 73 6f 72  c int saveCursor
65e0: 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f  Position(BtCurso
65f0: 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
6600: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 43  rc;..  assert( C
6610: 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75  URSOR_VALID==pCu
6620: 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20 20 61  r->eState );.  a
6630: 73 73 65 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e  ssert( 0==pCur->
6640: 70 4b 65 79 20 29 3b 0a 0a 20 20 72 63 20 3d 20  pKey );..  rc = 
6650: 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
6660: 69 7a 65 28 70 43 75 72 2c 20 26 70 43 75 72 2d  ize(pCur, &pCur-
6670: 3e 6e 4b 65 79 29 3b 0a 0a 20 20 2f 2a 20 49 66  >nKey);..  /* If
6680: 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b   this is an intK
6690: 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74  ey table, then t
66a0: 68 65 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f  he above call to
66b0: 20 42 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a   BtreeKeySize().
66c0: 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20    ** stores the 
66d0: 69 6e 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70  integer key in p
66e0: 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68  Cur->nKey. In th
66f0: 69 73 20 63 61 73 65 20 74 68 69 73 20 76 61 6c  is case this val
6700: 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74  ue is.  ** all t
6710: 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64 2e  hat is required.
6720: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70   Otherwise, if p
6730: 43 75 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20  Cur is not open 
6740: 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a  on an intKey.  *
6750: 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61  * table, then ma
6760: 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61  lloc space for a
6770: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 70 43 75  nd store the pCu
6780: 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66  r->nKey bytes of
6790: 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e   key .  ** data.
67a0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
67b0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d  SQLITE_OK && 0==
67c0: 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74  pCur->pPage->int
67d0: 4b 65 79 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a  Key){.    void *
67e0: 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 4d 61 6c  pKey = sqliteMal
67f0: 6c 6f 63 28 70 43 75 72 2d 3e 6e 4b 65 79 29 3b  loc(pCur->nKey);
6800: 0a 20 20 20 20 69 66 28 20 70 4b 65 79 20 29 7b  .    if( pKey ){
6810: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
6820: 74 65 33 42 74 72 65 65 4b 65 79 28 70 43 75 72  te3BtreeKey(pCur
6830: 2c 20 30 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c  , 0, pCur->nKey,
6840: 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66   pKey);.      if
6850: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6860: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
6870: 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20  >pKey = pKey;.  
6880: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6890: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4b     sqliteFree(pK
68a0: 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ey);.      }.   
68b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
68c0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
68d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
68e0: 65 72 74 28 20 21 70 43 75 72 2d 3e 70 50 61 67  ert( !pCur->pPag
68f0: 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21 70 43  e->intKey || !pC
6900: 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69  ur->pKey );..  i
6910: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
6920: 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50   ){.    releaseP
6930: 61 67 65 28 70 43 75 72 2d 3e 70 50 61 67 65 29  age(pCur->pPage)
6940: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 50 61 67  ;.    pCur->pPag
6950: 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d  e = 0;.    pCur-
6960: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
6970: 5f 52 45 51 55 49 52 45 53 45 45 4b 3b 0a 20 20  _REQUIRESEEK;.  
6980: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
6990: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68  }../*.** Save th
69a0: 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61  e positions of a
69b0: 6c 6c 20 63 75 72 73 6f 72 73 20 65 78 63 65 70  ll cursors excep
69c0: 74 20 70 45 78 63 65 70 74 20 6f 70 65 6e 20 6f  t pExcept open o
69d0: 6e 20 74 68 65 20 74 61 62 6c 65 20 0a 2a 2a 20  n the table .** 
69e0: 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69  with root-page i
69f0: 52 6f 6f 74 2e 20 55 73 75 61 6c 6c 79 2c 20 74  Root. Usually, t
6a00: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 6a 75  his is called ju
6a10: 73 74 20 62 65 66 6f 72 65 20 63 75 72 73 6f 72  st before cursor
6a20: 0a 2a 2a 20 70 45 78 63 65 70 74 20 69 73 20 75  .** pExcept is u
6a30: 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  sed to modify th
6a40: 65 20 74 61 62 6c 65 20 28 42 74 72 65 65 44 65  e table (BtreeDe
6a50: 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65 65 49  lete() or BtreeI
6a60: 6e 73 65 72 74 28 29 29 2e 0a 2a 2f 0a 73 74 61  nsert())..*/.sta
6a70: 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c 6c 43  tic int saveAllC
6a80: 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20  ursors(BtShared 
6a90: 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f 6f 74  *pBt, Pgno iRoot
6aa0: 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63  , BtCursor *pExc
6ab0: 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  ept){.  BtCursor
6ac0: 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74   *p;.  for(p=pBt
6ad0: 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
6ae0: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
6af0: 66 28 20 70 21 3d 70 45 78 63 65 70 74 20 26 26  f( p!=pExcept &&
6b00: 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d   (0==iRoot || p-
6b10: 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74  >pgnoRoot==iRoot
6b20: 29 20 26 26 20 0a 20 20 20 20 20 20 20 20 70 2d  ) && .        p-
6b30: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
6b40: 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 69  VALID ){.      i
6b50: 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75 72 73  nt rc = saveCurs
6b60: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20  orPosition(p);. 
6b70: 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
6b80: 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20  OK!=rc ){.      
6b90: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
6ba0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
6bb0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
6bc0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74  K;.}../*.** Rest
6bd0: 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ore the cursor t
6be0: 6f 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69  o the position i
6bf0: 74 20 77 61 73 20 69 6e 20 28 6f 72 20 61 73 20  t was in (or as 
6c00: 63 6c 6f 73 65 20 74 6f 20 61 73 20 70 6f 73 73  close to as poss
6c10: 69 62 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61  ible).** when sa
6c20: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
6c30: 28 29 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e  () was called. N
6c40: 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61  ote that this ca
6c50: 6c 6c 20 64 65 6c 65 74 65 73 20 74 68 65 20 0a  ll deletes the .
6c60: 2a 2a 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f  ** saved positio
6c70: 6e 20 69 6e 66 6f 20 73 74 6f 72 65 64 20 62 79  n info stored by
6c80: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
6c90: 69 6f 6e 28 29 2c 20 73 6f 20 74 68 65 72 65 20  ion(), so there 
6ca0: 63 61 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73  can be.** at mos
6cb0: 74 20 6f 6e 65 20 65 66 66 65 63 74 69 76 65 20  t one effective 
6cc0: 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75  restoreOrClearCu
6cd0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 63  rsorPosition() c
6ce0: 61 6c 6c 20 61 66 74 65 72 20 65 61 63 68 20 0a  all after each .
6cf0: 2a 2a 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  ** saveCursorPos
6d00: 69 74 69 6f 6e 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  ition()..**.** I
6d10: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
6d20: 75 6d 65 6e 74 20 61 72 67 75 6d 65 6e 74 20 2d  ument argument -
6d30: 20 64 6f 53 65 65 6b 20 2d 20 69 73 20 66 61 6c   doSeek - is fal
6d40: 73 65 2c 20 74 68 65 6e 20 69 6e 73 74 65 61 64  se, then instead
6d50: 20 6f 66 20 0a 2a 2a 20 72 65 74 75 72 6e 69 6e   of .** returnin
6d60: 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  g the cursor to 
6d70: 69 74 27 73 20 73 61 76 65 64 20 70 6f 73 69 74  it's saved posit
6d80: 69 6f 6e 2c 20 61 6e 79 20 73 61 76 65 64 20 70  ion, any saved p
6d90: 6f 73 69 74 69 6f 6e 20 69 73 20 64 65 6c 65 74  osition is delet
6da0: 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 75  ed.** and the cu
6db0: 72 73 6f 72 20 73 74 61 74 65 20 73 65 74 20 74  rsor state set t
6dc0: 6f 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  o CURSOR_INVALID
6dd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6de0: 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75  restoreOrClearCu
6df0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 58 28 42 74  rsorPositionX(Bt
6e00: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
6e10: 74 20 64 6f 53 65 65 6b 29 7b 0a 20 20 69 6e 74  t doSeek){.  int
6e20: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
6e30: 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
6e40: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
6e50: 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
6e60: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
6e70: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
6e80: 20 20 69 66 28 20 64 6f 53 65 65 6b 20 29 7b 0a    if( doSeek ){.
6e90: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
6ea0: 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72  BtreeMoveto(pCur
6eb0: 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43  , pCur->pKey, pC
6ec0: 75 72 2d 3e 6e 4b 65 79 2c 20 26 70 43 75 72 2d  ur->nKey, &pCur-
6ed0: 3e 73 6b 69 70 29 3b 0a 20 20 7d 0a 20 20 69 66  >skip);.  }.  if
6ee0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6ef0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
6f00: 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20  e(pCur->pKey);. 
6f10: 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20     pCur->pKey = 
6f20: 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 43  0;.    assert( C
6f30: 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75  URSOR_VALID==pCu
6f40: 72 2d 3e 65 53 74 61 74 65 20 7c 7c 20 43 55 52  r->eState || CUR
6f50: 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75  SOR_INVALID==pCu
6f60: 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20 20 7d  r->eState );.  }
6f70: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
6f80: 0a 23 64 65 66 69 6e 65 20 72 65 73 74 6f 72 65  .#define restore
6f90: 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73  OrClearCursorPos
6fa0: 69 74 69 6f 6e 28 70 2c 78 29 20 5c 0a 20 20 28  ition(p,x) \.  (
6fb0: 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  p->eState==CURSO
6fc0: 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3f 72 65  R_REQUIRESEEK?re
6fd0: 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73  storeOrClearCurs
6fe0: 6f 72 50 6f 73 69 74 69 6f 6e 58 28 70 2c 78 29  orPositionX(p,x)
6ff0: 3a 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 23 69 66  :SQLITE_OK)..#if
7000: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7010: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
7020: 2a 20 54 68 65 73 65 20 6d 61 63 72 6f 73 20 64  * These macros d
7030: 65 66 69 6e 65 20 74 68 65 20 6c 6f 63 61 74 69  efine the locati
7040: 6f 6e 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65  on of the pointe
7050: 72 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20  r-map entry for 
7060: 61 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 70  a .** database p
7070: 61 67 65 2e 20 54 68 65 20 66 69 72 73 74 20 61  age. The first a
7080: 72 67 75 6d 65 6e 74 20 74 6f 20 65 61 63 68 20  rgument to each 
7090: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
70a0: 20 75 73 61 62 6c 65 0a 2a 2a 20 62 79 74 65 73   usable.** bytes
70b0: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66   on each page of
70c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 6f   the database (o
70d0: 66 74 65 6e 20 31 30 32 34 29 2e 20 54 68 65 20  ften 1024). The 
70e0: 73 65 63 6f 6e 64 20 69 73 20 74 68 65 0a 2a 2a  second is the.**
70f0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   page number to 
7100: 6c 6f 6f 6b 20 75 70 20 69 6e 20 74 68 65 20 70  look up in the p
7110: 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a  ointer map..**.*
7120: 2a 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 20  * PTRMAP_PAGENO 
7130: 72 65 74 75 72 6e 73 20 74 68 65 20 64 61 74 61  returns the data
7140: 62 61 73 65 20 70 61 67 65 20 6e 75 6d 62 65 72  base page number
7150: 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   of the pointer-
7160: 6d 61 70 0a 2a 2a 20 70 61 67 65 20 74 68 61 74  map.** page that
7170: 20 73 74 6f 72 65 73 20 74 68 65 20 72 65 71 75   stores the requ
7180: 69 72 65 64 20 70 6f 69 6e 74 65 72 2e 20 50 54  ired pointer. PT
7190: 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 20 72  RMAP_PTROFFSET r
71a0: 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 6f 66  eturns.** the of
71b0: 66 73 65 74 20 6f 66 20 74 68 65 20 72 65 71 75  fset of the requ
71c0: 65 73 74 65 64 20 6d 61 70 20 65 6e 74 72 79 2e  ested map entry.
71d0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 67  .**.** If the pg
71e0: 6e 6f 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  no argument pass
71f0: 65 64 20 74 6f 20 50 54 52 4d 41 50 5f 50 41 47  ed to PTRMAP_PAG
7200: 45 4e 4f 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ENO is a pointer
7210: 2d 6d 61 70 20 70 61 67 65 2c 0a 2a 2a 20 74 68  -map page,.** th
7220: 65 6e 20 70 67 6e 6f 20 69 73 20 72 65 74 75 72  en pgno is retur
7230: 6e 65 64 2e 20 53 6f 20 28 70 67 6e 6f 3d 3d 50  ned. So (pgno==P
7240: 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 67 73  TRMAP_PAGENO(pgs
7250: 7a 2c 20 70 67 6e 6f 29 29 20 63 61 6e 20 62 65  z, pgno)) can be
7260: 0a 2a 2a 20 75 73 65 64 20 74 6f 20 74 65 73 74  .** used to test
7270: 20 69 66 20 70 67 6e 6f 20 69 73 20 61 20 70 6f   if pgno is a po
7280: 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2e 20  inter-map page. 
7290: 50 54 52 4d 41 50 5f 49 53 50 41 47 45 20 69 6d  PTRMAP_ISPAGE im
72a0: 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 69 73  plements.** this
72b0: 20 74 65 73 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e   test..*/.#defin
72c0: 65 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  e PTRMAP_PAGENO(
72d0: 70 42 74 2c 20 70 67 6e 6f 29 20 70 74 72 6d 61  pBt, pgno) ptrma
72e0: 70 50 61 67 65 6e 6f 28 70 42 74 2c 20 70 67 6e  pPageno(pBt, pgn
72f0: 6f 29 0a 23 64 65 66 69 6e 65 20 50 54 52 4d 41  o).#define PTRMA
7300: 50 5f 50 54 52 4f 46 46 53 45 54 28 70 42 74 2c  P_PTROFFSET(pBt,
7310: 20 70 67 6e 6f 29 20 28 35 2a 28 70 67 6e 6f 2d   pgno) (5*(pgno-
7320: 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 70 42 74  ptrmapPageno(pBt
7330: 2c 20 70 67 6e 6f 29 2d 31 29 29 0a 23 64 65 66  , pgno)-1)).#def
7340: 69 6e 65 20 50 54 52 4d 41 50 5f 49 53 50 41 47  ine PTRMAP_ISPAG
7350: 45 28 70 42 74 2c 20 70 67 6e 6f 29 20 28 50 54  E(pBt, pgno) (PT
7360: 52 4d 41 50 5f 50 41 47 45 4e 4f 28 28 70 42 74  RMAP_PAGENO((pBt
7370: 29 2c 28 70 67 6e 6f 29 29 3d 3d 28 70 67 6e 6f  ),(pgno))==(pgno
7380: 29 29 0a 0a 73 74 61 74 69 63 20 50 67 6e 6f 20  ))..static Pgno 
7390: 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 42 74 53  ptrmapPageno(BtS
73a0: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
73b0: 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50   pgno){.  int nP
73c0: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 20 3d  agesPerMapPage =
73d0: 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a   (pBt->usableSiz
73e0: 65 2f 35 29 2b 31 3b 0a 20 20 69 6e 74 20 69 50  e/5)+1;.  int iP
73f0: 74 72 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29  trMap = (pgno-2)
7400: 2f 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67  /nPagesPerMapPag
7410: 65 3b 0a 20 20 69 6e 74 20 72 65 74 20 3d 20 28  e;.  int ret = (
7420: 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50 65  iPtrMap*nPagesPe
7430: 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20 0a  rMapPage) + 2; .
7440: 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44 49    if( ret==PENDI
7450: 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
7460: 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a  ) ){.    ret++;.
7470: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74    }.  return ret
7480: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  ;.}../*.** The p
7490: 6f 69 6e 74 65 72 20 6d 61 70 20 69 73 20 61 20  ointer map is a 
74a0: 6c 6f 6f 6b 75 70 20 74 61 62 6c 65 20 74 68 61  lookup table tha
74b0: 74 20 69 64 65 6e 74 69 66 69 65 73 20 74 68 65  t identifies the
74c0: 20 70 61 72 65 6e 74 20 70 61 67 65 20 66 6f 72   parent page for
74d0: 0a 2a 2a 20 65 61 63 68 20 63 68 69 6c 64 20 70  .** each child p
74e0: 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  age in the datab
74f0: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20 70  ase file.  The p
7500: 61 72 65 6e 74 20 70 61 67 65 20 69 73 20 74 68  arent page is th
7510: 65 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 63  e page that.** c
7520: 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
7530: 72 20 74 6f 20 74 68 65 20 63 68 69 6c 64 2e 20  r to the child. 
7540: 20 45 76 65 72 79 20 70 61 67 65 20 69 6e 20 74   Every page in t
7550: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  he database cont
7560: 61 69 6e 73 0a 2a 2a 20 30 20 6f 72 20 31 20 70  ains.** 0 or 1 p
7570: 61 72 65 6e 74 20 70 61 67 65 73 2e 20 20 28 49  arent pages.  (I
7580: 6e 20 74 68 69 73 20 63 6f 6e 74 65 78 74 20 27  n this context '
7590: 64 61 74 61 62 61 73 65 20 70 61 67 65 27 20 72  database page' r
75a0: 65 66 65 72 73 0a 2a 2a 20 74 6f 20 61 6e 79 20  efers.** to any 
75b0: 70 61 67 65 20 74 68 61 74 20 69 73 20 6e 6f 74  page that is not
75c0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 6f 69   part of the poi
75d0: 6e 74 65 72 20 6d 61 70 20 69 74 73 65 6c 66 2e  nter map itself.
75e0: 29 20 20 45 61 63 68 20 70 6f 69 6e 74 65 72 20  )  Each pointer 
75f0: 6d 61 70 0a 2a 2a 20 65 6e 74 72 79 20 63 6f 6e  map.** entry con
7600: 73 69 73 74 73 20 6f 66 20 61 20 73 69 6e 67 6c  sists of a singl
7610: 65 20 62 79 74 65 20 27 74 79 70 65 27 20 61 6e  e byte 'type' an
7620: 64 20 61 20 34 20 62 79 74 65 20 70 61 72 65 6e  d a 4 byte paren
7630: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  t page number..*
7640: 2a 20 54 68 65 20 50 54 52 4d 41 50 5f 58 58 58  * The PTRMAP_XXX
7650: 20 69 64 65 6e 74 69 66 69 65 72 73 20 62 65 6c   identifiers bel
7660: 6f 77 20 61 72 65 20 74 68 65 20 76 61 6c 69 64  ow are the valid
7670: 20 74 79 70 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   types..**.** Th
7680: 65 20 70 75 72 70 6f 73 65 20 6f 66 20 74 68 65  e purpose of the
7690: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 69 73 20   pointer map is 
76a0: 74 6f 20 66 61 63 69 6c 69 74 79 20 6d 6f 76 69  to facility movi
76b0: 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20 6f 6e  ng pages from on
76c0: 65 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 69 6e  e.** position in
76d0: 20 74 68 65 20 66 69 6c 65 20 74 6f 20 61 6e 6f   the file to ano
76e0: 74 68 65 72 20 61 73 20 70 61 72 74 20 6f 66 20  ther as part of 
76f0: 61 75 74 6f 76 61 63 75 75 6d 2e 20 20 57 68 65  autovacuum.  Whe
7700: 6e 20 61 20 70 61 67 65 0a 2a 2a 20 69 73 20 6d  n a page.** is m
7710: 6f 76 65 64 2c 20 74 68 65 20 70 6f 69 6e 74 65  oved, the pointe
7720: 72 20 69 6e 20 69 74 73 20 70 61 72 65 6e 74 20  r in its parent 
7730: 6d 75 73 74 20 62 65 20 75 70 64 61 74 65 64 20  must be updated 
7740: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a  to point to the.
7750: 2a 2a 20 6e 65 77 20 6c 6f 63 61 74 69 6f 6e 2e  ** new location.
7760: 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61    The pointer ma
7770: 70 20 69 73 20 75 73 65 64 20 74 6f 20 6c 6f 63  p is used to loc
7780: 61 74 65 20 74 68 65 20 70 61 72 65 6e 74 20 70  ate the parent p
7790: 61 67 65 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 0a  age quickly..**.
77a0: 2a 2a 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  ** PTRMAP_ROOTPA
77b0: 47 45 3a 20 54 68 65 20 64 61 74 61 62 61 73 65  GE: The database
77c0: 20 70 61 67 65 20 69 73 20 61 20 72 6f 6f 74 2d   page is a root-
77d0: 70 61 67 65 2e 20 54 68 65 20 70 61 67 65 2d 6e  page. The page-n
77e0: 75 6d 62 65 72 20 69 73 20 6e 6f 74 0a 2a 2a 20  umber is not.** 
77f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7800: 20 75 73 65 64 20 69 6e 20 74 68 69 73 20 63 61   used in this ca
7810: 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  se..**.** PTRMAP
7820: 5f 46 52 45 45 50 41 47 45 3a 20 54 68 65 20 64  _FREEPAGE: The d
7830: 61 74 61 62 61 73 65 20 70 61 67 65 20 69 73 20  atabase page is 
7840: 61 6e 20 75 6e 75 73 65 64 20 28 66 72 65 65 29  an unused (free)
7850: 20 70 61 67 65 2e 20 54 68 65 20 70 61 67 65 2d   page. The page-
7860: 6e 75 6d 62 65 72 20 0a 2a 2a 20 20 20 20 20 20  number .**      
7870: 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 6e              is n
7880: 6f 74 20 75 73 65 64 20 69 6e 20 74 68 69 73 20  ot used in this 
7890: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  case..**.** PTRM
78a0: 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 54 68  AP_OVERFLOW1: Th
78b0: 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  e database page 
78c0: 69 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67  is the first pag
78d0: 65 20 69 6e 20 61 20 6c 69 73 74 20 6f 66 20 0a  e in a list of .
78e0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
78f0: 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61       overflow pa
7900: 67 65 73 2e 20 54 68 65 20 70 61 67 65 20 6e 75  ges. The page nu
7910: 6d 62 65 72 20 69 64 65 6e 74 69 66 69 65 73 20  mber identifies 
7920: 74 68 65 20 70 61 67 65 20 74 68 61 74 0a 2a 2a  the page that.**
7930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7940: 20 20 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20     contains the 
7950: 63 65 6c 6c 20 77 69 74 68 20 61 20 70 6f 69 6e  cell with a poin
7960: 74 65 72 20 74 6f 20 74 68 69 73 20 6f 76 65 72  ter to this over
7970: 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  flow page..**.**
7980: 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
7990: 32 3a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  2: The database 
79a0: 70 61 67 65 20 69 73 20 74 68 65 20 73 65 63 6f  page is the seco
79b0: 6e 64 20 6f 72 20 6c 61 74 65 72 20 70 61 67 65  nd or later page
79c0: 20 69 6e 20 61 20 6c 69 73 74 20 6f 66 0a 2a 2a   in a list of.**
79d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79e0: 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65     overflow page
79f0: 73 2e 20 54 68 65 20 70 61 67 65 2d 6e 75 6d 62  s. The page-numb
7a00: 65 72 20 69 64 65 6e 74 69 66 69 65 73 20 74 68  er identifies th
7a10: 65 20 70 72 65 76 69 6f 75 73 0a 2a 2a 20 20 20  e previous.**   
7a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a30: 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72  page in the over
7a40: 66 6c 6f 77 20 70 61 67 65 20 6c 69 73 74 2e 0a  flow page list..
7a50: 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52  **.** PTRMAP_BTR
7a60: 45 45 3a 20 54 68 65 20 64 61 74 61 62 61 73 65  EE: The database
7a70: 20 70 61 67 65 20 69 73 20 61 20 6e 6f 6e 2d 72   page is a non-r
7a80: 6f 6f 74 20 62 74 72 65 65 20 70 61 67 65 2e 20  oot btree page. 
7a90: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 0a  The page number.
7aa0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
7ab0: 20 69 64 65 6e 74 69 66 69 65 73 20 74 68 65 20   identifies the 
7ac0: 70 61 72 65 6e 74 20 70 61 67 65 20 69 6e 20 74  parent page in t
7ad0: 68 65 20 62 74 72 65 65 2e 0a 2a 2f 0a 23 64 65  he btree..*/.#de
7ae0: 66 69 6e 65 20 50 54 52 4d 41 50 5f 52 4f 4f 54  fine PTRMAP_ROOT
7af0: 50 41 47 45 20 31 0a 23 64 65 66 69 6e 65 20 50  PAGE 1.#define P
7b00: 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 32  TRMAP_FREEPAGE 2
7b10: 0a 23 64 65 66 69 6e 65 20 50 54 52 4d 41 50 5f  .#define PTRMAP_
7b20: 4f 56 45 52 46 4c 4f 57 31 20 33 0a 23 64 65 66  OVERFLOW1 3.#def
7b30: 69 6e 65 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  ine PTRMAP_OVERF
7b40: 4c 4f 57 32 20 34 0a 23 64 65 66 69 6e 65 20 50  LOW2 4.#define P
7b50: 54 52 4d 41 50 5f 42 54 52 45 45 20 35 0a 0a 2f  TRMAP_BTREE 5../
7b60: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e  *.** Write an en
7b70: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  try into the poi
7b80: 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20  nter map..**.** 
7b90: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64  This routine upd
7ba0: 61 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ates the pointer
7bb0: 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70   map entry for p
7bc0: 61 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27  age number 'key'
7bd0: 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d  .** so that it m
7be0: 61 70 73 20 74 6f 20 74 79 70 65 20 27 65 54 79  aps to type 'eTy
7bf0: 70 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70  pe' and parent p
7c00: 61 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f  age number 'pgno
7c10: 27 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63  '..** An error c
7c20: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
7c30: 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  if something goe
7c40: 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69  s wrong, otherwi
7c50: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
7c60: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
7c70: 61 70 50 75 74 28 42 74 53 68 61 72 65 64 20 2a  apPut(BtShared *
7c80: 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75  pBt, Pgno key, u
7c90: 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61  8 eType, Pgno pa
7ca0: 72 65 6e 74 29 7b 0a 20 20 75 38 20 2a 70 50 74  rent){.  u8 *pPt
7cb0: 72 6d 61 70 3b 20 20 20 20 2f 2a 20 54 68 65 20  rmap;    /* The 
7cc0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
7cd0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d   */.  Pgno iPtrm
7ce0: 61 70 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  ap;   /* The poi
7cf0: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75  nter map page nu
7d00: 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  mber */.  int of
7d10: 66 73 65 74 3b 20 20 20 20 20 2f 2a 20 4f 66 66  fset;     /* Off
7d20: 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d  set in pointer m
7d30: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ap page */.  int
7d40: 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d   rc;..  /* The m
7d50: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61  aster-journal pa
7d60: 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e  ge number must n
7d70: 65 76 65 72 20 62 65 20 75 73 65 64 20 61 73 20  ever be used as 
7d80: 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  a pointer map pa
7d90: 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ge */.  assert( 
7da0: 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45  0==PTRMAP_ISPAGE
7db0: 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59  (pBt, PENDING_BY
7dc0: 54 45 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b  TE_PAGE(pBt)) );
7dd0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ..  assert( pBt-
7de0: 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20  >autoVacuum );. 
7df0: 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20   if( key==0 ){. 
7e00: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
7e10: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
7e20: 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50   }.  iPtrmap = P
7e30: 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
7e40: 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73  , key);.  rc = s
7e50: 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28  qlite3pager_get(
7e60: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74  pBt->pPager, iPt
7e70: 72 6d 61 70 2c 20 28 76 6f 69 64 20 2a 2a 29 26  rmap, (void **)&
7e80: 70 50 74 72 6d 61 70 29 3b 0a 20 20 69 66 28 20  pPtrmap);.  if( 
7e90: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
7ea0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
7eb0: 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50    }.  offset = P
7ec0: 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28  TRMAP_PTROFFSET(
7ed0: 70 42 74 2c 20 6b 65 79 29 3b 0a 0a 20 20 69 66  pBt, key);..  if
7ee0: 28 20 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70  ( eType!=pPtrmap
7ef0: 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34  [offset] || get4
7f00: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
7f10: 66 73 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74  fset+1])!=parent
7f20: 20 29 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22   ){.    TRACE(("
7f30: 50 54 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 25  PTRMAP_UPDATE: %
7f40: 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b  d->(%d,%d)\n", k
7f50: 65 79 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e  ey, eType, paren
7f60: 74 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  t));.    rc = sq
7f70: 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
7f80: 28 70 50 74 72 6d 61 70 29 3b 0a 20 20 20 20 69  (pPtrmap);.    i
7f90: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
7fa0: 20 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61   ){.      pPtrma
7fb0: 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70  p[offset] = eTyp
7fc0: 65 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  e;.      put4byt
7fd0: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
7fe0: 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20  t+1], parent);. 
7ff0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69     }.  }..  sqli
8000: 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70  te3pager_unref(p
8010: 50 74 72 6d 61 70 29 3b 0a 20 20 72 65 74 75 72  Ptrmap);.  retur
8020: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
8030: 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f  ead an entry fro
8040: 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  m the pointer ma
8050: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  p..**.** This ro
8060: 75 74 69 6e 65 20 72 65 74 72 69 65 76 65 73 20  utine retrieves 
8070: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
8080: 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 27  entry for page '
8090: 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a  key', writing.**
80a0: 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 70 61   the type and pa
80b0: 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72  rent page number
80c0: 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20   to *pEType and 
80d0: 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76  *pPgno respectiv
80e0: 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72  ely..** An error
80f0: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
8100: 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67  d if something g
8110: 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72  oes wrong, other
8120: 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  wise SQLITE_OK..
8130: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74  */.static int pt
8140: 72 6d 61 70 47 65 74 28 42 74 53 68 61 72 65 64  rmapGet(BtShared
8150: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c   *pBt, Pgno key,
8160: 20 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e   u8 *pEType, Pgn
8170: 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 69 6e 74  o *pPgno){.  int
8180: 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20   iPtrmap;       
8190: 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70  /* Pointer map p
81a0: 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75  age index */.  u
81b0: 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20  8 *pPtrmap;     
81c0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
81d0: 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20   page data */.  
81e0: 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20  int offset;     
81f0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
8200: 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72  entry in pointer
8210: 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63   map */.  int rc
8220: 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50  ;..  iPtrmap = P
8230: 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
8240: 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73  , key);.  rc = s
8250: 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28  qlite3pager_get(
8260: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74  pBt->pPager, iPt
8270: 72 6d 61 70 2c 20 28 76 6f 69 64 20 2a 2a 29 26  rmap, (void **)&
8280: 70 50 74 72 6d 61 70 29 3b 0a 20 20 69 66 28 20  pPtrmap);.  if( 
8290: 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  rc!=0 ){.    ret
82a0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 6f  urn rc;.  }..  o
82b0: 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50  ffset = PTRMAP_P
82c0: 54 52 4f 46 46 53 45 54 28 70 42 74 2c 20 6b 65  TROFFSET(pBt, ke
82d0: 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  y);.  assert( pE
82e0: 54 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45  Type!=0 );.  *pE
82f0: 54 79 70 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f  Type = pPtrmap[o
8300: 66 66 73 65 74 5d 3b 0a 20 20 69 66 28 20 70 50  ffset];.  if( pP
8310: 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67  gno ) *pPgno = g
8320: 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70  et4byte(&pPtrmap
8330: 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20  [offset+1]);..  
8340: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72  sqlite3pager_unr
8350: 65 66 28 70 50 74 72 6d 61 70 29 3b 0a 20 20 69  ef(pPtrmap);.  i
8360: 66 28 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20  f( *pEType<1 || 
8370: 2a 70 45 54 79 70 65 3e 35 20 29 20 72 65 74 75  *pEType>5 ) retu
8380: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
8390: 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75 72 6e  T_BKPT;.  return
83a0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
83b0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
83c0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
83d0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  */../*.** Given 
83e0: 61 20 62 74 72 65 65 20 70 61 67 65 20 61 6e 64  a btree page and
83f0: 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28 30   a cell index (0
8400: 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73 74   means the first
8410: 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20   cell on.** the 
8420: 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74 68  page, 1 means th
8430: 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61  e second cell, a
8440: 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65 74  nd so forth) ret
8450: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  urn a pointer.**
8460: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
8470: 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tent..**.** This
8480: 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f   routine works o
8490: 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74 68  nly for pages th
84a0: 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69  at do not contai
84b0: 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  n overflow cells
84c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 2a  ..*/.static u8 *
84d0: 66 69 6e 64 43 65 6c 6c 28 4d 65 6d 50 61 67 65  findCell(MemPage
84e0: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65   *pPage, int iCe
84f0: 6c 6c 29 7b 0a 20 20 75 38 20 2a 64 61 74 61 20  ll){.  u8 *data 
8500: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
8510: 20 20 61 73 73 65 72 74 28 20 69 43 65 6c 6c 3e    assert( iCell>
8520: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
8530: 69 43 65 6c 6c 3c 67 65 74 32 62 79 74 65 28 26  iCell<get2byte(&
8540: 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  data[pPage->hdrO
8550: 66 66 73 65 74 2b 33 5d 29 20 29 3b 0a 20 20 72  ffset+3]) );.  r
8560: 65 74 75 72 6e 20 64 61 74 61 20 2b 20 67 65 74  eturn data + get
8570: 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67  2byte(&data[pPag
8580: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a  e->cellOffset+2*
8590: 69 43 65 6c 6c 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  iCell]);.}../*.*
85a0: 2a 20 54 68 69 73 20 61 20 6d 6f 72 65 20 63 6f  * This a more co
85b0: 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f 66  mplex version of
85c0: 20 66 69 6e 64 43 65 6c 6c 28 29 20 74 68 61 74   findCell() that
85d0: 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 70 61   works for.** pa
85e0: 67 65 73 20 74 68 61 74 20 64 6f 20 63 6f 6e 74  ges that do cont
85f0: 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  ain overflow cel
8600: 6c 73 2e 20 20 53 65 65 20 69 6e 73 65 72 74 0a  ls.  See insert.
8610: 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 66 69  */.static u8 *fi
8620: 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 4d  ndOverflowCell(M
8630: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
8640: 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 69 6e 74  nt iCell){.  int
8650: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 50 61 67   i;.  for(i=pPag
8660: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b 20  e->nOverflow-1; 
8670: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
8680: 69 6e 74 20 6b 3b 0a 20 20 20 20 73 74 72 75 63  int k;.    struc
8690: 74 20 5f 4f 76 66 6c 43 65 6c 6c 20 2a 70 4f 76  t _OvflCell *pOv
86a0: 66 6c 3b 0a 20 20 20 20 70 4f 76 66 6c 20 3d 20  fl;.    pOvfl = 
86b0: 26 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 69 5d  &pPage->aOvfl[i]
86c0: 3b 0a 20 20 20 20 6b 20 3d 20 70 4f 76 66 6c 2d  ;.    k = pOvfl-
86d0: 3e 69 64 78 3b 0a 20 20 20 20 69 66 28 20 6b 3c  >idx;.    if( k<
86e0: 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  =iCell ){.      
86f0: 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20 29 7b 0a  if( k==iCell ){.
8700: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
8710: 4f 76 66 6c 2d 3e 70 43 65 6c 6c 3b 0a 20 20 20  Ovfl->pCell;.   
8720: 20 20 20 7d 0a 20 20 20 20 20 20 69 43 65 6c 6c     }.      iCell
8730: 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  --;.    }.  }.  
8740: 72 65 74 75 72 6e 20 66 69 6e 64 43 65 6c 6c 28  return findCell(
8750: 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d  pPage, iCell);.}
8760: 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20  ../*.** Parse a 
8770: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f  cell content blo
8780: 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74  ck and fill in t
8790: 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75  he CellInfo stru
87a0: 63 74 75 72 65 2e 20 20 54 68 65 72 65 0a 2a 2a  cture.  There.**
87b0: 20 61 72 65 20 74 77 6f 20 76 65 72 73 69 6f 6e   are two version
87c0: 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
87d0: 6f 6e 2e 20 20 70 61 72 73 65 43 65 6c 6c 28 29  on.  parseCell()
87e0: 20 74 61 6b 65 73 20 61 20 63 65 6c 6c 20 69 6e   takes a cell in
87f0: 64 65 78 0a 2a 2a 20 61 73 20 74 68 65 20 73 65  dex.** as the se
8800: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 61 6e  cond argument an
8810: 64 20 70 61 72 73 65 43 65 6c 6c 50 74 72 28 29  d parseCellPtr()
8820: 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72   takes a pointer
8830: 20 74 6f 20 74 68 65 0a 2a 2a 20 62 6f 64 79 20   to the.** body 
8840: 6f 66 20 74 68 65 20 63 65 6c 6c 20 61 73 20 69  of the cell as i
8850: 74 73 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  ts second argume
8860: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
8870: 69 64 20 70 61 72 73 65 43 65 6c 6c 50 74 72 28  id parseCellPtr(
8880: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
8890: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
88a0: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
88b0: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a  e cell */.  u8 *
88c0: 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
88d0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
88e0: 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e  o the cell text.
88f0: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
8900: 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a  pInfo         /*
8910: 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74   Fill in this st
8920: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
8930: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
8940: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
8950: 72 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 20  r bytes in cell 
8960: 63 6f 6e 74 65 6e 74 20 68 65 61 64 65 72 20 2a  content header *
8970: 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64  /.  u32 nPayload
8980: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
8990: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
89a0: 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a  f cell payload *
89b0: 2f 0a 0a 20 20 70 49 6e 66 6f 2d 3e 70 43 65 6c  /..  pInfo->pCel
89c0: 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 61 73 73  l = pCell;.  ass
89d0: 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66  ert( pPage->leaf
89e0: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65  ==0 || pPage->le
89f0: 61 66 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d 20 70  af==1 );.  n = p
8a00: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
8a10: 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d  ze;.  assert( n=
8a20: 3d 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66  =4-4*pPage->leaf
8a30: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
8a40: 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20  >hasData ){.    
8a50: 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  n += getVarint32
8a60: 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 26 6e 50 61  (&pCell[n], &nPa
8a70: 79 6c 6f 61 64 29 3b 0a 20 20 7d 65 6c 73 65 7b  yload);.  }else{
8a80: 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20  .    nPayload = 
8a90: 30 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e  0;.  }.  pInfo->
8aa0: 6e 44 61 74 61 20 3d 20 6e 50 61 79 6c 6f 61 64  nData = nPayload
8ab0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
8ac0: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e 20 2b  ntKey ){.    n +
8ad0: 3d 20 67 65 74 56 61 72 69 6e 74 28 26 70 43 65  = getVarint(&pCe
8ae0: 6c 6c 5b 6e 5d 2c 20 28 75 36 34 20 2a 29 26 70  ll[n], (u64 *)&p
8af0: 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 7d  Info->nKey);.  }
8b00: 65 6c 73 65 7b 0a 20 20 20 20 75 33 32 20 78 3b  else{.    u32 x;
8b10: 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72  .    n += getVar
8b20: 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c  int32(&pCell[n],
8b30: 20 26 78 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d   &x);.    pInfo-
8b40: 3e 6e 4b 65 79 20 3d 20 78 3b 0a 20 20 20 20 6e  >nKey = x;.    n
8b50: 50 61 79 6c 6f 61 64 20 2b 3d 20 78 3b 0a 20 20  Payload += x;.  
8b60: 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 48 65 61 64  }.  pInfo->nHead
8b70: 65 72 20 3d 20 6e 3b 0a 20 20 69 66 28 20 6e 50  er = n;.  if( nP
8b80: 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d  ayload<=pPage->m
8b90: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f  axLocal ){.    /
8ba0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65  * This is the (e
8bb0: 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65  asy) common case
8bc0: 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72   where the entir
8bd0: 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20  e payload fits. 
8be0: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63     ** on the loc
8bf0: 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65  al page.  No ove
8c00: 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65  rflow is require
8c10: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  d..    */.    in
8c20: 74 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20  t nSize;        
8c30: 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
8c40: 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  of cell content 
8c50: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  in bytes */.    
8c60: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
8c70: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70 49  nPayload;.    pI
8c80: 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d  nfo->iOverflow =
8c90: 20 30 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20   0;.    nSize = 
8ca0: 6e 50 61 79 6c 6f 61 64 20 2b 20 6e 3b 0a 20 20  nPayload + n;.  
8cb0: 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 7b    if( nSize<4 ){
8cc0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 34  .      nSize = 4
8cd0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69  ;        /* Mini
8ce0: 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73  mum cell size is
8cf0: 20 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20   4 */.    }.    
8d00: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e  pInfo->nSize = n
8d10: 53 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Size;.  }else{. 
8d20: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79     /* If the pay
8d30: 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69  load will not fi
8d40: 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20  t completely on 
8d50: 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20  the local page, 
8d60: 77 65 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 74  we have.    ** t
8d70: 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75 63  o decide how muc
8d80: 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  h to store local
8d90: 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68 20  ly and how much 
8da0: 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20  to spill onto.  
8db0: 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
8dc0: 67 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65  ges.  The strate
8dd0: 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a  gy is to minimiz
8de0: 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  e the amount of 
8df0: 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20 73 70  unused.    ** sp
8e00: 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20  ace on overflow 
8e10: 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70  pages while keep
8e20: 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ing the amount o
8e30: 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a  f local storage.
8e40: 20 20 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65      ** in betwee
8e50: 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d  n minLocal and m
8e60: 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a  axLocal..    **.
8e70: 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20      ** Warning: 
8e80: 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61   changing the wa
8e90: 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  y overflow paylo
8ea0: 61 64 20 69 73 20 64 69 73 74 72 69 62 75 74 65  ad is distribute
8eb0: 64 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20  d in any.    ** 
8ec0: 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  way will result 
8ed0: 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  in an incompatib
8ee0: 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a  le file format..
8ef0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d      */.    int m
8f00: 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e  inLocal;  /* Min
8f10: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
8f20: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
8f30: 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d  lly */.    int m
8f40: 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78  axLocal;  /* Max
8f50: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
8f60: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
8f70: 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  lly */.    int s
8f80: 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65  urplus;   /* Ove
8f90: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76  rflow payload av
8fa0: 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61  ailable for loca
8fb0: 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20  l storage */..  
8fc0: 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61    minLocal = pPa
8fd0: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
8fe0: 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61    maxLocal = pPa
8ff0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  ge->maxLocal;.  
9000: 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c    surplus = minL
9010: 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f 61 64  ocal + (nPayload
9020: 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50   - minLocal)%(pP
9030: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
9040: 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 69  Size - 4);.    i
9050: 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61  f( surplus <= ma
9060: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  xLocal ){.      
9070: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
9080: 73 75 72 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c  surplus;.    }el
9090: 73 65 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d  se{.      pInfo-
90a0: 3e 6e 4c 6f 63 61 6c 20 3d 20 6d 69 6e 4c 6f 63  >nLocal = minLoc
90b0: 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  al;.    }.    pI
90c0: 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d  nfo->iOverflow =
90d0: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b   pInfo->nLocal +
90e0: 20 6e 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   n;.    pInfo->n
90f0: 53 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f  Size = pInfo->iO
9100: 76 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d  verflow + 4;.  }
9110: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  .}.static void p
9120: 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  arseCell(.  MemP
9130: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
9140: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
9150: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
9160: 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20  */.  int iCell, 
9170: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9180: 54 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20  The cell index. 
9190: 20 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30   First cell is 0
91a0: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
91b0: 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a  pInfo         /*
91c0: 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74   Fill in this st
91d0: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
91e0: 70 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  parseCellPtr(pPa
91f0: 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  ge, findCell(pPa
9200: 67 65 2c 20 69 43 65 6c 6c 29 2c 20 70 49 6e 66  ge, iCell), pInf
9210: 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  o);.}../*.** Com
9220: 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 6e  pute the total n
9230: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
9240: 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64 73  hat a Cell needs
9250: 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20   in the cell.** 
9260: 64 61 74 61 20 61 72 65 61 20 6f 66 20 74 68 65  data area of the
9270: 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54 68   btree-page.  Th
9280: 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72 20  e return number 
9290: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65 6c  includes the cel
92a0: 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65 72  l.** data header
92b0: 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20 70   and the local p
92c0: 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20  ayload, but not 
92d0: 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
92e0: 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61 63  e or.** the spac
92f0: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63 65  e used by the ce
9300: 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 23  ll pointer..*/.#
9310: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74  ifndef NDEBUG.st
9320: 61 74 69 63 20 69 6e 74 20 63 65 6c 6c 53 69 7a  atic int cellSiz
9330: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
9340: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
9350: 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
9360: 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65   parseCell(pPage
9370: 2c 20 69 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , iCell, &info);
9380: 0a 20 20 72 65 74 75 72 6e 20 69 6e 66 6f 2e 6e  .  return info.n
9390: 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 73  Size;.}.#endif.s
93a0: 74 61 74 69 63 20 69 6e 74 20 63 65 6c 6c 53 69  tatic int cellSi
93b0: 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70  zePtr(MemPage *p
93c0: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29  Page, u8 *pCell)
93d0: 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  {.  CellInfo inf
93e0: 6f 3b 0a 20 20 70 61 72 73 65 43 65 6c 6c 50 74  o;.  parseCellPt
93f0: 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
9400: 26 69 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e  &info);.  return
9410: 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 7d 0a 0a   info.nSize;.}..
9420: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9430: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f  MIT_AUTOVACUUM./
9440: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c  *.** If the cell
9450: 20 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f 66 20   pCell, part of 
9460: 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74 61  page pPage conta
9470: 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  ins a pointer.**
9480: 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
9490: 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20  page, insert an 
94a0: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70  entry into the p
94b0: 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f  ointer-map.** fo
94c0: 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
94d0: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  age..*/.static i
94e0: 6e 74 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c  nt ptrmapPutOvfl
94f0: 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  Ptr(MemPage *pPa
9500: 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a  ge, u8 *pCell){.
9510: 20 20 69 66 28 20 70 43 65 6c 6c 20 29 7b 0a 20    if( pCell ){. 
9520: 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
9530: 3b 0a 20 20 20 20 70 61 72 73 65 43 65 6c 6c 50  ;.    parseCellP
9540: 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
9550: 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28   &info);.    if(
9560: 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50   (info.nData+(pP
9570: 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e  age->intKey?0:in
9580: 66 6f 2e 6e 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e  fo.nKey))>info.n
9590: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 50  Local ){.      P
95a0: 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62  gno ovfl = get4b
95b0: 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
95c0: 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20  iOverflow]);.   
95d0: 20 20 20 72 65 74 75 72 6e 20 70 74 72 6d 61 70     return ptrmap
95e0: 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20  Put(pPage->pBt, 
95f0: 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45  ovfl, PTRMAP_OVE
9600: 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70  RFLOW1, pPage->p
9610: 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  gno);.    }.  }.
9620: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9630: 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 49 66 20 74  OK;.}./*.** If t
9640: 68 65 20 63 65 6c 6c 20 77 69 74 68 20 69 6e 64  he cell with ind
9650: 65 78 20 69 43 65 6c 6c 20 6f 6e 20 70 61 67 65  ex iCell on page
9660: 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20   pPage contains 
9670: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
9680: 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
9690: 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72  , insert an entr
96a0: 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  y into the point
96b0: 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68  er-map.** for th
96c0: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  e overflow page.
96d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
96e0: 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 4d 65 6d  trmapPutOvfl(Mem
96f0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
9700: 20 69 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70   iCell){.  u8 *p
9710: 43 65 6c 6c 3b 0a 20 20 70 43 65 6c 6c 20 3d 20  Cell;.  pCell = 
9720: 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c  findOverflowCell
9730: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a  (pPage, iCell);.
9740: 20 20 72 65 74 75 72 6e 20 70 74 72 6d 61 70 50    return ptrmapP
9750: 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c  utOvflPtr(pPage,
9760: 20 70 43 65 6c 6c 29 3b 0a 7d 0a 23 65 6e 64 69   pCell);.}.#endi
9770: 66 0a 0a 0a 2f 2a 20 41 20 62 75 6e 63 68 20 6f  f.../* A bunch o
9780: 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  f assert() state
9790: 6d 65 6e 74 73 20 74 6f 20 63 68 65 63 6b 20 74  ments to check t
97a0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  he transaction s
97b0: 74 61 74 65 20 76 61 72 69 61 62 6c 65 73 0a 2a  tate variables.*
97c0: 2a 20 6f 66 20 68 61 6e 64 6c 65 20 70 20 28 74  * of handle p (t
97d0: 79 70 65 20 42 74 72 65 65 2a 29 20 61 72 65 20  ype Btree*) are 
97e0: 69 6e 74 65 72 6e 61 6c 6c 79 20 63 6f 6e 73 69  internally consi
97f0: 73 74 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e  stent..*/.#defin
9800: 65 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79  e btreeIntegrity
9810: 28 70 29 20 5c 0a 20 20 61 73 73 65 72 74 28 20  (p) \.  assert( 
9820: 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  p->inTrans!=TRAN
9830: 53 5f 4e 4f 4e 45 20 7c 7c 20 70 2d 3e 70 42 74  S_NONE || p->pBt
9840: 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3c 70  ->nTransaction<p
9850: 2d 3e 70 42 74 2d 3e 6e 52 65 66 20 29 3b 20 5c  ->pBt->nRef ); \
9860: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 42  .  assert( p->pB
9870: 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3c  t->nTransaction<
9880: 3d 70 2d 3e 70 42 74 2d 3e 6e 52 65 66 20 29 3b  =p->pBt->nRef );
9890: 20 5c 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   \.  assert( p->
98a0: 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
98b0: 6f 6e 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 7c  on!=TRANS_NONE |
98c0: 7c 20 70 2d 3e 70 42 74 2d 3e 6e 54 72 61 6e 73  | p->pBt->nTrans
98d0: 61 63 74 69 6f 6e 3d 3d 30 20 29 3b 20 5c 0a 20  action==0 ); \. 
98e0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74 2d   assert( p->pBt-
98f0: 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 3d  >inTransaction>=
9900: 70 2d 3e 69 6e 54 72 61 6e 73 20 29 3b 20 0a 0a  p->inTrans ); ..
9910: 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74  /*.** Defragment
9920: 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e   the page given.
9930: 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20    All Cells are 
9940: 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20  moved to the.** 
9950: 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 20  end of the page 
9960: 61 6e 64 20 61 6c 6c 20 66 72 65 65 20 73 70 61  and all free spa
9970: 63 65 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20  ce is collected 
9980: 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20  into one.** big 
9990: 46 72 65 65 42 6c 6b 20 74 68 61 74 20 6f 63 63  FreeBlk that occ
99a0: 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 20 74  urs in between t
99b0: 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 63 65  he header and ce
99c0: 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72  ll.** pointer ar
99d0: 72 61 79 20 61 6e 64 20 74 68 65 20 63 65 6c 6c  ray and the cell
99e0: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a   content area..*
99f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 66  /.static int def
9a00: 72 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50  ragmentPage(MemP
9a10: 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
9a20: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
9a30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
9a40: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
9a50: 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20  nt pc;          
9a60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
9a70: 72 65 73 73 20 6f 66 20 61 20 69 2d 74 68 20 63  ress of a i-th c
9a80: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ell */.  int add
9a90: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
9aa0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
9ab0: 20 66 69 72 73 74 20 62 79 74 65 20 61 66 74 65   first byte afte
9ac0: 72 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  r cell pointer a
9ad0: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 68 64  rray */.  int hd
9ae0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
9af0: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
9b00: 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  o the page heade
9b10: 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b  r */.  int size;
9b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b30: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63    /* Size of a c
9b40: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61  ell */.  int usa
9b50: 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  bleSize;        
9b60: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
9b70: 20 75 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e   usable bytes on
9b80: 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74   a page */.  int
9b90: 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20   cellOffset;    
9ba0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
9bb0: 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f  t to the cell po
9bc0: 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20  inter array */. 
9bd0: 20 69 6e 74 20 62 72 6b 3b 20 20 20 20 20 20 20   int brk;       
9be0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
9bf0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  ffset to the cel
9c00: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
9c10: 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20  /.  int nCell;  
9c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9c30: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
9c40: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  s on the page */
9c50: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
9c60: 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a   *data;       /*
9c70: 20 54 68 65 20 70 61 67 65 20 64 61 74 61 20 2a   The page data *
9c80: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
9c90: 72 20 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f  r *temp;       /
9ca0: 2a 20 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20  * Temp area for 
9cb0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  cell content */.
9cc0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
9cd0: 65 33 70 61 67 65 72 5f 69 73 77 72 69 74 65 61  e3pager_iswritea
9ce0: 62 6c 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  ble(pPage->aData
9cf0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
9d00: 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
9d10: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
9d20: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
9d30: 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50   <= SQLITE_MAX_P
9d40: 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73  AGE_SIZE );.  as
9d50: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
9d60: 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 74  erflow==0 );.  t
9d70: 65 6d 70 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  emp = sqliteMall
9d80: 6f 63 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  oc( pPage->pBt->
9d90: 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 69 66  pageSize );.  if
9da0: 28 20 74 65 6d 70 3d 3d 30 20 29 20 72 65 74 75  ( temp==0 ) retu
9db0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
9dc0: 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
9dd0: 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20  >aData;.  hdr = 
9de0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
9df0: 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ;.  cellOffset =
9e00: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
9e10: 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50  et;.  nCell = pP
9e20: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73  age->nCell;.  as
9e30: 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74  sert( nCell==get
9e40: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
9e50: 33 5d 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53  3]) );.  usableS
9e60: 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  ize = pPage->pBt
9e70: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
9e80: 62 72 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26  brk = get2byte(&
9e90: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
9ea0: 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b 62 72 6b  memcpy(&temp[brk
9eb0: 5d 2c 20 26 64 61 74 61 5b 62 72 6b 5d 2c 20 75  ], &data[brk], u
9ec0: 73 61 62 6c 65 53 69 7a 65 20 2d 20 62 72 6b 29  sableSize - brk)
9ed0: 3b 0a 20 20 62 72 6b 20 3d 20 75 73 61 62 6c 65  ;.  brk = usable
9ee0: 53 69 7a 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  Size;.  for(i=0;
9ef0: 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
9f00: 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b 20 20      u8 *pAddr;  
9f10: 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63     /* The i-th c
9f20: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ell pointer */. 
9f30: 20 20 20 70 41 64 64 72 20 3d 20 26 64 61 74 61     pAddr = &data
9f40: 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a  [cellOffset + i*
9f50: 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74  2];.    pc = get
9f60: 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20  2byte(pAddr);.  
9f70: 20 20 61 73 73 65 72 74 28 20 70 63 3c 70 50 61    assert( pc<pPa
9f80: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
9f90: 69 7a 65 20 29 3b 0a 20 20 20 20 73 69 7a 65 20  ize );.    size 
9fa0: 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
9fb0: 61 67 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29 3b  age, &temp[pc]);
9fc0: 0a 20 20 20 20 62 72 6b 20 2d 3d 20 73 69 7a 65  .    brk -= size
9fd0: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
9fe0: 74 61 5b 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70  ta[brk], &temp[p
9ff0: 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 70  c], size);.    p
a000: 75 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 62  ut2byte(pAddr, b
a010: 72 6b 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  rk);.  }.  asser
a020: 74 28 20 62 72 6b 3e 3d 63 65 6c 6c 4f 66 66 73  t( brk>=cellOffs
a030: 65 74 2b 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20  et+2*nCell );.  
a040: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
a050: 64 72 2b 35 5d 2c 20 62 72 6b 29 3b 0a 20 20 64  dr+5], brk);.  d
a060: 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a  ata[hdr+1] = 0;.
a070: 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20    data[hdr+2] = 
a080: 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  0;.  data[hdr+7]
a090: 20 3d 20 30 3b 0a 20 20 61 64 64 72 20 3d 20 63   = 0;.  addr = c
a0a0: 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c  ellOffset+2*nCel
a0b0: 6c 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  l;.  memset(&dat
a0c0: 61 5b 61 64 64 72 5d 2c 20 30 2c 20 62 72 6b 2d  a[addr], 0, brk-
a0d0: 61 64 64 72 29 3b 0a 20 20 73 71 6c 69 74 65 46  addr);.  sqliteF
a0e0: 72 65 65 28 74 65 6d 70 29 3b 0a 20 20 72 65 74  ree(temp);.  ret
a0f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
a100: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
a110: 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20   nByte bytes of 
a120: 73 70 61 63 65 20 6f 6e 20 61 20 70 61 67 65 2e  space on a page.
a130: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
a140: 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50 61  e index into pPa
a150: 67 65 2d 3e 61 44 61 74 61 5b 5d 20 6f 66 20 74  ge->aData[] of t
a160: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
a170: 0a 2a 2a 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f  .** the new allo
a180: 63 61 74 69 6f 6e 2e 20 4f 72 20 72 65 74 75 72  cation. Or retur
a190: 6e 20 30 20 69 66 20 74 68 65 72 65 20 69 73 20  n 0 if there is 
a1a0: 6e 6f 74 20 65 6e 6f 75 67 68 20 66 72 65 65 0a  not enough free.
a1b0: 2a 2a 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20  ** space on the 
a1c0: 70 61 67 65 20 74 6f 20 73 61 74 69 73 66 79 20  page to satisfy 
a1d0: 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72  the allocation r
a1e0: 65 71 75 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  equest..**.** If
a1f0: 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69   the page contai
a200: 6e 73 20 6e 42 79 74 65 73 20 6f 66 20 66 72 65  ns nBytes of fre
a210: 65 20 73 70 61 63 65 20 62 75 74 20 64 6f 65 73  e space but does
a220: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20   not contain.** 
a230: 6e 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 69 67  nBytes of contig
a240: 75 6f 75 73 20 66 72 65 65 20 73 70 61 63 65 2c  uous free space,
a250: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
a260: 6e 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ne automatically
a270: 0a 2a 2a 20 63 61 6c 6c 73 20 64 65 66 72 61 67  .** calls defrag
a280: 65 6d 65 6e 74 50 61 67 65 28 29 20 74 6f 20 63  ementPage() to c
a290: 6f 6e 73 6f 6c 69 64 61 74 65 20 61 6c 6c 20 66  onsolidate all f
a2a0: 72 65 65 20 73 70 61 63 65 20 62 65 66 6f 72 65  ree space before
a2b0: 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e 67 20   .** allocating 
a2c0: 74 68 65 20 6e 65 77 20 63 68 75 6e 6b 2e 0a 2a  the new chunk..*
a2d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
a2e0: 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50 61  ocateSpace(MemPa
a2f0: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e  ge *pPage, int n
a300: 42 79 74 65 29 7b 0a 20 20 69 6e 74 20 61 64 64  Byte){.  int add
a310: 72 2c 20 70 63 2c 20 68 64 72 3b 0a 20 20 69 6e  r, pc, hdr;.  in
a320: 74 20 73 69 7a 65 3b 0a 20 20 69 6e 74 20 6e 46  t size;.  int nF
a330: 72 61 67 3b 0a 20 20 69 6e 74 20 74 6f 70 3b 0a  rag;.  int top;.
a340: 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 69    int nCell;.  i
a350: 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20  nt cellOffset;. 
a360: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
a370: 64 61 74 61 3b 0a 20 20 0a 20 20 64 61 74 61 20  data;.  .  data 
a380: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
a390: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
a3a0: 33 70 61 67 65 72 5f 69 73 77 72 69 74 65 61 62  3pager_iswriteab
a3b0: 6c 65 28 64 61 74 61 29 20 29 3b 0a 20 20 61 73  le(data) );.  as
a3c0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
a3d0: 20 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3c   );.  if( nByte<
a3e0: 34 20 29 20 6e 42 79 74 65 20 3d 20 34 3b 0a 20  4 ) nByte = 4;. 
a3f0: 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 46 72 65   if( pPage->nFre
a400: 65 3c 6e 42 79 74 65 20 7c 7c 20 70 50 61 67 65  e<nByte || pPage
a410: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 20  ->nOverflow>0 ) 
a420: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 50 61 67  return 0;.  pPag
a430: 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 6e 42 79 74  e->nFree -= nByt
a440: 65 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  e;.  hdr = pPage
a450: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 0a 20 20  ->hdrOffset;..  
a460: 6e 46 72 61 67 20 3d 20 64 61 74 61 5b 68 64 72  nFrag = data[hdr
a470: 2b 37 5d 3b 0a 20 20 69 66 28 20 6e 46 72 61 67  +7];.  if( nFrag
a480: 3c 36 30 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65  <60 ){.    /* Se
a490: 61 72 63 68 20 74 68 65 20 66 72 65 65 6c 69 73  arch the freelis
a4a0: 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20  t looking for a 
a4b0: 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20  slot big enough 
a4c0: 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 0a 20  to satisfy the. 
a4d0: 20 20 20 2a 2a 20 73 70 61 63 65 20 72 65 71 75     ** space requ
a4e0: 65 73 74 2e 20 2a 2f 0a 20 20 20 20 61 64 64 72  est. */.    addr
a4f0: 20 3d 20 68 64 72 2b 31 3b 0a 20 20 20 20 77 68   = hdr+1;.    wh
a500: 69 6c 65 28 20 28 70 63 20 3d 20 67 65 74 32 62  ile( (pc = get2b
a510: 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29  yte(&data[addr])
a520: 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 69 7a  )>0 ){.      siz
a530: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
a540: 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20  ta[pc+2]);.     
a550: 20 69 66 28 20 73 69 7a 65 3e 3d 6e 42 79 74 65   if( size>=nByte
a560: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
a570: 73 69 7a 65 3c 6e 42 79 74 65 2b 34 20 29 7b 0a  size<nByte+4 ){.
a580: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
a590: 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 26 64  (&data[addr], &d
a5a0: 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20  ata[pc], 2);.   
a5b0: 20 20 20 20 20 20 20 64 61 74 61 5b 68 64 72 2b         data[hdr+
a5c0: 37 5d 20 3d 20 6e 46 72 61 67 20 2b 20 73 69 7a  7] = nFrag + siz
a5d0: 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20  e - nByte;.     
a5e0: 20 20 20 20 20 72 65 74 75 72 6e 20 70 63 3b 0a       return pc;.
a5f0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
a600: 20 20 20 20 20 20 20 20 20 70 75 74 32 62 79 74           put2byt
a610: 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 2c 20 73  e(&data[pc+2], s
a620: 69 7a 65 2d 6e 42 79 74 65 29 3b 0a 20 20 20 20  ize-nByte);.    
a630: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 63 20        return pc 
a640: 2b 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a  + size - nByte;.
a650: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a660: 7d 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 70  }.      addr = p
a670: 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  c;.    }.  }..  
a680: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  /* Allocate memo
a690: 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20  ry from the gap 
a6a0: 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 63  in between the c
a6b0: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
a6c0: 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63  y.  ** and the c
a6d0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
a6e0: 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67  ..  */.  top = g
a6f0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
a700: 72 2b 35 5d 29 3b 0a 20 20 6e 43 65 6c 6c 20 3d  r+5]);.  nCell =
a710: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
a720: 68 64 72 2b 33 5d 29 3b 0a 20 20 63 65 6c 6c 4f  hdr+3]);.  cellO
a730: 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63  ffset = pPage->c
a740: 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 69 66 28  ellOffset;.  if(
a750: 20 6e 46 72 61 67 3e 3d 36 30 20 7c 7c 20 63 65   nFrag>=60 || ce
a760: 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43 65  llOffset + 2*nCe
a770: 6c 6c 20 3e 20 74 6f 70 20 2d 20 6e 42 79 74 65  ll > top - nByte
a780: 20 29 7b 0a 20 20 20 20 69 66 28 20 64 65 66 72   ){.    if( defr
a790: 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65  agmentPage(pPage
a7a0: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
a7b0: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
a7c0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
a7d0: 20 20 7d 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79    }.  top -= nBy
a7e0: 74 65 3b 0a 20 20 61 73 73 65 72 74 28 20 63 65  te;.  assert( ce
a7f0: 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43 65  llOffset + 2*nCe
a800: 6c 6c 20 3c 3d 20 74 6f 70 20 29 3b 0a 20 20 70  ll <= top );.  p
a810: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
a820: 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 72 65  r+5], top);.  re
a830: 74 75 72 6e 20 74 6f 70 3b 0a 7d 0a 0a 2f 2a 0a  turn top;.}../*.
a840: 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63 74  ** Return a sect
a850: 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65  ion of the pPage
a860: 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20 66  ->aData to the f
a870: 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20  reelist..** The 
a880: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
a890: 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b  e new free block
a8a0: 20 69 73 20 70 50 61 67 65 2d 3e 61 44 69 73 6b   is pPage->aDisk
a8b0: 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74  [start].** and t
a8c0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62  he size of the b
a8d0: 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65 22 20 62  lock is "size" b
a8e0: 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74  ytes..**.** Most
a8f0: 20 6f 66 20 74 68 65 20 65 66 66 6f 72 74 20 68   of the effort h
a900: 65 72 65 20 69 73 20 69 6e 76 6f 6c 76 65 64 20  ere is involved 
a910: 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20 61 64 6a  in coalesing adj
a920: 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65 20 62 6c  acent.** free bl
a930: 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73 69 6e 67  ocks into a sing
a940: 6c 65 20 62 69 67 20 66 72 65 65 20 62 6c 6f 63  le big free bloc
a950: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  k..*/.static voi
a960: 64 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50  d freeSpace(MemP
a970: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
a980: 73 74 61 72 74 2c 20 69 6e 74 20 73 69 7a 65 29  start, int size)
a990: 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 70 62  {.  int addr, pb
a9a0: 65 67 69 6e 2c 20 68 64 72 3b 0a 20 20 75 6e 73  egin, hdr;.  uns
a9b0: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
a9c0: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
a9d0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
a9e0: 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
a9f0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 70 61  ssert( sqlite3pa
aa00: 67 65 72 5f 69 73 77 72 69 74 65 61 62 6c 65 28  ger_iswriteable(
aa10: 64 61 74 61 29 20 29 3b 0a 20 20 61 73 73 65 72  data) );.  asser
aa20: 74 28 20 73 74 61 72 74 3e 3d 70 50 61 67 65 2d  t( start>=pPage-
aa30: 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 28 70 50  >hdrOffset+6+(pP
aa40: 61 67 65 2d 3e 6c 65 61 66 3f 30 3a 34 29 20 29  age->leaf?0:4) )
aa50: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 73 74 61  ;.  assert( (sta
aa60: 72 74 20 2b 20 73 69 7a 65 29 3c 3d 70 50 61 67  rt + size)<=pPag
aa70: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
aa80: 7a 65 20 29 3b 0a 20 20 69 66 28 20 73 69 7a 65  ze );.  if( size
aa90: 3c 34 20 29 20 73 69 7a 65 20 3d 20 34 3b 0a 0a  <4 ) size = 4;..
aaa0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45  #ifdef SQLITE_SE
aab0: 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a  CURE_DELETE.  /*
aac0: 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74   Overwrite delet
aad0: 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  ed information w
aae0: 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74  ith zeros when t
aaf0: 68 65 20 53 45 43 55 52 45 5f 44 45 4c 45 54 45  he SECURE_DELETE
ab00: 20 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73   .  ** option is
ab10: 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70   enabled at comp
ab20: 69 6c 65 2d 74 69 6d 65 20 2a 2f 0a 20 20 6d 65  ile-time */.  me
ab30: 6d 73 65 74 28 26 64 61 74 61 5b 73 74 61 72 74  mset(&data[start
ab40: 5d 2c 20 30 2c 20 73 69 7a 65 29 3b 0a 23 65 6e  ], 0, size);.#en
ab50: 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68  dif..  /* Add th
ab60: 65 20 73 70 61 63 65 20 62 61 63 6b 20 69 6e 74  e space back int
ab70: 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  o the linked lis
ab80: 74 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 20  t of freeblocks 
ab90: 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  */.  hdr = pPage
aba0: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 61  ->hdrOffset;.  a
abb0: 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20  ddr = hdr + 1;. 
abc0: 20 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20   while( (pbegin 
abd0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
abe0: 5b 61 64 64 72 5d 29 29 3c 73 74 61 72 74 20 26  [addr]))<start &
abf0: 26 20 70 62 65 67 69 6e 3e 30 20 29 7b 0a 20 20  & pbegin>0 ){.  
ac00: 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e    assert( pbegin
ac10: 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  <=pPage->pBt->us
ac20: 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20  ableSize-4 );.  
ac30: 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e    assert( pbegin
ac40: 3e 61 64 64 72 20 29 3b 0a 20 20 20 20 61 64 64  >addr );.    add
ac50: 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20 7d 0a  r = pbegin;.  }.
ac60: 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e    assert( pbegin
ac70: 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  <=pPage->pBt->us
ac80: 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20  ableSize-4 );.  
ac90: 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61  assert( pbegin>a
aca0: 64 64 72 20 7c 7c 20 70 62 65 67 69 6e 3d 3d 30  ddr || pbegin==0
acb0: 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   );.  put2byte(&
acc0: 64 61 74 61 5b 61 64 64 72 5d 2c 20 73 74 61 72  data[addr], star
acd0: 74 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  t);.  put2byte(&
ace0: 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 70 62 65  data[start], pbe
acf0: 67 69 6e 29 3b 0a 20 20 70 75 74 32 62 79 74 65  gin);.  put2byte
ad00: 28 26 64 61 74 61 5b 73 74 61 72 74 2b 32 5d 2c  (&data[start+2],
ad10: 20 73 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d   size);.  pPage-
ad20: 3e 6e 46 72 65 65 20 2b 3d 20 73 69 7a 65 3b 0a  >nFree += size;.
ad30: 0a 20 20 2f 2a 20 43 6f 61 6c 65 73 63 65 20 61  .  /* Coalesce a
ad40: 64 6a 61 63 65 6e 74 20 66 72 65 65 20 62 6c 6f  djacent free blo
ad50: 63 6b 73 20 2a 2f 0a 20 20 61 64 64 72 20 3d 20  cks */.  addr = 
ad60: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
ad70: 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 28   + 1;.  while( (
ad80: 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74  pbegin = get2byt
ad90: 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3e  e(&data[addr]))>
ada0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 6e 65  0 ){.    int pne
adb0: 78 74 2c 20 70 73 69 7a 65 3b 0a 20 20 20 20 61  xt, psize;.    a
adc0: 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64  ssert( pbegin>ad
add0: 64 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  dr );.    assert
ade0: 28 20 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d  ( pbegin<=pPage-
adf0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
ae00: 2d 34 20 29 3b 0a 20 20 20 20 70 6e 65 78 74 20  -4 );.    pnext 
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 5d 29 3b 0a 20 20 20 20 70  [pbegin]);.    p
ae30: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
ae40: 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29  &data[pbegin+2])
ae50: 3b 0a 20 20 20 20 69 66 28 20 70 62 65 67 69 6e  ;.    if( pbegin
ae60: 20 2b 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20   + psize + 3 >= 
ae70: 70 6e 65 78 74 20 26 26 20 70 6e 65 78 74 3e 30  pnext && pnext>0
ae80: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 72   ){.      int fr
ae90: 61 67 20 3d 20 70 6e 65 78 74 20 2d 20 28 70 62  ag = pnext - (pb
aea0: 65 67 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20  egin+psize);.   
aeb0: 20 20 20 61 73 73 65 72 74 28 20 66 72 61 67 3c     assert( frag<
aec0: 3d 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  =data[pPage->hdr
aed0: 4f 66 66 73 65 74 2b 37 5d 20 29 3b 0a 20 20 20  Offset+7] );.   
aee0: 20 20 20 64 61 74 61 5b 70 50 61 67 65 2d 3e 68     data[pPage->h
aef0: 64 72 4f 66 66 73 65 74 2b 37 5d 20 2d 3d 20 66  drOffset+7] -= f
af00: 72 61 67 3b 0a 20 20 20 20 20 20 70 75 74 32 62  rag;.      put2b
af10: 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e  yte(&data[pbegin
af20: 5d 2c 20 67 65 74 32 62 79 74 65 28 26 64 61 74  ], get2byte(&dat
af30: 61 5b 70 6e 65 78 74 5d 29 29 3b 0a 20 20 20 20  a[pnext]));.    
af40: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
af50: 5b 70 62 65 67 69 6e 2b 32 5d 2c 20 70 6e 65 78  [pbegin+2], pnex
af60: 74 2b 67 65 74 32 62 79 74 65 28 26 64 61 74 61  t+get2byte(&data
af70: 5b 70 6e 65 78 74 2b 32 5d 29 2d 70 62 65 67 69  [pnext+2])-pbegi
af80: 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
af90: 20 20 20 20 20 61 64 64 72 20 3d 20 70 62 65 67       addr = pbeg
afa0: 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  in;.    }.  }.. 
afb0: 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20   /* If the cell 
afc0: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 62 65 67  content area beg
afd0: 69 6e 73 20 77 69 74 68 20 61 20 66 72 65 65 62  ins with a freeb
afe0: 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69 74 2e  lock, remove it.
aff0: 20 2a 2f 0a 20 20 69 66 28 20 64 61 74 61 5b 68   */.  if( data[h
b000: 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64 72 2b  dr+1]==data[hdr+
b010: 35 5d 20 26 26 20 64 61 74 61 5b 68 64 72 2b 32  5] && data[hdr+2
b020: 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d 20 29  ]==data[hdr+6] )
b030: 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 0a 20  {.    int top;. 
b040: 20 20 20 70 62 65 67 69 6e 20 3d 20 67 65 74 32     pbegin = get2
b050: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31  byte(&data[hdr+1
b060: 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ]);.    memcpy(&
b070: 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26 64 61  data[hdr+1], &da
b080: 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29 3b 0a  ta[pbegin], 2);.
b090: 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
b0a0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
b0b0: 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
b0c0: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70  data[hdr+5], top
b0d0: 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74   + get2byte(&dat
b0e0: 61 5b 70 62 65 67 69 6e 2b 32 5d 29 29 3b 0a 20  a[pbegin+2]));. 
b0f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f   }.}../*.** Deco
b100: 64 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74  de the flags byt
b110: 65 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74  e (the first byt
b120: 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 29  e of the header)
b130: 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61   for a page.** a
b140: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69  nd initialize fi
b150: 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50  elds of the MemP
b160: 61 67 65 20 73 74 72 75 63 74 75 72 65 20 61 63  age structure ac
b170: 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 73 74  cordingly..*/.st
b180: 61 74 69 63 20 76 6f 69 64 20 64 65 63 6f 64 65  atic void decode
b190: 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70  Flags(MemPage *p
b1a0: 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79  Page, int flagBy
b1b0: 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  te){.  BtShared 
b1c0: 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63  *pBt;     /* A c
b1d0: 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42  opy of pPage->pB
b1e0: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
b1f0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
b200: 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  ==(pPage->pgno==
b210: 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a  1 ? 100 : 0) );.
b220: 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20    pPage->intKey 
b230: 3d 20 28 66 6c 61 67 42 79 74 65 20 26 20 28 50  = (flagByte & (P
b240: 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
b250: 41 46 44 41 54 41 29 29 21 3d 30 3b 0a 20 20 70  AFDATA))!=0;.  p
b260: 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61 20 3d  Page->zeroData =
b270: 20 28 66 6c 61 67 42 79 74 65 20 26 20 50 54 46   (flagByte & PTF
b280: 5f 5a 45 52 4f 44 41 54 41 29 21 3d 30 3b 0a 20  _ZERODATA)!=0;. 
b290: 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28   pPage->leaf = (
b2a0: 66 6c 61 67 42 79 74 65 20 26 20 50 54 46 5f 4c  flagByte & PTF_L
b2b0: 45 41 46 29 21 3d 30 3b 0a 20 20 70 50 61 67 65  EAF)!=0;.  pPage
b2c0: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d  ->childPtrSize =
b2d0: 20 34 2a 28 70 50 61 67 65 2d 3e 6c 65 61 66 3d   4*(pPage->leaf=
b2e0: 3d 30 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61  =0);.  pBt = pPa
b2f0: 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 66  ge->pBt;.  if( f
b300: 6c 61 67 42 79 74 65 20 26 20 50 54 46 5f 4c 45  lagByte & PTF_LE
b310: 41 46 44 41 54 41 20 29 7b 0a 20 20 20 20 70 50  AFDATA ){.    pP
b320: 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 3d 20  age->leafData = 
b330: 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  1;.    pPage->ma
b340: 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61  xLocal = pBt->ma
b350: 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65  xLeaf;.    pPage
b360: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
b370: 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c  ->minLeaf;.  }el
b380: 73 65 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6c  se{.    pPage->l
b390: 65 61 66 44 61 74 61 20 3d 20 30 3b 0a 20 20 20  eafData = 0;.   
b3a0: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
b3b0: 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c   = pBt->maxLocal
b3c0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
b3d0: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
b3e0: 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61  Local;.  }.  pPa
b3f0: 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 21 28  ge->hasData = !(
b400: 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61 20  pPage->zeroData 
b410: 7c 7c 20 28 21 70 50 61 67 65 2d 3e 6c 65 61 66  || (!pPage->leaf
b420: 20 26 26 20 70 50 61 67 65 2d 3e 6c 65 61 66 44   && pPage->leafD
b430: 61 74 61 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ata));.}../*.** 
b440: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61  Initialize the a
b450: 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61  uxiliary informa
b460: 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20  tion for a disk 
b470: 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  block..**.** The
b480: 20 70 50 61 72 65 6e 74 20 70 61 72 61 6d 65 74   pParent paramet
b490: 65 72 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69  er must be a poi
b4a0: 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50  nter to the MemP
b4b0: 61 67 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  age which.** is 
b4c0: 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 74 68  the parent of th
b4d0: 65 20 70 61 67 65 20 62 65 69 6e 67 20 69 6e 69  e page being ini
b4e0: 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 72  tialized.  The r
b4f0: 6f 6f 74 20 6f 66 20 61 0a 2a 2a 20 42 54 72 65  oot of a.** BTre
b500: 65 20 68 61 73 20 6e 6f 20 70 61 72 65 6e 74 20  e has no parent 
b510: 61 6e 64 20 73 6f 20 66 6f 72 20 74 68 61 74 20  and so for that 
b520: 70 61 67 65 2c 20 70 50 61 72 65 6e 74 3d 3d 4e  page, pParent==N
b530: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ULL..**.** Retur
b540: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
b550: 75 63 63 65 73 73 2e 20 20 49 66 20 77 65 20 73  uccess.  If we s
b560: 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ee that the page
b570: 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e   does.** not con
b580: 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d  tain a well-form
b590: 65 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ed database page
b5a0: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a  , then return .*
b5b0: 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  * SQLITE_CORRUPT
b5c0: 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72  .  Note that a r
b5d0: 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f  eturn of SQLITE_
b5e0: 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67  OK does not.** g
b5f0: 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68  uarantee that th
b600: 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66  e page is well-f
b610: 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20  ormed.  It only 
b620: 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65  shows that.** we
b630: 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63   failed to detec
b640: 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e  t any corruption
b650: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b660: 69 6e 69 74 50 61 67 65 28 0a 20 20 4d 65 6d 50  initPage(.  MemP
b670: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
b680: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
b690: 6f 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  o be initialized
b6a0: 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
b6b0: 50 61 72 65 6e 74 20 20 20 20 20 20 20 2f 2a 20  Parent       /* 
b6c0: 54 68 65 20 70 61 72 65 6e 74 2e 20 20 4d 69 67  The parent.  Mig
b6d0: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  ht be NULL */.){
b6e0: 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20  .  int pc;      
b6f0: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
b700: 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20   of a freeblock 
b710: 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44  within pPage->aD
b720: 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 68  ata[] */.  int h
b730: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  dr;           /*
b740: 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e   Offset to begin
b750: 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65 61  ning of page hea
b760: 64 65 72 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  der */.  u8 *dat
b770: 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  a;          /* E
b780: 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61  qual to pPage->a
b790: 44 61 74 61 20 2a 2f 0a 20 20 42 74 53 68 61 72  Data */.  BtShar
b7a0: 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20  ed *pBt;        
b7b0: 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65  /* The main btre
b7c0: 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  e structure */. 
b7d0: 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
b7e0: 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66      /* Amount of
b7f0: 20 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e   usable space on
b800: 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20   each page */.  
b810: 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  int cellOffset; 
b820: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f     /* Offset fro
b830: 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67 65 20  m start of page 
b840: 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f  to first cell po
b850: 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  inter */.  int n
b860: 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Free;         /*
b870: 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65   Number of unuse
b880: 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70  d bytes on the p
b890: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70  age */.  int top
b8a0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
b8b0: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
b8c0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
b8d0: 65 61 20 2a 2f 0a 0a 20 20 70 42 74 20 3d 20 70  ea */..  pBt = p
b8e0: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73  Page->pBt;.  ass
b8f0: 65 72 74 28 20 70 42 74 21 3d 30 20 29 3b 0a 20  ert( pBt!=0 );. 
b900: 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
b910: 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e  ==0 || pParent->
b920: 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 61 73  pBt==pBt );.  as
b930: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e  sert( pPage->pgn
b940: 6f 3d 3d 73 71 6c 69 74 65 33 70 61 67 65 72 5f  o==sqlite3pager_
b950: 70 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  pagenumber(pPage
b960: 2d 3e 61 44 61 74 61 29 20 29 3b 0a 20 20 61 73  ->aData) );.  as
b970: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
b980: 74 61 20 3d 3d 20 26 28 28 75 6e 73 69 67 6e 65  ta == &((unsigne
b990: 64 20 63 68 61 72 2a 29 70 50 61 67 65 29 5b 2d  d char*)pPage)[-
b9a0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 20 29  pBt->pageSize] )
b9b0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70  ;.  if( pPage->p
b9c0: 50 61 72 65 6e 74 21 3d 70 50 61 72 65 6e 74 20  Parent!=pParent 
b9d0: 26 26 20 28 70 50 61 67 65 2d 3e 70 50 61 72 65  && (pPage->pPare
b9e0: 6e 74 21 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e  nt!=0 || pPage->
b9f0: 69 73 49 6e 69 74 29 20 29 7b 0a 20 20 20 20 2f  isInit) ){.    /
ba00: 2a 20 54 68 65 20 70 61 72 65 6e 74 20 70 61 67  * The parent pag
ba10: 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 63  e should never c
ba20: 68 61 6e 67 65 20 75 6e 6c 65 73 73 20 74 68 65  hange unless the
ba30: 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74   file is corrupt
ba40: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
ba50: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
ba60: 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  PT;.  }.  if( pP
ba70: 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 20 72 65  age->isInit ) re
ba80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ba90: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61    if( pPage->pPa
baa0: 72 65 6e 74 3d 3d 30 20 26 26 20 70 50 61 72 65  rent==0 && pPare
bab0: 6e 74 21 3d 30 20 29 7b 0a 20 20 20 20 70 50 61  nt!=0 ){.    pPa
bac0: 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 50  ge->pParent = pP
bad0: 61 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74  arent;.    sqlit
bae0: 65 33 70 61 67 65 72 5f 72 65 66 28 70 50 61 72  e3pager_ref(pPar
baf0: 65 6e 74 2d 3e 61 44 61 74 61 29 3b 0a 20 20 7d  ent->aData);.  }
bb00: 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
bb10: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 64 61 74  hdrOffset;.  dat
bb20: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
bb30: 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28  ;.  decodeFlags(
bb40: 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72 5d  pPage, data[hdr]
bb50: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65  );.  pPage->nOve
bb60: 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 70 50 61  rflow = 0;.  pPa
bb70: 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 30  ge->idxShift = 0
bb80: 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ;.  usableSize =
bb90: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
bba0: 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  ;.  pPage->cellO
bbb0: 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73  ffset = cellOffs
bbc0: 65 74 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20  et = hdr + 12 - 
bbd0: 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20  4*pPage->leaf;. 
bbe0: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28   top = get2byte(
bbf0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
bc00: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20   pPage->nCell = 
bc10: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
bc20: 64 72 2b 33 5d 29 3b 0a 20 20 69 66 28 20 70 50  dr+3]);.  if( pP
bc30: 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45  age->nCell>MX_CE
bc40: 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f  LL(pBt) ){.    /
bc50: 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20  * To many cells 
bc60: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67  for a single pag
bc70: 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d 75 73  e.  The page mus
bc80: 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a  t be corrupt */.
bc90: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
bca0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
bcb0: 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d    }.  if( pPage-
bcc0: 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 70 50 61  >nCell==0 && pPa
bcd0: 72 65 6e 74 21 3d 30 20 26 26 20 70 50 61 72 65  rent!=0 && pPare
bce0: 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 7b 0a 20  nt->pgno!=1 ){. 
bcf0: 20 20 20 2f 2a 20 41 6c 6c 20 70 61 67 65 73 20     /* All pages 
bd00: 6d 75 73 74 20 68 61 76 65 20 61 74 20 6c 65 61  must have at lea
bd10: 73 74 20 6f 6e 65 20 63 65 6c 6c 2c 20 65 78 63  st one cell, exc
bd20: 65 70 74 20 66 6f 72 20 72 6f 6f 74 20 70 61 67  ept for root pag
bd30: 65 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  es */.    return
bd40: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
bd50: 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BKPT;.  }..  /* 
bd60: 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61  Compute the tota
bd70: 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f 6e 20  l free space on 
bd80: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 70 63  the page */.  pc
bd90: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
bda0: 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 6e 46 72  a[hdr+1]);.  nFr
bdb0: 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d  ee = data[hdr+7]
bdc0: 20 2b 20 74 6f 70 20 2d 20 28 63 65 6c 6c 4f 66   + top - (cellOf
bdd0: 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e  fset + 2*pPage->
bde0: 6e 43 65 6c 6c 29 3b 0a 20 20 77 68 69 6c 65 28  nCell);.  while(
bdf0: 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74   pc>0 ){.    int
be00: 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20   next, size;.   
be10: 20 69 66 28 20 70 63 3e 75 73 61 62 6c 65 53 69   if( pc>usableSi
be20: 7a 65 2d 34 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ze-4 ){.      /*
be30: 20 46 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 6f   Free block is o
be40: 66 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  ff the page */. 
be50: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
be60: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
be70: 20 0a 20 20 20 20 7d 0a 20 20 20 20 6e 65 78 74   .    }.    next
be80: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
be90: 61 5b 70 63 5d 29 3b 0a 20 20 20 20 73 69 7a 65  a[pc]);.    size
bea0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
beb0: 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 69 66  a[pc+2]);.    if
bec0: 28 20 6e 65 78 74 3e 30 20 26 26 20 6e 65 78 74  ( next>0 && next
bed0: 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29 7b 0a 20  <=pc+size+3 ){. 
bee0: 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f       /* Free blo
bef0: 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61  cks must be in a
bf00: 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a  ccending order *
bf10: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
bf20: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
bf30: 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 6e  PT; .    }.    n
bf40: 46 72 65 65 20 2b 3d 20 73 69 7a 65 3b 0a 20 20  Free += size;.  
bf50: 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 7d    pc = next;.  }
bf60: 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
bf70: 3d 20 6e 46 72 65 65 3b 0a 20 20 69 66 28 20 6e  = nFree;.  if( n
bf80: 46 72 65 65 3e 3d 75 73 61 62 6c 65 53 69 7a 65  Free>=usableSize
bf90: 20 29 7b 0a 20 20 20 20 2f 2a 20 46 72 65 65 20   ){.    /* Free 
bfa0: 73 70 61 63 65 20 63 61 6e 6e 6f 74 20 65 78 63  space cannot exc
bfb0: 65 65 64 20 74 6f 74 61 6c 20 70 61 67 65 20 73  eed total page s
bfc0: 69 7a 65 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ize */.    retur
bfd0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
bfe0: 5f 42 4b 50 54 3b 20 0a 20 20 7d 0a 0a 20 20 70  _BKPT; .  }..  p
bff0: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31  Page->isInit = 1
c000: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
c010: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
c020: 65 74 20 75 70 20 61 20 72 61 77 20 70 61 67 65  et up a raw page
c030: 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b   so that it look
c040: 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73  s like a databas
c050: 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a  e page holding.*
c060: 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f  * no entries..*/
c070: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72  .static void zer
c080: 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  oPage(MemPage *p
c090: 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29  Page, int flags)
c0a0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
c0b0: 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d  r *data = pPage-
c0c0: 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72  >aData;.  BtShar
c0d0: 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
c0e0: 3e 70 42 74 3b 0a 20 20 69 6e 74 20 68 64 72 20  >pBt;.  int hdr 
c0f0: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
c100: 65 74 3b 0a 20 20 69 6e 74 20 66 69 72 73 74 3b  et;.  int first;
c110: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
c120: 74 65 33 70 61 67 65 72 5f 70 61 67 65 6e 75 6d  te3pager_pagenum
c130: 62 65 72 28 64 61 74 61 29 3d 3d 70 50 61 67 65  ber(data)==pPage
c140: 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65  ->pgno );.  asse
c150: 72 74 28 20 26 64 61 74 61 5b 70 42 74 2d 3e 70  rt( &data[pBt->p
c160: 61 67 65 53 69 7a 65 5d 20 3d 3d 20 28 75 6e 73  ageSize] == (uns
c170: 69 67 6e 65 64 20 63 68 61 72 2a 29 70 50 61 67  igned char*)pPag
c180: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
c190: 71 6c 69 74 65 33 70 61 67 65 72 5f 69 73 77 72  qlite3pager_iswr
c1a0: 69 74 65 61 62 6c 65 28 64 61 74 61 29 20 29 3b  iteable(data) );
c1b0: 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
c1c0: 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73  hdr], 0, pBt->us
c1d0: 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b  ableSize - hdr);
c1e0: 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 66  .  data[hdr] = f
c1f0: 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d 20  lags;.  first = 
c200: 68 64 72 20 2b 20 38 20 2b 20 34 2a 28 28 66 6c  hdr + 8 + 4*((fl
c210: 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30  ags&PTF_LEAF)==0
c220: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  );.  memset(&dat
c230: 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b  a[hdr+1], 0, 4);
c240: 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d  .  data[hdr+7] =
c250: 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   0;.  put2byte(&
c260: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74  data[hdr+5], pBt
c270: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  ->usableSize);. 
c280: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
c290: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
c2a0: 2d 20 66 69 72 73 74 3b 0a 20 20 64 65 63 6f 64  - first;.  decod
c2b0: 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c  eFlags(pPage, fl
c2c0: 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 68  ags);.  pPage->h
c2d0: 64 72 4f 66 66 73 65 74 20 3d 20 68 64 72 3b 0a  drOffset = hdr;.
c2e0: 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66    pPage->cellOff
c2f0: 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70  set = first;.  p
c300: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
c310: 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 64  = 0;.  pPage->id
c320: 78 53 68 69 66 74 20 3d 20 30 3b 0a 20 20 70 50  xShift = 0;.  pP
c330: 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a  age->nCell = 0;.
c340: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
c350: 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  = 1;.}../*.** Ge
c360: 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  t a page from th
c370: 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61  e pager.  Initia
c380: 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65  lize the MemPage
c390: 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50  .pBt and.** MemP
c3a0: 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e  age.aData elemen
c3b0: 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f  ts if needed..*/
c3c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 50  .static int getP
c3d0: 61 67 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  age(BtShared *pB
c3e0: 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 4d 65  t, Pgno pgno, Me
c3f0: 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 29 7b  mPage **ppPage){
c400: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73  .  int rc;.  uns
c410: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74  igned char *aDat
c420: 61 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  a;.  MemPage *pP
c430: 61 67 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  age;.  rc = sqli
c440: 74 65 33 70 61 67 65 72 5f 67 65 74 28 70 42 74  te3pager_get(pBt
c450: 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  ->pPager, pgno, 
c460: 28 76 6f 69 64 2a 2a 29 26 61 44 61 74 61 29 3b  (void**)&aData);
c470: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
c480: 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 20 3d  rn rc;.  pPage =
c490: 20 28 4d 65 6d 50 61 67 65 2a 29 26 61 44 61 74   (MemPage*)&aDat
c4a0: 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  a[pBt->pageSize]
c4b0: 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ;.  pPage->aData
c4c0: 20 3d 20 61 44 61 74 61 3b 0a 20 20 70 50 61 67   = aData;.  pPag
c4d0: 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  e->pBt = pBt;.  
c4e0: 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67  pPage->pgno = pg
c4f0: 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72  no;.  pPage->hdr
c500: 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e  Offset = pPage->
c510: 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20  pgno==1 ? 100 : 
c520: 30 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 70  0;.  *ppPage = p
c530: 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  Page;.  return S
c540: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
c550: 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72  ** Get a page fr
c560: 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61 6e 64  om the pager and
c570: 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 20   initialize it. 
c580: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
c590: 20 69 73 20 6a 75 73 74 20 61 20 63 6f 6e 76 65   is just a conve
c5a0: 6e 69 65 6e 63 65 20 77 72 61 70 70 65 72 20 61  nience wrapper a
c5b0: 72 6f 75 6e 64 20 73 65 70 61 72 61 74 65 20 63  round separate c
c5c0: 61 6c 6c 73 20 74 6f 0a 2a 2a 20 67 65 74 50 61  alls to.** getPa
c5d0: 67 65 28 29 20 61 6e 64 20 69 6e 69 74 50 61 67  ge() and initPag
c5e0: 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
c5f0: 6e 74 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67  nt getAndInitPag
c600: 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
c610: 42 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Bt,          /* 
c620: 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
c630: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
c640: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ,           /* N
c650: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
c660: 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65  e to get */.  Me
c670: 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
c680: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
c690: 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68 65 72  page pointer her
c6a0: 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
c6b0: 70 50 61 72 65 6e 74 20 20 20 20 20 2f 2a 20 50  pParent     /* P
c6c0: 61 72 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  arent of the pag
c6d0: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
c6e0: 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20  ;.  if( pgno==0 
c6f0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
c700: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
c710: 54 3b 20 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67  T; .  }.  rc = g
c720: 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f  etPage(pBt, pgno
c730: 2c 20 70 70 50 61 67 65 29 3b 0a 20 20 69 66 28  , ppPage);.  if(
c740: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
c750: 26 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49  & (*ppPage)->isI
c760: 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  nit==0 ){.    rc
c770: 20 3d 20 69 6e 69 74 50 61 67 65 28 2a 70 70 50   = initPage(*ppP
c780: 61 67 65 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20  age, pParent);. 
c790: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
c7a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
c7b0: 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69   a MemPage.  Thi
c7c0: 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  s should be call
c7d0: 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
c7e0: 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74   prior.** call t
c7f0: 6f 20 67 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74  o getPage..*/.st
c800: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
c810: 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  ePage(MemPage *p
c820: 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61  Page){.  if( pPa
c830: 67 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ge ){.    assert
c840: 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  ( pPage->aData )
c850: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
c860: 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20  age->pBt );.    
c870: 61 73 73 65 72 74 28 20 26 70 50 61 67 65 2d 3e  assert( &pPage->
c880: 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 70 42 74  aData[pPage->pBt
c890: 2d 3e 70 61 67 65 53 69 7a 65 5d 3d 3d 28 75 6e  ->pageSize]==(un
c8a0: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 50 61  signed char*)pPa
c8b0: 67 65 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ge );.    sqlite
c8c0: 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70 50 61  3pager_unref(pPa
c8d0: 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 7d 0a  ge->aData);.  }.
c8e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
c8f0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
c900: 77 68 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e  when the referen
c910: 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70  ce count for a p
c920: 61 67 65 0a 2a 2a 20 72 65 61 63 68 65 73 20 7a  age.** reaches z
c930: 65 72 6f 2e 20 20 57 65 20 6e 65 65 64 20 74 6f  ero.  We need to
c940: 20 75 6e 72 65 66 20 74 68 65 20 70 50 61 72 65   unref the pPare
c950: 6e 74 20 70 6f 69 6e 74 65 72 20 77 68 65 6e 20  nt pointer when 
c960: 74 68 61 74 0a 2a 2a 20 68 61 70 70 65 6e 73 2e  that.** happens.
c970: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c980: 70 61 67 65 44 65 73 74 72 75 63 74 6f 72 28 76  pageDestructor(v
c990: 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20  oid *pData, int 
c9a0: 70 61 67 65 53 69 7a 65 29 7b 0a 20 20 4d 65 6d  pageSize){.  Mem
c9b0: 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61  Page *pPage;.  a
c9c0: 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65  ssert( (pageSize
c9d0: 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 70 50   & 7)==0 );.  pP
c9e0: 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29  age = (MemPage*)
c9f0: 26 28 28 63 68 61 72 2a 29 70 44 61 74 61 29 5b  &((char*)pData)[
ca00: 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20 69 66 28  pageSize];.  if(
ca10: 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20   pPage->pParent 
ca20: 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  ){.    MemPage *
ca30: 70 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d  pParent = pPage-
ca40: 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 70 50  >pParent;.    pP
ca50: 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 30  age->pParent = 0
ca60: 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
ca70: 65 28 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a  e(pParent);.  }.
ca80: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
ca90: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75  = 0;.}../*.** Du
caa0: 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c  ring a rollback,
cab0: 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   when the pager 
cac0: 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74  reloads informat
cad0: 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63  ion into the cac
cae0: 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68  he.** so that th
caf0: 65 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f  e cache is resto
cb00: 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69  red to its origi
cb10: 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74 68 65  nal state at the
cb20: 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65   start of.** the
cb30: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f   transaction, fo
cb40: 72 20 65 61 63 68 20 70 61 67 65 20 72 65 73 74  r each page rest
cb50: 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e  ored this routin
cb60: 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  e is called..**.
cb70: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
cb80: 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74 20 74  needs to reset t
cb90: 68 65 20 65 78 74 72 61 20 64 61 74 61 20 73 65  he extra data se
cba0: 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64  ction at the end
cbb0: 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   of the.** page 
cbc0: 74 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68  to agree with th
cbd0: 65 20 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e  e restored data.
cbe0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
cbf0: 70 61 67 65 52 65 69 6e 69 74 28 76 6f 69 64 20  pageReinit(void 
cc00: 2a 70 44 61 74 61 2c 20 69 6e 74 20 70 61 67 65  *pData, int page
cc10: 53 69 7a 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65  Size){.  MemPage
cc20: 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72   *pPage;.  asser
cc30: 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37  t( (pageSize & 7
cc40: 29 3d 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 20  )==0 );.  pPage 
cc50: 3d 20 28 4d 65 6d 50 61 67 65 2a 29 26 28 28 63  = (MemPage*)&((c
cc60: 68 61 72 2a 29 70 44 61 74 61 29 5b 70 61 67 65  har*)pData)[page
cc70: 53 69 7a 65 5d 3b 0a 20 20 69 66 28 20 70 50 61  Size];.  if( pPa
cc80: 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20  ge->isInit ){.  
cc90: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
cca0: 3d 20 30 3b 0a 20 20 20 20 69 6e 69 74 50 61 67  = 0;.    initPag
ccb0: 65 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e  e(pPage, pPage->
ccc0: 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 7d 0a  pParent);.  }.}.
ccd0: 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61  ./*.** Open a da
cce0: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
ccf0: 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73  .** zFilename is
cd00: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
cd10: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
cd20: 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
cd30: 20 4e 55 4c 4c 0a 2a 2a 20 61 20 6e 65 77 20 64   NULL.** a new d
cd40: 61 74 61 62 61 73 65 20 77 69 74 68 20 61 20 72  atabase with a r
cd50: 61 6e 64 6f 6d 20 6e 61 6d 65 20 69 73 20 63 72  andom name is cr
cd60: 65 61 74 65 64 2e 20 20 54 68 69 73 20 72 61 6e  eated.  This ran
cd70: 64 6f 6d 6c 79 20 6e 61 6d 65 64 0a 2a 2a 20 64  domly named.** d
cd80: 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c  atabase file wil
cd90: 6c 20 62 65 20 64 65 6c 65 74 65 64 20 77 68 65  l be deleted whe
cda0: 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  n sqlite3BtreeCl
cdb0: 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ose() is called.
cdc0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
cdd0: 74 72 65 65 4f 70 65 6e 28 0a 20 20 63 6f 6e 73  treeOpen(.  cons
cde0: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
cdf0: 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  e,  /* Name of t
ce00: 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69  he file containi
ce10: 6e 67 20 74 68 65 20 42 54 72 65 65 20 64 61 74  ng the BTree dat
ce20: 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  abase */.  sqlit
ce30: 65 33 20 2a 70 53 71 6c 69 74 65 2c 20 20 20 20  e3 *pSqlite,    
ce40: 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64     /* Associated
ce50: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
ce60: 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70   */.  Btree **pp
ce70: 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a  Btree,        /*
ce80: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20   Pointer to new 
ce90: 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69  Btree object wri
cea0: 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69  tten here */.  i
ceb0: 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
cec0: 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e         /* Option
ced0: 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  s */.){.  BtShar
cee0: 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20  ed *pBt;        
cef0: 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74    /* Shared part
cf00: 20 6f 66 20 62 74 72 65 65 20 73 74 72 75 63 74   of btree struct
cf10: 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a  ure */.  Btree *
cf20: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
cf30: 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65   /* Handle to re
cf40: 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  turn */.  int rc
cf50: 3b 0a 20 20 69 6e 74 20 6e 52 65 73 65 72 76 65  ;.  int nReserve
cf60: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
cf70: 72 20 7a 44 62 48 65 61 64 65 72 5b 31 30 30 5d  r zDbHeader[100]
cf80: 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ;.#if !defined(S
cf90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
cfa0: 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66  D_CACHE) && !def
cfb0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
cfc0: 5f 44 49 53 4b 49 4f 29 0a 20 20 63 6f 6e 73 74  _DISKIO).  const
cfd0: 20 54 68 72 65 61 64 44 61 74 61 20 2a 70 54 73   ThreadData *pTs
cfe0: 64 72 6f 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  dro;.#endif..  /
cff0: 2a 20 53 65 74 20 74 68 65 20 76 61 72 69 61 62  * Set the variab
d000: 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72  le isMemdb to tr
d010: 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  ue for an in-mem
d020: 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72  ory database, or
d030: 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72   .  ** false for
d040: 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61   a file-based da
d050: 74 61 62 61 73 65 2e 20 54 68 69 73 20 73 79 6d  tabase. This sym
d060: 62 6f 6c 20 69 73 20 6f 6e 6c 79 20 72 65 71 75  bol is only requ
d070: 69 72 65 64 20 69 66 0a 20 20 2a 2a 20 65 69 74  ired if.  ** eit
d080: 68 65 72 20 6f 66 20 74 68 65 20 73 68 61 72 65  her of the share
d090: 64 2d 64 61 74 61 20 6f 72 20 61 75 74 6f 76 61  d-data or autova
d0a0: 63 75 75 6d 20 66 65 61 74 75 72 65 73 20 61 72  cuum features ar
d0b0: 65 20 63 6f 6d 70 69 6c 65 64 20 0a 20 20 2a 2a  e compiled .  **
d0c0: 20 69 6e 74 6f 20 74 68 65 20 6c 69 62 72 61 72   into the librar
d0d0: 79 2e 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66  y..  */.#if !def
d0e0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
d0f0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 7c  _SHARED_CACHE) |
d100: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
d110: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
d120: 4d 29 0a 20 20 23 69 66 64 65 66 20 53 51 4c 49  M).  #ifdef SQLI
d130: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
d140: 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  .    const int i
d150: 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 20 20 23 65  sMemdb = 0;.  #e
d160: 6c 73 65 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e  lse.    const in
d170: 74 20 69 73 4d 65 6d 64 62 20 3d 20 7a 46 69 6c  t isMemdb = zFil
d180: 65 6e 61 6d 65 20 26 26 20 21 73 74 72 63 6d 70  ename && !strcmp
d190: 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65  (zFilename, ":me
d1a0: 6d 6f 72 79 3a 22 29 3b 0a 20 20 23 65 6e 64 69  mory:");.  #endi
d1b0: 66 0a 23 65 6e 64 69 66 0a 0a 20 20 70 20 3d 20  f.#endif..  p = 
d1c0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a  sqliteMalloc(siz
d1d0: 65 6f 66 28 42 74 72 65 65 29 29 3b 0a 20 20 69  eof(Btree));.  i
d1e0: 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74  f( !p ){.    ret
d1f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
d200: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61  ;.  }.  p->inTra
d210: 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  ns = TRANS_NONE;
d220: 0a 20 20 70 2d 3e 70 53 71 6c 69 74 65 20 3d 20  .  p->pSqlite = 
d230: 70 53 71 6c 69 74 65 3b 0a 0a 20 20 2f 2a 20 54  pSqlite;..  /* T
d240: 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 20 65 78  ry to find an ex
d250: 69 73 74 69 6e 67 20 42 74 72 65 65 20 73 74 72  isting Btree str
d260: 75 63 74 75 72 65 20 6f 70 65 6e 65 64 20 6f 6e  ucture opened on
d270: 20 7a 46 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a 23   zFilename. */.#
d280: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
d290: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
d2a0: 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
d2b0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
d2c0: 53 4b 49 4f 29 0a 20 20 70 54 73 64 72 6f 20 3d  SKIO).  pTsdro =
d2d0: 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61   sqlite3ThreadDa
d2e0: 74 61 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 20 20  taReadOnly();.  
d2f0: 69 66 28 20 70 54 73 64 72 6f 2d 3e 75 73 65 53  if( pTsdro->useS
d300: 68 61 72 65 64 44 61 74 61 20 26 26 20 7a 46 69  haredData && zFi
d310: 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d  lename && !isMem
d320: 64 62 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  db ){.    char *
d330: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
d340: 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74  sqlite3OsFullPat
d350: 68 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29  hname(zFilename)
d360: 3b 0a 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c  ;.    if( !zFull
d370: 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
d380: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b    sqliteFree(p);
d390: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
d3a0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
d3b0: 7d 0a 20 20 20 20 66 6f 72 28 70 42 74 3d 70 54  }.    for(pBt=pT
d3c0: 73 64 72 6f 2d 3e 70 42 74 72 65 65 3b 20 70 42  sdro->pBtree; pB
d3d0: 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78  t; pBt=pBt->pNex
d3e0: 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t){.      assert
d3f0: 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pBt->nRef>0 );
d400: 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74  .      if( 0==st
d410: 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61  rcmp(zFullPathna
d420: 6d 65 2c 20 73 71 6c 69 74 65 33 70 61 67 65 72  me, sqlite3pager
d430: 5f 66 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70  _filename(pBt->p
d440: 50 61 67 65 72 29 29 20 29 7b 0a 20 20 20 20 20  Pager)) ){.     
d450: 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b     p->pBt = pBt;
d460: 0a 20 20 20 20 20 20 20 20 2a 70 70 42 74 72 65  .        *ppBtre
d470: 65 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 70  e = p;.        p
d480: 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  Bt->nRef++;.    
d490: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
d4a0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
d4b0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
d4c0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
d4d0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
d4e0: 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  eFree(zFullPathn
d4f0: 61 6d 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ame);.  }.#endif
d500: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  /*.  ** The 
d510: 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
d520: 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  s make sure that
d530: 20 73 74 72 75 63 74 75 72 65 73 20 75 73 65 64   structures used
d540: 20 62 79 20 74 68 65 20 62 74 72 65 65 20 61 72   by the btree ar
d550: 65 0a 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74  e.  ** the right
d560: 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20   size.  This is 
d570: 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73 74  to guard against
d580: 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68   size changes th
d590: 61 74 20 72 65 73 75 6c 74 0a 20 20 2a 2a 20 77  at result.  ** w
d5a0: 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e  hen compiling on
d5b0: 20 61 20 64 69 66 66 65 72 65 6e 74 20 61 72 63   a different arc
d5c0: 68 69 74 65 63 74 75 72 65 2e 0a 20 20 2a 2f 0a  hitecture..  */.
d5d0: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
d5e0: 28 69 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65  (i64)==8 || size
d5f0: 6f 66 28 69 36 34 29 3d 3d 34 20 29 3b 0a 20 20  of(i64)==4 );.  
d600: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75  assert( sizeof(u
d610: 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66  64)==8 || sizeof
d620: 28 75 36 34 29 3d 3d 34 20 29 3b 0a 20 20 61 73  (u64)==4 );.  as
d630: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32  sert( sizeof(u32
d640: 29 3d 3d 34 20 29 3b 0a 20 20 61 73 73 65 72 74  )==4 );.  assert
d650: 28 20 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32  ( sizeof(u16)==2
d660: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69   );.  assert( si
d670: 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b  zeof(Pgno)==4 );
d680: 0a 0a 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65  ..  pBt = sqlite
d690: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  Malloc( sizeof(*
d6a0: 70 42 74 29 20 29 3b 0a 20 20 69 66 28 20 70 42  pBt) );.  if( pB
d6b0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 70 42  t==0 ){.    *ppB
d6c0: 74 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 73 71  tree = 0;.    sq
d6d0: 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 20 20 20  liteFree(p);.   
d6e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
d6f0: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  OMEM;.  }.  rc =
d700: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70   sqlite3pager_op
d710: 65 6e 28 26 70 42 74 2d 3e 70 50 61 67 65 72 2c  en(&pBt->pPager,
d720: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 45 58 54 52   zFilename, EXTR
d730: 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73 29 3b 0a  A_SIZE, flags);.
d740: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
d750: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
d760: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65 61  sqlite3pager_rea
d770: 64 5f 66 69 6c 65 68 65 61 64 65 72 28 70 42 74  d_fileheader(pBt
d780: 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66 28  ->pPager,sizeof(
d790: 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48 65  zDbHeader),zDbHe
d7a0: 61 64 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ader);.  }.  if(
d7b0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
d7c0: 7b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  {.    if( pBt->p
d7d0: 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73  Pager ){.      s
d7e0: 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6c 6f 73  qlite3pager_clos
d7f0: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  e(pBt->pPager);.
d800: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
d810: 46 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73  Free(pBt);.    s
d820: 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 20 20  qliteFree(p);.  
d830: 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a    *ppBtree = 0;.
d840: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
d850: 20 7d 0a 20 20 70 2d 3e 70 42 74 20 3d 20 70 42   }.  p->pBt = pB
d860: 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 70 61 67  t;..  sqlite3pag
d870: 65 72 5f 73 65 74 5f 64 65 73 74 72 75 63 74 6f  er_set_destructo
d880: 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  r(pBt->pPager, p
d890: 61 67 65 44 65 73 74 72 75 63 74 6f 72 29 3b 0a  ageDestructor);.
d8a0: 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73    sqlite3pager_s
d8b0: 65 74 5f 72 65 69 6e 69 74 65 72 28 70 42 74 2d  et_reiniter(pBt-
d8c0: 3e 70 50 61 67 65 72 2c 20 70 61 67 65 52 65 69  >pPager, pageRei
d8d0: 6e 69 74 29 3b 0a 20 20 70 42 74 2d 3e 70 43 75  nit);.  pBt->pCu
d8e0: 72 73 6f 72 20 3d 20 30 3b 0a 20 20 70 42 74 2d  rsor = 0;.  pBt-
d8f0: 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 70  >pPage1 = 0;.  p
d900: 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 73  Bt->readOnly = s
d910: 71 6c 69 74 65 33 70 61 67 65 72 5f 69 73 72 65  qlite3pager_isre
d920: 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67  adonly(pBt->pPag
d930: 65 72 29 3b 0a 20 20 70 42 74 2d 3e 70 61 67 65  er);.  pBt->page
d940: 53 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  Size = get2byte(
d950: 26 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 29 3b  &zDbHeader[16]);
d960: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65  .  if( pBt->page
d970: 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d  Size<512 || pBt-
d980: 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45  >pageSize>SQLITE
d990: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20  _MAX_PAGE_SIZE. 
d9a0: 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e        || ((pBt->
d9b0: 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d  pageSize-1)&pBt-
d9c0: 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b  >pageSize)!=0 ){
d9d0: 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69  .    pBt->pageSi
d9e0: 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  ze = SQLITE_DEFA
d9f0: 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20  ULT_PAGE_SIZE;. 
da00: 20 20 20 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64     pBt->maxEmbed
da10: 46 72 61 63 20 3d 20 36 34 3b 20 20 20 2f 2a 20  Frac = 64;   /* 
da20: 32 35 25 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e  25% */.    pBt->
da30: 6d 69 6e 45 6d 62 65 64 46 72 61 63 20 3d 20 33  minEmbedFrac = 3
da40: 32 3b 20 20 20 2f 2a 20 31 32 2e 35 25 20 2a 2f  2;   /* 12.5% */
da50: 0a 20 20 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  .    pBt->minLea
da60: 66 46 72 61 63 20 3d 20 33 32 3b 20 20 20 20 2f  fFrac = 32;    /
da70: 2a 20 31 32 2e 35 25 20 2a 2f 0a 23 69 66 6e 64  * 12.5% */.#ifnd
da80: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
da90: 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 2f 2a  UTOVACUUM.    /*
daa0: 20 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61   If the magic na
dab0: 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69  me ":memory:" wi
dac0: 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d  ll create an in-
dad0: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
dae0: 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 64 6f 20   then.    ** do 
daf0: 6e 6f 74 20 73 65 74 20 74 68 65 20 61 75 74 6f  not set the auto
db00: 2d 76 61 63 75 75 6d 20 66 6c 61 67 2c 20 65 76  -vacuum flag, ev
db10: 65 6e 20 69 66 20 53 51 4c 49 54 45 5f 44 45 46  en if SQLITE_DEF
db20: 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  AULT_AUTOVACUUM.
db30: 20 20 20 20 2a 2a 20 69 73 20 74 72 75 65 2e 20      ** is true. 
db40: 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
db50: 64 2c 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  d, if SQLITE_OMI
db60: 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62  T_MEMORYDB has b
db70: 65 65 6e 20 64 65 66 69 6e 65 64 2c 0a 20 20 20  een defined,.   
db80: 20 2a 2a 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72   ** then ":memor
db90: 79 3a 22 20 69 73 20 6a 75 73 74 20 61 20 72 65  y:" is just a re
dba0: 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e  gular file-name.
dbb0: 20 52 65 73 70 65 63 74 20 74 68 65 20 61 75 74   Respect the aut
dbc0: 6f 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a 20  o-vacuum.    ** 
dbd0: 64 65 66 61 75 6c 74 20 69 6e 20 74 68 69 73 20  default in this 
dbe0: 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  case..    */.   
dbf0: 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
dc00: 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20  & !isMemdb ){.  
dc10: 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
dc20: 75 75 6d 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  uum = SQLITE_DEF
dc30: 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3b  AULT_AUTOVACUUM;
dc40: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
dc50: 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a    nReserve = 0;.
dc60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 52 65    }else{.    nRe
dc70: 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65  serve = zDbHeade
dc80: 72 5b 32 30 5d 3b 0a 20 20 20 20 70 42 74 2d 3e  r[20];.    pBt->
dc90: 6d 61 78 45 6d 62 65 64 46 72 61 63 20 3d 20 7a  maxEmbedFrac = z
dca0: 44 62 48 65 61 64 65 72 5b 32 31 5d 3b 0a 20 20  DbHeader[21];.  
dcb0: 20 20 70 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46    pBt->minEmbedF
dcc0: 72 61 63 20 3d 20 7a 44 62 48 65 61 64 65 72 5b  rac = zDbHeader[
dcd0: 32 32 5d 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 69  22];.    pBt->mi
dce0: 6e 4c 65 61 66 46 72 61 63 20 3d 20 7a 44 62 48  nLeafFrac = zDbH
dcf0: 65 61 64 65 72 5b 32 33 5d 3b 0a 20 20 20 20 70  eader[23];.    p
dd00: 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
dd10: 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53  d = 1;.#ifndef S
dd20: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
dd30: 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61  ACUUM.    pBt->a
dd40: 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74  utoVacuum = (get
dd50: 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72  4byte(&zDbHeader
dd60: 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29  [36 + 4*4])?1:0)
dd70: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70  ;.#endif.  }.  p
dd80: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
dd90: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
dda0: 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 61 73 73   nReserve;.  ass
ddb0: 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53  ert( (pBt->pageS
ddc0: 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20  ize & 7)==0 );  
ddd0: 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d  /* 8-byte alignm
dde0: 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20  ent of pageSize 
ddf0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65  */.  sqlite3page
de00: 72 5f 73 65 74 5f 70 61 67 65 73 69 7a 65 28 70  r_set_pagesize(p
de10: 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 42 74 2d  Bt->pPager, pBt-
de20: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 23 69 66  >pageSize);..#if
de30: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
de40: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
de50: 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
de60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
de70: 49 4f 29 0a 20 20 2f 2a 20 41 64 64 20 74 68 65  IO).  /* Add the
de80: 20 6e 65 77 20 62 74 72 65 65 20 74 6f 20 74 68   new btree to th
de90: 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74  e linked list st
dea0: 61 72 74 69 6e 67 20 61 74 20 54 68 72 65 61 64  arting at Thread
deb0: 44 61 74 61 2e 70 42 74 72 65 65 2e 0a 20 20 2a  Data.pBtree..  *
dec0: 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 63 68  * There is no ch
ded0: 61 6e 63 65 20 74 68 61 74 20 61 20 6d 61 6c 6c  ance that a mall
dee0: 6f 63 28 29 20 6d 61 79 20 66 61 69 6c 20 69 6e  oc() may fail in
def0: 73 69 64 65 20 6f 66 20 74 68 65 20 0a 20 20 2a  side of the .  *
df00: 2a 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44  * sqlite3ThreadD
df10: 61 74 61 28 29 20 63 61 6c 6c 2c 20 61 73 20 74  ata() call, as t
df20: 68 65 20 54 68 72 65 61 64 44 61 74 61 20 73 74  he ThreadData st
df30: 72 75 63 74 75 72 65 20 6d 75 73 74 20 68 61 76  ructure must hav
df40: 65 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62  e already.  ** b
df50: 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  een allocated fo
df60: 72 20 70 54 73 64 72 6f 2d 3e 75 73 65 53 68 61  r pTsdro->useSha
df70: 72 65 64 44 61 74 61 20 74 6f 20 62 65 20 6e 6f  redData to be no
df80: 6e 2d 7a 65 72 6f 2e 0a 20 20 2a 2f 0a 20 20 69  n-zero..  */.  i
df90: 66 28 20 70 54 73 64 72 6f 2d 3e 75 73 65 53 68  f( pTsdro->useSh
dfa0: 61 72 65 64 44 61 74 61 20 26 26 20 7a 46 69 6c  aredData && zFil
dfb0: 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64  ename && !isMemd
dfc0: 62 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 4e  b ){.    pBt->pN
dfd0: 65 78 74 20 3d 20 70 54 73 64 72 6f 2d 3e 70 42  ext = pTsdro->pB
dfe0: 74 72 65 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  tree;.    sqlite
dff0: 33 54 68 72 65 61 64 44 61 74 61 28 29 2d 3e 70  3ThreadData()->p
e000: 42 74 72 65 65 20 3d 20 70 42 74 3b 0a 20 20 7d  Btree = pBt;.  }
e010: 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e 6e  .#endif.  pBt->n
e020: 52 65 66 20 3d 20 31 3b 0a 20 20 2a 70 70 42 74  Ref = 1;.  *ppBt
e030: 72 65 65 20 3d 20 70 3b 0a 20 20 72 65 74 75 72  ree = p;.  retur
e040: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
e050: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f  /*.** Close an o
e060: 70 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64  pen database and
e070: 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
e080: 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20  cursors..*/.int 
e090: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
e0a0: 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  e(Btree *p){.  B
e0b0: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
e0c0: 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f  ->pBt;.  BtCurso
e0d0: 72 20 2a 70 43 75 72 3b 0a 0a 23 69 66 6e 64 65  r *pCur;..#ifnde
e0e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
e0f0: 41 52 45 44 5f 43 41 43 48 45 0a 20 20 54 68 72  ARED_CACHE.  Thr
e100: 65 61 64 44 61 74 61 20 2a 70 54 73 64 3b 0a 23  eadData *pTsd;.#
e110: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6c 6f 73  endif..  /* Clos
e120: 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70  e all cursors op
e130: 65 6e 65 64 20 76 69 61 20 74 68 69 73 20 68 61  ened via this ha
e140: 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 70 43 75 72  ndle.  */.  pCur
e150: 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
e160: 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72 20 29  .  while( pCur )
e170: 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a  {.    BtCursor *
e180: 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20  pTmp = pCur;.   
e190: 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e   pCur = pCur->pN
e1a0: 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d  ext;.    if( pTm
e1b0: 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a  p->pBtree==p ){.
e1c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
e1d0: 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54  eeCloseCursor(pT
e1e0: 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  mp);.    }.  }..
e1f0: 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e    /* Rollback an
e200: 79 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  y active transac
e210: 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68  tion and free th
e220: 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75  e handle structu
e230: 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c  re..  ** The cal
e240: 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
e250: 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70  eRollback() drop
e260: 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b  s any table-lock
e270: 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74  s held by.  ** t
e280: 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f  his handle..  */
e290: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  .  sqlite3BtreeR
e2a0: 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20 73 71  ollback(p);.  sq
e2b0: 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 0a 23 69  liteFree(p);..#i
e2c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e2d0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
e2e0: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
e2f0: 20 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74   still other out
e300: 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
e310: 63 65 73 20 74 6f 20 74 68 65 20 73 68 61 72 65  ces to the share
e320: 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72  d-btree.  ** str
e330: 75 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e  ucture, return n
e340: 6f 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65  ow. The remainde
e350: 72 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64  r of this proced
e360: 75 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a  ure cleans .  **
e370: 20 75 70 20 74 68 65 20 73 68 61 72 65 64 2d 62   up the shared-b
e380: 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  tree..  */.  ass
e390: 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30  ert( pBt->nRef>0
e3a0: 20 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d   );.  pBt->nRef-
e3b0: 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52  -;.  if( pBt->nR
e3c0: 65 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ef ){.    return
e3d0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
e3e0: 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65  .  /* Remove the
e3f0: 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 66 72   shared-btree fr
e400: 6f 6d 20 74 68 65 20 74 68 72 65 61 64 20 77 69  om the thread wi
e410: 64 65 20 6c 69 73 74 2e 20 43 61 6c 6c 20 0a 20  de list. Call . 
e420: 20 2a 2a 20 54 68 72 65 61 64 44 61 74 61 52 65   ** ThreadDataRe
e430: 61 64 4f 6e 6c 79 28 29 20 61 6e 64 20 74 68 65  adOnly() and the
e440: 6e 20 63 61 73 74 20 61 77 61 79 20 74 68 65 20  n cast away the 
e450: 63 6f 6e 73 74 20 70 72 6f 70 65 72 74 79 20 6f  const property o
e460: 66 20 74 68 65 20 0a 20 20 2a 2a 20 70 6f 69 6e  f the .  ** poin
e470: 74 65 72 20 74 6f 20 61 76 6f 69 64 20 61 6c 6c  ter to avoid all
e480: 6f 63 61 74 69 6e 67 20 74 68 72 65 61 64 20 64  ocating thread d
e490: 61 74 61 20 69 66 20 69 74 20 69 73 20 6e 6f 74  ata if it is not
e4a0: 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64   really required
e4b0: 2e 0a 20 20 2a 2f 0a 20 20 70 54 73 64 20 3d 20  ..  */.  pTsd = 
e4c0: 28 54 68 72 65 61 64 44 61 74 61 20 2a 29 73 71  (ThreadData *)sq
e4d0: 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61 52  lite3ThreadDataR
e4e0: 65 61 64 4f 6e 6c 79 28 29 3b 0a 20 20 69 66 28  eadOnly();.  if(
e4f0: 20 70 54 73 64 2d 3e 70 42 74 72 65 65 3d 3d 70   pTsd->pBtree==p
e500: 42 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  Bt ){.    assert
e510: 28 20 70 54 73 64 3d 3d 73 71 6c 69 74 65 33 54  ( pTsd==sqlite3T
e520: 68 72 65 61 64 44 61 74 61 28 29 20 29 3b 0a 20  hreadData() );. 
e530: 20 20 20 70 54 73 64 2d 3e 70 42 74 72 65 65 20     pTsd->pBtree 
e540: 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pBt->pNext;.  
e550: 7d 65 6c 73 65 7b 0a 20 20 20 20 42 74 53 68 61  }else{.    BtSha
e560: 72 65 64 20 2a 70 50 72 65 76 3b 0a 20 20 20 20  red *pPrev;.    
e570: 66 6f 72 28 70 50 72 65 76 3d 70 54 73 64 2d 3e  for(pPrev=pTsd->
e580: 70 42 74 72 65 65 3b 20 70 50 72 65 76 20 26 26  pBtree; pPrev &&
e590: 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 21 3d 70   pPrev->pNext!=p
e5a0: 42 74 3b 20 70 50 72 65 76 3d 70 50 72 65 76 2d  Bt; pPrev=pPrev-
e5b0: 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 20 20 69 66  >pNext){}.    if
e5c0: 28 20 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20  ( pPrev ){.     
e5d0: 20 61 73 73 65 72 74 28 20 70 54 73 64 3d 3d 73   assert( pTsd==s
e5e0: 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61  qlite3ThreadData
e5f0: 28 29 20 29 3b 0a 20 20 20 20 20 20 70 50 72 65  () );.      pPre
e600: 76 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  v->pNext = pBt->
e610: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNext;.    }.  }
e620: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6c  .#endif..  /* Cl
e630: 6f 73 65 20 74 68 65 20 70 61 67 65 72 20 61 6e  ose the pager an
e640: 64 20 66 72 65 65 20 74 68 65 20 73 68 61 72 65  d free the share
e650: 64 2d 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d-btree structur
e660: 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21  e */.  assert( !
e670: 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a  pBt->pCursor );.
e680: 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63    sqlite3pager_c
e690: 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72  lose(pBt->pPager
e6a0: 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 78 46  );.  if( pBt->xF
e6b0: 72 65 65 53 63 68 65 6d 61 20 26 26 20 70 42 74  reeSchema && pBt
e6c0: 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
e6d0: 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
e6e0: 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  a(pBt->pSchema);
e6f0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
e700: 65 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  e(pBt->pSchema);
e710: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 42  .  sqliteFree(pB
e720: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  t);.  return SQL
e730: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
e740: 20 43 68 61 6e 67 65 20 74 68 65 20 62 75 73 79   Change the busy
e750: 20 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63   handler callbac
e760: 6b 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  k function..*/.i
e770: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
e780: 65 74 42 75 73 79 48 61 6e 64 6c 65 72 28 42 74  etBusyHandler(Bt
e790: 72 65 65 20 2a 70 2c 20 42 75 73 79 48 61 6e 64  ree *p, BusyHand
e7a0: 6c 65 72 20 2a 70 48 61 6e 64 6c 65 72 29 7b 0a  ler *pHandler){.
e7b0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
e7c0: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 70 42 74 2d  = p->pBt;.  pBt-
e7d0: 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20  >pBusyHandler = 
e7e0: 70 48 61 6e 64 6c 65 72 3b 0a 20 20 73 71 6c 69  pHandler;.  sqli
e7f0: 74 65 33 70 61 67 65 72 5f 73 65 74 5f 62 75 73  te3pager_set_bus
e800: 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50  yhandler(pBt->pP
e810: 61 67 65 72 2c 20 70 48 61 6e 64 6c 65 72 29 3b  ager, pHandler);
e820: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
e830: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  _OK;.}../*.** Ch
e840: 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f  ange the limit o
e850: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
e860: 70 61 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e  pages allowed in
e870: 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a   the cache..**.*
e880: 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  * The maximum nu
e890: 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20 70 61  mber of cache pa
e8a0: 67 65 73 20 69 73 20 73 65 74 20 74 6f 20 74 68  ges is set to th
e8b0: 65 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61  e absolute.** va
e8c0: 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20  lue of mxPage.  
e8d0: 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67  If mxPage is neg
e8e0: 61 74 69 76 65 2c 20 74 68 65 20 70 61 67 65 72  ative, the pager
e8f0: 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65   will.** operate
e900: 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20   asynchronously 
e910: 2d 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74  - it will not st
e920: 6f 70 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29  op to do fsync()
e930: 73 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64  s.** to insure d
e940: 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74  ata is written t
e950: 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61  o the disk surfa
e960: 63 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e  ce before.** con
e970: 74 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61  tinuing.  Transa
e980: 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72  ctions still wor
e990: 6b 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73  k if synchronous
e9a0: 20 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20   is off,.** and 
e9b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e  the database can
e9c0: 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  not be corrupted
e9d0: 20 69 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d   if this program
e9e0: 0a 2a 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75  .** crashes.  Bu
e9f0: 74 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 69  t if the operati
ea00: 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73 68 65  ng system crashe
ea10: 73 20 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a  s or there is.**
ea20: 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72   an abrupt power
ea30: 20 66 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79   failure when sy
ea40: 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66  nchronous is off
ea50: 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  , the database.*
ea60: 2a 20 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20  * could be left 
ea70: 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65  in an inconsiste
ea80: 6e 74 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72  nt and unrecover
ea90: 61 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53  able state..** S
eaa0: 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e  ynchronous is on
eab0: 20 62 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64   by default so d
eac0: 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
ead0: 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72  on is not.** nor
eae0: 6d 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a  mally a worry..*
eaf0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
eb00: 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 42  eeSetCacheSize(B
eb10: 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50  tree *p, int mxP
eb20: 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64  age){.  BtShared
eb30: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
eb40: 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73    sqlite3pager_s
eb50: 65 74 5f 63 61 63 68 65 73 69 7a 65 28 70 42 74  et_cachesize(pBt
eb60: 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65  ->pPager, mxPage
eb70: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
eb80: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
eb90: 43 68 61 6e 67 65 20 74 68 65 20 77 61 79 20 64  Change the way d
eba0: 61 74 61 20 69 73 20 73 79 6e 63 65 64 20 74 6f  ata is synced to
ebb0: 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20 74   disk in order t
ebc0: 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64 65  o increase or de
ebd0: 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65  crease.** how we
ebe0: 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ll the database 
ebf0: 72 65 73 69 73 74 73 20 64 61 6d 61 67 65 20 64  resists damage d
ec00: 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73  ue to OS crashes
ec10: 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61   and power.** fa
ec20: 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20 31  ilures.  Level 1
ec30: 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
ec40: 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f  asynchronous (no
ec50: 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20 61   syncs() occur a
ec60: 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61  nd.** there is a
ec70: 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74   high probabilit
ec80: 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c 65  y of damage)  Le
ec90: 76 65 6c 20 32 20 69 73 20 74 68 65 20 64 65 66  vel 2 is the def
eca0: 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20  ault.  There.** 
ecb0: 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62 75  is a very low bu
ecc0: 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61  t non-zero proba
ecd0: 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
ece0: 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75 63  .  Level 3 reduc
ecf0: 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62  es the.** probab
ed00: 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 20  ility of damage 
ed10: 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75 74  to near zero but
ed20: 20 77 69 74 68 20 61 20 77 72 69 74 65 20 70 65   with a write pe
ed30: 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74  rformance reduct
ed40: 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ion..*/.#ifndef 
ed50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
ed60: 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73 71  R_PRAGMAS.int sq
ed70: 6c 69 74 65 33 42 74 72 65 65 53 65 74 53 61 66  lite3BtreeSetSaf
ed80: 65 74 79 4c 65 76 65 6c 28 42 74 72 65 65 20 2a  etyLevel(Btree *
ed90: 70 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e  p, int level, in
eda0: 74 20 66 75 6c 6c 53 79 6e 63 29 7b 0a 20 20 42  t fullSync){.  B
edb0: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
edc0: 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
edd0: 70 61 67 65 72 5f 73 65 74 5f 73 61 66 65 74 79  pager_set_safety
ede0: 5f 6c 65 76 65 6c 28 70 42 74 2d 3e 70 50 61 67  _level(pBt->pPag
edf0: 65 72 2c 20 6c 65 76 65 6c 2c 20 66 75 6c 6c 53  er, level, fullS
ee00: 79 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ync);.  return S
ee10: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
ee20: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
ee30: 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
ee40: 65 6e 20 62 74 72 65 65 20 69 73 20 73 65 74 20  en btree is set 
ee50: 74 6f 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20  to safety level 
ee60: 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20  1.  In other.** 
ee70: 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52  words, return TR
ee80: 55 45 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20  UE if no sync() 
ee90: 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69  occurs on the di
eea0: 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74  sk files..*/.int
eeb0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e   sqlite3BtreeSyn
eec0: 63 44 69 73 61 62 6c 65 64 28 42 74 72 65 65 20  cDisabled(Btree 
eed0: 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
eee0: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
eef0: 20 61 73 73 65 72 74 28 20 70 42 74 20 26 26 20   assert( pBt && 
ef00: 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a 20  pBt->pPager );. 
ef10: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 70   return sqlite3p
ef20: 61 67 65 72 5f 6e 6f 73 79 6e 63 28 70 42 74 2d  ager_nosync(pBt-
ef30: 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 23 69 66  >pPager);.}..#if
ef40: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
ef50: 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
ef60: 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  MAS) || !defined
ef70: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43  (SQLITE_OMIT_VAC
ef80: 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  UUM)./*.** Chang
ef90: 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61  e the default pa
efa0: 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68 65  ges size and the
efb0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
efc0: 76 65 64 20 62 79 74 65 73 20 70 65 72 20 70 61  ved bytes per pa
efd0: 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ge..**.** The pa
efe0: 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20  ge size must be 
eff0: 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74  a power of 2 bet
f000: 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35  ween 512 and 655
f010: 33 36 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  36.  If the page
f020: 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65  .** size supplie
f030: 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20  d does not meet 
f040: 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  this constraint 
f050: 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 73 69  then the page si
f060: 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61  ze is not.** cha
f070: 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  nged..**.** Page
f080: 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74   sizes are const
f090: 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70  rained to be a p
f0a0: 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74  ower of two so t
f0b0: 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a  hat the region.*
f0c0: 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
f0d0: 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20  e file used for 
f0e0: 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69  locking (beginni
f0f0: 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59  ng at PENDING_BY
f100: 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  TE,.** the first
f110: 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 31   byte past the 1
f120: 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34  GB boundary, 0x4
f130: 30 30 30 30 30 30 30 29 20 6e 65 65 64 73 20 74  0000000) needs t
f140: 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68  o occur.** at th
f150: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
f160: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
f170: 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72  parameter nReser
f180: 76 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ve is less than 
f190: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e  zero, then the n
f1a0: 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
f1b0: 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70  d.** bytes per p
f1c0: 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68  age is left unch
f1d0: 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  anged..*/.int sq
f1e0: 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67  lite3BtreeSetPag
f1f0: 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20  eSize(Btree *p, 
f200: 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e  int pageSize, in
f210: 74 20 6e 52 65 73 65 72 76 65 29 7b 0a 20 20 42  t nReserve){.  B
f220: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
f230: 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 70 42 74  ->pBt;.  if( pBt
f240: 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20  ->pageSizeFixed 
f250: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
f260: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
f270: 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76   }.  if( nReserv
f280: 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 65  e<0 ){.    nRese
f290: 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  rve = pBt->pageS
f2a0: 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c  ize - pBt->usabl
f2b0: 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28  eSize;.  }.  if(
f2c0: 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26   pageSize>=512 &
f2d0: 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49  & pageSize<=SQLI
f2e0: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
f2f0: 20 26 26 0a 20 20 20 20 20 20 20 20 28 28 70 61   &&.        ((pa
f300: 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69  geSize-1)&pageSi
f310: 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  ze)==0 ){.    as
f320: 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20  sert( (pageSize 
f330: 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61  & 7)==0 );.    a
f340: 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 50 61  ssert( !pBt->pPa
f350: 67 65 31 20 26 26 20 21 70 42 74 2d 3e 70 43 75  ge1 && !pBt->pCu
f360: 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74 2d  rsor );.    pBt-
f370: 3e 70 61 67 65 53 69 7a 65 20 3d 20 73 71 6c 69  >pageSize = sqli
f380: 74 65 33 70 61 67 65 72 5f 73 65 74 5f 70 61 67  te3pager_set_pag
f390: 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
f3a0: 72 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r, pageSize);.  
f3b0: 7d 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  }.  pBt->usableS
f3c0: 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  ize = pBt->pageS
f3d0: 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a  ize - nReserve;.
f3e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f3f0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
f400: 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c  urn the currentl
f410: 79 20 64 65 66 69 6e 65 64 20 70 61 67 65 20 73  y defined page s
f420: 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ize.*/.int sqlit
f430: 65 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69  e3BtreeGetPageSi
f440: 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ze(Btree *p){.  
f450: 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70  return p->pBt->p
f460: 61 67 65 53 69 7a 65 3b 0a 7d 0a 69 6e 74 20 73  ageSize;.}.int s
f470: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65  qlite3BtreeGetRe
f480: 73 65 72 76 65 28 42 74 72 65 65 20 2a 70 29 7b  serve(Btree *p){
f490: 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74  .  return p->pBt
f4a0: 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e  ->pageSize - p->
f4b0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
f4c0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
f4d0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
f4e0: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29  T_PAGER_PRAGMAS)
f4f0: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
f500: 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29  ITE_OMIT_VACUUM)
f510: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67   */../*.** Chang
f520: 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75  e the 'auto-vacu
f530: 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20  um' property of 
f540: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
f550: 20 74 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d   the 'autoVacuum
f560: 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  '.** parameter i
f570: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
f580: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64   auto-vacuum mod
f590: 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66  e is enabled. If
f5a0: 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20   zero, it.** is 
f5b0: 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65  disabled. The de
f5c0: 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20  fault value for 
f5d0: 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  the auto-vacuum 
f5e0: 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20  property is .** 
f5f0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
f600: 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  e SQLITE_DEFAULT
f610: 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72  _AUTOVACUUM macr
f620: 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  o..*/.int sqlite
f630: 33 42 74 72 65 65 53 65 74 41 75 74 6f 56 61 63  3BtreeSetAutoVac
f640: 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  uum(Btree *p, in
f650: 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 20  t autoVacuum){. 
f660: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
f670: 20 70 2d 3e 70 42 74 3b 3b 0a 23 69 66 64 65 66   p->pBt;;.#ifdef
f680: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
f690: 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e  OVACUUM.  return
f6a0: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
f6b0: 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 70 42  ;.#else.  if( pB
f6c0: 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
f6d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
f6e0: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
f6f0: 20 20 7d 0a 20 20 70 42 74 2d 3e 61 75 74 6f 56    }.  pBt->autoV
f700: 61 63 75 75 6d 20 3d 20 28 61 75 74 6f 56 61 63  acuum = (autoVac
f710: 75 75 6d 3f 31 3a 30 29 3b 0a 20 20 72 65 74 75  uum?1:0);.  retu
f720: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65  rn SQLITE_OK;.#e
f730: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ndif.}../*.** Re
f740: 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
f750: 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75  f the 'auto-vacu
f760: 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49 66  um' property. If
f770: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20   auto-vacuum is 
f780: 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69 73  .** enabled 1 is
f790: 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
f7a0: 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73  wise 0..*/.int s
f7b0: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 41 75  qlite3BtreeGetAu
f7c0: 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a  toVacuum(Btree *
f7d0: 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  p){.#ifdef SQLIT
f7e0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
f7f0: 4d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  M.  return 0;.#e
f800: 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  lse.  return p->
f810: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3b  pBt->autoVacuum;
f820: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a  .#endif.}.../*.*
f830: 2a 20 47 65 74 20 61 20 72 65 66 65 72 65 6e 63  * Get a referenc
f840: 65 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74  e to pPage1 of t
f850: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
f860: 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20  .  This will.** 
f870: 61 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20 72  also acquire a r
f880: 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20  eadlock on that 
f890: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  file..**.** SQLI
f8a0: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
f8b0: 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49  d on success.  I
f8c0: 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f  f the file is no
f8d0: 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d  t a.** well-form
f8e0: 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
f8f0: 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f  , then SQLITE_CO
f900: 52 52 55 50 54 20 69 73 20 72 65 74 75 72 6e 65  RRUPT is returne
f910: 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53  d..** SQLITE_BUS
f920: 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  Y is returned if
f930: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
f940: 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45   locked.  SQLITE
f950: 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74  _NOMEM.** is ret
f960: 75 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20  urned if we run 
f970: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 20  out of memory.  
f980: 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 20  SQLITE_PROTOCOL 
f990: 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69  is returned.** i
f9a0: 66 20 74 68 65 72 65 20 69 73 20 61 20 6c 6f 63  f there is a loc
f9b0: 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 76 69  king protocol vi
f9c0: 6f 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  olation..*/.stat
f9d0: 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65  ic int lockBtree
f9e0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
f9f0: 0a 20 20 69 6e 74 20 72 63 2c 20 70 61 67 65 53  .  int rc, pageS
fa00: 69 7a 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ize;.  MemPage *
fa10: 70 50 61 67 65 31 3b 0a 20 20 69 66 28 20 70 42  pPage1;.  if( pB
fa20: 74 2d 3e 70 50 61 67 65 31 20 29 20 72 65 74 75  t->pPage1 ) retu
fa30: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
fa40: 72 63 20 3d 20 67 65 74 50 61 67 65 28 70 42 74  rc = getPage(pBt
fa50: 2c 20 31 2c 20 26 70 50 61 67 65 31 29 3b 0a 20  , 1, &pPage1);. 
fa60: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
fa70: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
fa80: 20 20 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65    ..  /* Do some
fa90: 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c   checking to hel
faa0: 70 20 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c  p insure the fil
fab0: 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c  e we opened real
fac0: 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c  ly is.  ** a val
fad0: 69 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  id database file
fae0: 2e 20 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 53  . .  */.  rc = S
faf0: 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20  QLITE_NOTADB;.  
fb00: 69 66 28 20 73 71 6c 69 74 65 33 70 61 67 65 72  if( sqlite3pager
fb10: 5f 70 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  _pagecount(pBt->
fb20: 70 50 61 67 65 72 29 3e 30 20 29 7b 0a 20 20 20  pPager)>0 ){.   
fb30: 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61   u8 *page1 = pPa
fb40: 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  ge1->aData;.    
fb50: 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31  if( memcmp(page1
fb60: 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20  , zMagicHeader, 
fb70: 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  16)!=0 ){.      
fb80: 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
fb90: 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
fba0: 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e    if( page1[18]>
fbb0: 31 20 7c 7c 20 70 61 67 65 31 5b 31 39 5d 3e 31  1 || page1[19]>1
fbc0: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
fbd0: 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
fbe0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  ;.    }.    page
fbf0: 53 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  Size = get2byte(
fc00: 26 70 61 67 65 31 5b 31 36 5d 29 3b 0a 20 20 20  &page1[16]);.   
fc10: 20 69 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d   if( ((pageSize-
fc20: 31 29 26 70 61 67 65 53 69 7a 65 29 21 3d 30 20  1)&pageSize)!=0 
fc30: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
fc40: 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
fc50: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
fc60: 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37  t( (pageSize & 7
fc70: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d  )==0 );.    pBt-
fc80: 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
fc90: 53 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75  Size;.    pBt->u
fca0: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65  sableSize = page
fcb0: 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d  Size - page1[20]
fcc0: 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 75  ;.    if( pBt->u
fcd0: 73 61 62 6c 65 53 69 7a 65 3c 35 30 30 20 29 7b  sableSize<500 ){
fce0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
fcf0: 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
fd00: 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 6d 61     }.    pBt->ma
fd10: 78 45 6d 62 65 64 46 72 61 63 20 3d 20 70 61 67  xEmbedFrac = pag
fd20: 65 31 5b 32 31 5d 3b 0a 20 20 20 20 70 42 74 2d  e1[21];.    pBt-
fd30: 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63 20 3d 20  >minEmbedFrac = 
fd40: 70 61 67 65 31 5b 32 32 5d 3b 0a 20 20 20 20 70  page1[22];.    p
fd50: 42 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63 20  Bt->minLeafFrac 
fd60: 3d 20 70 61 67 65 31 5b 32 33 5d 3b 0a 23 69 66  = page1[23];.#if
fd70: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
fd80: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
fd90: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
fda0: 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67  = (get4byte(&pag
fdb0: 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a  e1[36 + 4*4])?1:
fdc0: 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a  0);.#endif.  }..
fdd0: 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73    /* maxLocal is
fde0: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f   the maximum amo
fdf0: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 74  unt of payload t
fe00: 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20  o store locally 
fe10: 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e  for.  ** a cell.
fe20: 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69    Make sure it i
fe30: 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73  s small enough s
fe40: 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 20  o that at least 
fe50: 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63  minFanout.  ** c
fe60: 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66 69  ells can will fi
fe70: 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20  t on one page.  
fe80: 57 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d 62  We assume a 10-b
fe90: 79 74 65 20 70 61 67 65 20 68 65 61 64 65 72 2e  yte page header.
fea0: 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74 68  .  ** Besides th
feb0: 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20 63  e payload, the c
fec0: 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a  ell must store:.
fed0: 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65 20    **     2-byte 
fee0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  pointer to the c
fef0: 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62  ell.  **     4-b
ff00: 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65  yte child pointe
ff10: 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79 74  r.  **     9-byt
ff20: 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a  e nKey value.  *
ff30: 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44 61  *     4-byte nDa
ff40: 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20  ta value.  **   
ff50: 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f    4-byte overflo
ff60: 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a 20  w page pointer. 
ff70: 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f   ** So a cell co
ff80: 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62 79  nsists of a 2-by
ff90: 74 65 20 70 6f 69 6e 65 72 2c 20 61 20 68 65 61  te poiner, a hea
ffa0: 64 65 72 20 77 68 69 63 68 20 69 73 20 61 73 20  der which is as 
ffb0: 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20  much as.  ** 17 
ffc0: 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f  bytes long, 0 to
ffd0: 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c   N bytes of payl
ffe0: 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69  oad, and an opti
fff0: 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72  onal 4 byte over
10000 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70  flow.  ** page p
10010 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70  ointer..  */.  p
10020 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28  Bt->maxLocal = (
10030 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
10040 31 32 29 2a 70 42 74 2d 3e 6d 61 78 45 6d 62 65  12)*pBt->maxEmbe
10050 64 46 72 61 63 2f 32 35 35 20 2d 20 32 33 3b 0a  dFrac/255 - 23;.
10060 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20    pBt->minLocal 
10070 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  = (pBt->usableSi
10080 7a 65 2d 31 32 29 2a 70 42 74 2d 3e 6d 69 6e 45  ze-12)*pBt->minE
10090 6d 62 65 64 46 72 61 63 2f 32 35 35 20 2d 20 32  mbedFrac/255 - 2
100a0 33 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61  3;.  pBt->maxLea
100b0 66 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  f = pBt->usableS
100c0 69 7a 65 20 2d 20 33 35 3b 0a 20 20 70 42 74 2d  ize - 35;.  pBt-
100d0 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 70 42 74 2d  >minLeaf = (pBt-
100e0 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
100f0 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63  pBt->minLeafFrac
10100 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 69 66 28  /255 - 23;.  if(
10110 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3e 70   pBt->minLocal>p
10120 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 7c 7c 20  Bt->maxLocal || 
10130 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3c 30 20  pBt->maxLocal<0 
10140 29 7b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65  ){.    goto page
10150 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
10160 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74   }.  assert( pBt
10170 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c  ->maxLeaf + 23 <
10180 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  = MX_CELL_SIZE(p
10190 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50  Bt) );.  pBt->pP
101a0 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20  age1 = pPage1;. 
101b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
101c0 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66  K;..page1_init_f
101d0 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65  ailed:.  release
101e0 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
101f0 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
10200 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
10210 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
10220 69 6e 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20 6c  ine works like l
10230 6f 63 6b 42 74 72 65 65 28 29 20 65 78 63 65 70  ockBtree() excep
10240 74 20 74 68 61 74 20 69 74 20 61 6c 73 6f 20 69  t that it also i
10250 6e 76 6f 6b 65 73 20 74 68 65 0a 2a 2a 20 62 75  nvokes the.** bu
10260 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74  sy callback if t
10270 68 65 72 65 20 69 73 20 6c 6f 63 6b 20 63 6f 6e  here is lock con
10280 74 65 6e 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  tention..*/.stat
10290 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65  ic int lockBtree
102a0 57 69 74 68 52 65 74 72 79 28 42 74 72 65 65 20  WithRetry(Btree 
102b0 2a 70 52 65 66 29 7b 0a 20 20 69 6e 74 20 72 63  *pRef){.  int rc
102c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
102d0 69 66 28 20 70 52 65 66 2d 3e 69 6e 54 72 61 6e  if( pRef->inTran
102e0 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s==TRANS_NONE ){
102f0 0a 20 20 20 20 75 38 20 69 6e 54 72 61 6e 73 61  .    u8 inTransa
10300 63 74 69 6f 6e 20 3d 20 70 52 65 66 2d 3e 70 42  ction = pRef->pB
10310 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
10320 3b 0a 20 20 20 20 62 74 72 65 65 49 6e 74 65 67  ;.    btreeInteg
10330 72 69 74 79 28 70 52 65 66 29 3b 0a 20 20 20 20  rity(pRef);.    
10340 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
10350 65 42 65 67 69 6e 54 72 61 6e 73 28 70 52 65 66  eBeginTrans(pRef
10360 2c 20 30 29 3b 0a 20 20 20 20 70 52 65 66 2d 3e  , 0);.    pRef->
10370 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
10380 6f 6e 20 3d 20 69 6e 54 72 61 6e 73 61 63 74 69  on = inTransacti
10390 6f 6e 3b 0a 20 20 20 20 70 52 65 66 2d 3e 69 6e  on;.    pRef->in
103a0 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f  Trans = TRANS_NO
103b0 4e 45 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  NE;.    if( rc==
103c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
103d0 20 20 20 70 52 65 66 2d 3e 70 42 74 2d 3e 6e 54     pRef->pBt->nT
103e0 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20  ransaction--;.  
103f0 20 20 7d 0a 20 20 20 20 62 74 72 65 65 49 6e 74    }.    btreeInt
10400 65 67 72 69 74 79 28 70 52 65 66 29 3b 0a 20 20  egrity(pRef);.  
10410 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
10420 0a 20 20 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20  .       ../*.** 
10430 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
10440 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73  outstanding curs
10450 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e  ors and we are n
10460 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  ot in the middle
10470 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63  .** of a transac
10480 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69  tion but there i
10490 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  s a read lock on
104a0 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 74   the database, t
104b0 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  hen.** this rout
104c0 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20 66  ine unrefs the f
104d0 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
104e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
104f0 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65  hich .** has the
10500 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61   effect of relea
10510 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f  sing the read lo
10520 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
10530 72 65 20 61 72 65 20 61 6e 79 20 6f 75 74 73 74  re are any outst
10540 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 2c 20  anding cursors, 
10550 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
10560 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
10570 66 20 74 68 65 72 65 20 69 73 20 61 20 74 72 61  f there is a tra
10580 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67  nsaction in prog
10590 72 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69  ress, this routi
105a0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
105b0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
105c0 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
105d0 64 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  d(BtShared *pBt)
105e0 7b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54  {.  if( pBt->inT
105f0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
10600 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70  S_NONE && pBt->p
10610 43 75 72 73 6f 72 3d 3d 30 20 26 26 20 70 42 74  Cursor==0 && pBt
10620 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20  ->pPage1!=0 ){. 
10630 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 70 61     if( sqlite3pa
10640 67 65 72 5f 72 65 66 63 6f 75 6e 74 28 70 42 74  ger_refcount(pBt
10650 2d 3e 70 50 61 67 65 72 29 3e 3d 31 20 29 7b 0a  ->pPager)>=1 ){.
10660 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70        if( pBt->p
10670 50 61 67 65 31 2d 3e 61 44 61 74 61 3d 3d 30 20  Page1->aData==0 
10680 29 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61  ){.        MemPa
10690 67 65 20 2a 70 50 61 67 65 20 3d 20 70 42 74 2d  ge *pPage = pBt-
106a0 3e 70 50 61 67 65 31 3b 0a 20 20 20 20 20 20 20  >pPage1;.       
106b0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20   pPage->aData = 
106c0 26 28 28 75 38 2a 29 70 50 61 67 65 29 5b 2d 70  &((u8*)pPage)[-p
106d0 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20  Bt->pageSize];. 
106e0 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70 42         pPage->pB
106f0 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20  t = pBt;.       
10700 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 31   pPage->pgno = 1
10710 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10720 72 65 6c 65 61 73 65 50 61 67 65 28 70 42 74 2d  releasePage(pBt-
10730 3e 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a  >pPage1);.    }.
10740 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20      pBt->pPage1 
10750 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  = 0;.    pBt->in
10760 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  Stmt = 0;.  }.}.
10770 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
10780 6e 65 77 20 64 61 74 61 62 61 73 65 20 62 79 20  new database by 
10790 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
107a0 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
107b0 68 65 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2f 0a 73  he.** file..*/.s
107c0 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74  tatic int newDat
107d0 61 62 61 73 65 28 42 74 53 68 61 72 65 64 20 2a  abase(BtShared *
107e0 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  pBt){.  MemPage 
107f0 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64  *pP1;.  unsigned
10800 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 69   char *data;.  i
10810 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 73 71 6c  nt rc;.  if( sql
10820 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f  ite3pager_pageco
10830 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
10840 3e 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  >0 ) return SQLI
10850 54 45 5f 4f 4b 3b 0a 20 20 70 50 31 20 3d 20 70  TE_OK;.  pP1 = p
10860 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73  Bt->pPage1;.  as
10870 73 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a  sert( pP1!=0 );.
10880 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44    data = pP1->aD
10890 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ata;.  rc = sqli
108a0 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 64  te3pager_write(d
108b0 61 74 61 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ata);.  if( rc )
108c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65   return rc;.  me
108d0 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69  mcpy(data, zMagi
108e0 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28  cHeader, sizeof(
108f0 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a  zMagicHeader));.
10900 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
10910 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d  (zMagicHeader)==
10920 31 36 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65  16 );.  put2byte
10930 28 26 64 61 74 61 5b 31 36 5d 2c 20 70 42 74 2d  (&data[16], pBt-
10940 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61  >pageSize);.  da
10950 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61  ta[18] = 1;.  da
10960 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 64 61  ta[19] = 1;.  da
10970 74 61 5b 32 30 5d 20 3d 20 70 42 74 2d 3e 70 61  ta[20] = pBt->pa
10980 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73  geSize - pBt->us
10990 61 62 6c 65 53 69 7a 65 3b 0a 20 20 64 61 74 61  ableSize;.  data
109a0 5b 32 31 5d 20 3d 20 70 42 74 2d 3e 6d 61 78 45  [21] = pBt->maxE
109b0 6d 62 65 64 46 72 61 63 3b 0a 20 20 64 61 74 61  mbedFrac;.  data
109c0 5b 32 32 5d 20 3d 20 70 42 74 2d 3e 6d 69 6e 45  [22] = pBt->minE
109d0 6d 62 65 64 46 72 61 63 3b 0a 20 20 64 61 74 61  mbedFrac;.  data
109e0 5b 32 33 5d 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c  [23] = pBt->minL
109f0 65 61 66 46 72 61 63 3b 0a 20 20 6d 65 6d 73 65  eafFrac;.  memse
10a00 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20  t(&data[24], 0, 
10a10 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50  100-24);.  zeroP
10a20 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54  age(pP1, PTF_INT
10a30 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46  KEY|PTF_LEAF|PTF
10a40 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70  _LEAFDATA );.  p
10a50 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
10a60 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53  d = 1;.#ifndef S
10a70 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
10a80 41 43 55 55 4d 0a 20 20 69 66 28 20 70 42 74 2d  ACUUM.  if( pBt-
10a90 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
10aa0 20 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74     put4byte(&dat
10ab0 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 31 29 3b  a[36 + 4*4], 1);
10ac0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
10ad0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10ae0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
10af0 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20   to start a new 
10b00 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77  transaction. A w
10b10 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
10b20 0a 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20 69  .** is started i
10b30 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
10b40 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f  ument is nonzero
10b50 2c 20 6f 74 68 65 72 77 69 73 65 20 61 20 72 65  , otherwise a re
10b60 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ad-.** transacti
10b70 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f  on.  If the seco
10b80 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32  nd argument is 2
10b90 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63   or more and exc
10ba0 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61  lusive.** transa
10bb0 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64  ction is started
10bc0 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e  , meaning that n
10bd0 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  o other process 
10be0 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f  is allowed.** to
10bf0 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
10c00 62 61 73 65 2e 20 20 41 20 70 72 65 65 78 69 73  base.  A preexis
10c10 74 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e  ting transaction
10c20 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75   may not be.** u
10c30 70 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75  pgraded to exclu
10c40 73 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20  sive by calling 
10c50 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73  this routine a s
10c60 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65  econd time - the
10c70 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20  .** exclusivity 
10c80 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  flag only works 
10c90 66 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61  for a new transa
10ca0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77  ction..**.** A w
10cb0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
10cc0 20 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64   must be started
10cd0 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69   before attempti
10ce0 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67  ng any .** chang
10cf0 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
10d00 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65  se.  None of the
10d10 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
10d20 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72  nes .** will wor
10d30 6b 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73  k unless a trans
10d40 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65  action is starte
10d50 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20  d first:.**.**  
10d60 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
10d70 43 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a  CreateTable().**
10d80 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
10d90 65 65 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a  eeCreateIndex().
10da0 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
10db0 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29  treeClearTable()
10dc0 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
10dd0 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29  BtreeDropTable()
10de0 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
10df0 42 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a  BtreeInsert().**
10e00 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
10e10 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20  eeDelete().**   
10e20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 55     sqlite3BtreeU
10e30 70 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a  pdateMeta().**.*
10e40 2a 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20  * If an initial 
10e50 61 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69  attempt to acqui
10e60 72 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c  re the lock fail
10e70 73 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63  s because of loc
10e80 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20  k contention.** 
10e90 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
10ea0 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
10eb0 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69  unlocked, then i
10ec0 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
10ed0 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65  andler.** if the
10ee0 72 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20  re is one.  But 
10ef0 69 66 20 74 68 65 72 65 20 77 61 73 20 70 72 65  if there was pre
10f00 76 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c  viously a read-l
10f10 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69  ock, do not.** i
10f20 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
10f30 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65  andler - just re
10f40 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
10f50 2e 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  .  SQLITE_BUSY i
10f60 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77  s .** returned w
10f70 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72  hen there is alr
10f80 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b  eady a read-lock
10f90 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f   in order to avo
10fa0 69 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a  id a deadlock..*
10fb0 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65  *.** Suppose the
10fc0 72 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65  re are two proce
10fd0 73 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41  sses A and B.  A
10fe0 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b   has a read lock
10ff0 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20   and B has.** a 
11000 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20  reserved lock.  
11010 42 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f  B tries to promo
11020 74 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  te to exclusive 
11030 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62  but is blocked b
11040 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73  ecause.** of A's
11050 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74   read lock.  A t
11060 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20  ries to promote 
11070 74 6f 20 72 65 73 65 72 76 65 64 20 62 75 74 20  to reserved but 
11080 69 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e  is blocked by B.
11090 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f  .** One or the o
110a0 74 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20  ther of the two 
110b0 70 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67  processes must g
110c0 69 76 65 20 77 61 79 20 6f 72 20 74 68 65 72 65  ive way or there
110d0 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72   can be.** no pr
110e0 6f 67 72 65 73 73 2e 20 20 42 79 20 72 65 74 75  ogress.  By retu
110f0 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53  rning SQLITE_BUS
11100 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69  Y and not invoki
11110 6e 67 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ng the busy call
11120 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61  back.** when A a
11130 6c 72 65 61 64 79 20 68 61 73 20 61 20 72 65 61  lready has a rea
11140 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75  d lock, we encou
11150 72 61 67 65 20 41 20 74 6f 20 67 69 76 65 20 75  rage A to give u
11160 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70  p and let B.** p
11170 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  roceed..*/.int s
11180 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
11190 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20  Trans(Btree *p, 
111a0 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 42  int wrflag){.  B
111b0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
111c0 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
111d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
111e0 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
111f0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
11200 62 74 72 65 65 20 69 73 20 61 6c 72 65 61 64 79  btree is already
11210 20 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e   in a write-tran
11220 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20  saction, or it. 
11230 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69   ** is already i
11240 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  n a read-transac
11250 74 69 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d  tion and a read-
11260 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a  transaction.  **
11270 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74   is requested, t
11280 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  his is a no-op..
11290 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e    */.  if( p->in
112a0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
112b0 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e  TE || (p->inTran
112c0 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26  s==TRANS_READ &&
112d0 20 21 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20   !wrflag) ){.   
112e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
112f0 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69  K;.  }..  /* Wri
11300 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  te transactions 
11310 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  are not possible
11320 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   on a read-only 
11330 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66  database */.  if
11340 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  ( pBt->readOnly 
11350 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  && wrflag ){.   
11360 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
11370 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20  EADONLY;.  }..  
11380 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61  /* If another da
11390 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61  tabase handle ha
113a0 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64  s already opened
113b0 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   a write transac
113c0 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68  tion .  ** on th
113d0 69 73 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  is shared-btree 
113e0 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20  structure and a 
113f0 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61  second write tra
11400 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a  nsaction is.  **
11410 20 72 65 71 75 65 73 74 65 64 2c 20 72 65 74 75   requested, retu
11420 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a  rn SQLITE_BUSY..
11430 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e    */.  if( pBt->
11440 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
11450 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20 77 72  RANS_WRITE && wr
11460 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 65 74 75  flag ){.    retu
11470 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
11480 20 20 7d 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20    }..  do {.    
11490 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d  if( pBt->pPage1=
114a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
114b0 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29 3b   lockBtree(pBt);
114c0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66  .    }.  .    if
114d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
114e0 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  && wrflag ){.   
114f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70     rc = sqlite3p
11500 61 67 65 72 5f 62 65 67 69 6e 28 70 42 74 2d 3e  ager_begin(pBt->
11510 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 77  pPage1->aData, w
11520 72 66 6c 61 67 3e 31 29 3b 0a 20 20 20 20 20 20  rflag>1);.      
11530 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
11540 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
11550 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42  = newDatabase(pB
11560 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
11570 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63 3d  }.  .    if( rc=
11580 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11590 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 20 29      if( wrflag )
115a0 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30   pBt->inStmt = 0
115b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
115c0 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
115d0 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20  Unused(pBt);.   
115e0 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d   }.  }while( rc=
115f0 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
11600 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
11610 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  on==TRANS_NONE &
11620 26 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  &.          sqli
11630 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  te3InvokeBusyHan
11640 64 6c 65 72 28 70 42 74 2d 3e 70 42 75 73 79 48  dler(pBt->pBusyH
11650 61 6e 64 6c 65 72 29 20 29 3b 0a 0a 20 20 69 66  andler) );..  if
11660 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
11670 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  ){.    if( p->in
11680 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans==TRANS_NON
11690 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  E ){.      pBt->
116a0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a  nTransaction++;.
116b0 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54      }.    p->inT
116c0 72 61 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54  rans = (wrflag?T
116d0 52 41 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53  RANS_WRITE:TRANS
116e0 5f 52 45 41 44 29 3b 0a 20 20 20 20 69 66 28 20  _READ);.    if( 
116f0 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e  p->inTrans>pBt->
11700 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b  inTransaction ){
11710 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  .      pBt->inTr
11720 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69  ansaction = p->i
11730 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20  nTrans;.    }.  
11740 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  }..  btreeIntegr
11750 69 74 79 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ity(p);.  return
11760 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
11770 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
11780 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65  VACUUM../*.** Se
11790 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  t the pointer-ma
117a0 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c  p entries for al
117b0 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61  l children of pa
117c0 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20  ge pPage. Also, 
117d0 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74  if.** pPage cont
117e0 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20  ains cells that 
117f0 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f  point to overflo
11800 77 20 70 61 67 65 73 2c 20 73 65 74 20 74 68 65  w pages, set the
11810 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20   pointer.** map 
11820 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20  entries for the 
11830 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
11840 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  s well..*/.stati
11850 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74  c int setChildPt
11860 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70  rmaps(MemPage *p
11870 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Page){.  int i; 
11880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11890 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
118a0 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20  ounter variable 
118b0 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20  */.  int nCell; 
118c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118d0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
118e0 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61  r of cells in pa
118f0 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e  ge pPage */.  in
11900 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
11910 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11920 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
11930 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
11940 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
11950 0a 20 20 69 6e 74 20 69 73 49 6e 69 74 4f 72 69  .  int isInitOri
11960 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  g = pPage->isIni
11970 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  t;.  Pgno pgno =
11980 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20   pPage->pgno;.. 
11990 20 69 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c   initPage(pPage,
119a0 20 30 29 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70   0);.  nCell = p
119b0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20  Page->nCell;..  
119c0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
119d0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
119e0 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
119f0 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20  (pPage, i);..   
11a00 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f   rc = ptrmapPutO
11a10 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  vflPtr(pPage, pC
11a20 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ell);.    if( rc
11a30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11a40 20 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68       goto set_ch
11a50 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b  ild_ptrmaps_out;
11a60 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
11a70 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
11a80 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64        Pgno child
11a90 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
11aa0 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 72 63  pCell);.      rc
11ab0 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
11ac0 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52  , childPgno, PTR
11ad0 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29  MAP_BTREE, pgno)
11ae0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
11af0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
11b00 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61   set_child_ptrma
11b10 70 73 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ps_out;.    }.  
11b20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  }..  if( !pPage-
11b30 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e  >leaf ){.    Pgn
11b40 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65  o childPgno = ge
11b50 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
11b60 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
11b70 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 72  ffset+8]);.    r
11b80 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
11b90 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54  t, childPgno, PT
11ba0 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f  RMAP_BTREE, pgno
11bb0 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c  );.  }..set_chil
11bc0 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20  d_ptrmaps_out:. 
11bd0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
11be0 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72   isInitOrig;.  r
11bf0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
11c00 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20  ** Somewhere on 
11c10 70 50 61 67 65 2c 20 77 68 69 63 68 20 69 73 20  pPage, which is 
11c20 67 75 61 72 65 6e 74 65 65 64 20 74 6f 20 62 65  guarenteed to be
11c30 20 61 20 62 74 72 65 65 20 70 61 67 65 2c 20 6e   a btree page, n
11c40 6f 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a  ot an overflow.*
11c50 2a 20 70 61 67 65 2c 20 69 73 20 61 20 70 6f 69  * page, is a poi
11c60 6e 74 65 72 20 74 6f 20 70 61 67 65 20 69 46 72  nter to page iFr
11c70 6f 6d 2e 20 4d 6f 64 69 66 79 20 74 68 69 73 20  om. Modify this 
11c80 70 6f 69 6e 74 65 72 20 73 6f 20 74 68 61 74 20  pointer so that 
11c90 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20  it points to.** 
11ca0 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20 65  iTo. Parameter e
11cb0 54 79 70 65 20 64 65 73 63 72 69 62 65 73 20 74  Type describes t
11cc0 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e 74  he type of point
11cd0 65 72 20 74 6f 20 62 65 20 6d 6f 64 69 66 69 65  er to be modifie
11ce0 64 2c 20 61 73 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  d, as .** follow
11cf0 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  s:.**.** PTRMAP_
11d00 42 54 52 45 45 3a 20 20 20 20 20 70 50 61 67 65  BTREE:     pPage
11d10 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65   is a btree-page
11d20 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f  . The pointer po
11d30 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64 20  ints at a child 
11d40 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
11d50 20 20 20 20 20 20 70 61 67 65 20 6f 66 20 70 50        page of pP
11d60 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  age..**.** PTRMA
11d70 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50 61  P_OVERFLOW1: pPa
11d80 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61  ge is a btree-pa
11d90 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
11da0 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76 65  points at an ove
11db0 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20  rflow.**        
11dc0 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20             page 
11dd0 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e  pointed to by on
11de0 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f  e of the cells o
11df0 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  n pPage..**.** P
11e00 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a  TRMAP_OVERFLOW2:
11e10 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65   pPage is an ove
11e20 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65 20  rflow-page. The 
11e30 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
11e40 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20  t the next.**   
11e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e60 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
11e70 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74   the list..*/.st
11e80 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79 50  atic int modifyP
11e90 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61  agePointer(MemPa
11ea0 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20  ge *pPage, Pgno 
11eb0 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c  iFrom, Pgno iTo,
11ec0 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20 69 66   u8 eType){.  if
11ed0 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
11ee0 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20  OVERFLOW2 ){.   
11ef0 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
11f00 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 66 69  is always the fi
11f10 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74  rst 4 bytes of t
11f20 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  he page in this 
11f30 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  case.  */.    if
11f40 28 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65  ( get4byte(pPage
11f50 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20  ->aData)!=iFrom 
11f60 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
11f70 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
11f80 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  KPT;.    }.    p
11f90 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  ut4byte(pPage->a
11fa0 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65  Data, iTo);.  }e
11fb0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 73 49  lse{.    int isI
11fc0 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d  nitOrig = pPage-
11fd0 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74  >isInit;.    int
11fe0 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c   i;.    int nCel
11ff0 6c 3b 0a 0a 20 20 20 20 69 6e 69 74 50 61 67 65  l;..    initPage
12000 28 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20  (pPage, 0);.    
12010 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
12020 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69  Cell;..    for(i
12030 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
12040 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65  ){.      u8 *pCe
12050 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
12060 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  age, i);.      i
12070 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
12080 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20  _OVERFLOW1 ){.  
12090 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69        CellInfo i
120a0 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 70 61 72  nfo;.        par
120b0 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
120c0 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
120d0 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f          if( info
120e0 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  .iOverflow ){.  
120f0 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72 6f          if( iFro
12100 6d 3d 3d 67 65 74 34 62 79 74 65 28 26 70 43 65  m==get4byte(&pCe
12110 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
12120 77 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  w]) ){.         
12130 20 20 20 70 75 74 34 62 79 74 65 28 26 70 43 65     put4byte(&pCe
12140 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
12150 77 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20  w], iTo);.      
12160 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12170 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12180 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
12190 20 20 20 20 20 20 20 20 69 66 28 20 67 65 74 34          if( get4
121a0 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72  byte(pCell)==iFr
121b0 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  om ){.          
121c0 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20  put4byte(pCell, 
121d0 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iTo);.          
121e0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
121f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12200 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65   .    if( i==nCe
12210 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ll ){.      if( 
12220 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54  eType!=PTRMAP_BT
12230 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  REE || .        
12240 20 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67    get4byte(&pPag
12250 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
12260 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69  hdrOffset+8])!=i
12270 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  From ){.        
12280 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
12290 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
122a0 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79    }.      put4by
122b0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
122c0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
122d0 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20  t+8], iTo);.    
122e0 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  }..    pPage->is
122f0 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69  Init = isInitOri
12300 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  g;.  }.  return 
12310 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
12320 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70  *.** Move the op
12330 65 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65  en database page
12340 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61   pDbPage to loca
12350 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69  tion iFreePage i
12360 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  n the .** databa
12370 73 65 2e 20 54 68 65 20 70 44 62 50 61 67 65 20  se. The pDbPage 
12380 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e  reference remain
12390 73 20 76 61 6c 69 64 2e 0a 2a 2f 0a 73 74 61 74  s valid..*/.stat
123a0 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50  ic int relocateP
123b0 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
123c0 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20  *pBt,           
123d0 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65  /* Btree */.  Me
123e0 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20  mPage *pDbPage, 
123f0 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70         /* Open p
12400 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20  age to move */. 
12410 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20   u8 eType,      
12420 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
12430 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65 27 20  nter map 'type' 
12440 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67  entry for pDbPag
12450 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72  e */.  Pgno iPtr
12460 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
12470 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27  /* Pointer map '
12480 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66  page-no' entry f
12490 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  or pDbPage */.  
124a0 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 20 20  Pgno iFreePage  
124b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
124c0 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65  location to move
124d0 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 29   pDbPage to */.)
124e0 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74  {.  MemPage *pPt
124f0 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20  rPage;   /* The 
12500 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
12510 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
12520 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
12530 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44 62 50  o iDbPage = pDbP
12540 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67  age->pgno;.  Pag
12550 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74  er *pPager = pBt
12560 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
12570 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65  rc;..  assert( e
12580 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
12590 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d  RFLOW2 || eType=
125a0 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
125b0 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70  1 || .      eTyp
125c0 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
125d0 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
125e0 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 0a 20 20  _ROOTPAGE );..  
125f0 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62  /* Move page iDb
12600 50 61 67 65 20 66 72 6f 6d 20 69 74 27 73 20 63  Page from it's c
12610 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
12620 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  to page number i
12630 46 72 65 65 50 61 67 65 20 2a 2f 0a 20 20 54 52  FreePage */.  TR
12640 41 43 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d  ACE(("AUTOVACUUM
12650 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20 66  : Moving %d to f
12660 72 65 65 20 70 61 67 65 20 25 64 20 28 70 74 72  ree page %d (ptr
12670 20 70 61 67 65 20 25 64 20 74 79 70 65 20 25 64   page %d type %d
12680 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69 44 62  )\n", .      iDb
12690 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c  Page, iFreePage,
126a0 20 69 50 74 72 50 61 67 65 2c 20 65 54 79 70 65   iPtrPage, eType
126b0 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ));.  rc = sqlit
126c0 65 33 70 61 67 65 72 5f 6d 6f 76 65 70 61 67 65  e3pager_movepage
126d0 28 70 50 61 67 65 72 2c 20 70 44 62 50 61 67 65  (pPager, pDbPage
126e0 2d 3e 61 44 61 74 61 2c 20 69 46 72 65 65 50 61  ->aData, iFreePa
126f0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
12700 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12710 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
12720 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d   pDbPage->pgno =
12730 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f   iFreePage;..  /
12740 2a 20 49 66 20 70 44 62 50 61 67 65 20 77 61 73  * If pDbPage was
12750 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74   a btree-page, t
12760 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20  hen it may have 
12770 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f  child pages and/
12780 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68  or cells.  ** th
12790 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72  at point to over
127a0 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20  flow pages. The 
127b0 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
127c0 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73  ies for all thes
127d0 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65  e.  ** pages nee
127e0 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e  d to be changed.
127f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44  .  **.  ** If pD
12800 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72  bPage is an over
12810 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20  flow page, then 
12820 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
12830 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20  s may store a.  
12840 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20  ** pointer to a 
12850 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66  subsequent overf
12860 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68 69  low page. If thi
12870 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  s is the case, t
12880 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69  hen.  ** the poi
12890 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74  nter map needs t
128a0 6f 20 62 65 20 75 70 64 61 74 65 64 20 66 6f 72  o be updated for
128b0 20 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 20   the subsequent 
128c0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20  overflow page.. 
128d0 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d   */.  if( eType=
128e0 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
128f0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
12900 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72  OOTPAGE ){.    r
12910 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d  c = setChildPtrm
12920 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20  aps(pDbPage);.  
12930 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
12940 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
12950 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
12960 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20  }else{.    Pgno 
12970 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62  nextOvfl = get4b
12980 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61  yte(pDbPage->aDa
12990 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78  ta);.    if( nex
129a0 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20  tOvfl!=0 ){.    
129b0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
129c0 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20  (pBt, nextOvfl, 
129d0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
129e0 2c 20 69 46 72 65 65 50 61 67 65 29 3b 0a 20 20  , iFreePage);.  
129f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12a00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
12a10 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
12a20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
12a30 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74 61   /* Fix the data
12a40 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20  base pointer on 
12a50 70 61 67 65 20 69 50 74 72 50 61 67 65 20 74 68  page iPtrPage th
12a60 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44  at pointed at iD
12a70 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68  bPage so.  ** th
12a80 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20  at it points at 
12a90 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20  iFreePage. Also 
12aa0 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20  fix the pointer 
12ab0 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20  map entry for.  
12ac0 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a  ** iPtrPage..  *
12ad0 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 50  /.  if( eType!=P
12ae0 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
12af0 7b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 50 61  {.    rc = getPa
12b00 67 65 28 70 42 74 2c 20 69 50 74 72 50 61 67 65  ge(pBt, iPtrPage
12b10 2c 20 26 70 50 74 72 50 61 67 65 29 3b 0a 20 20  , &pPtrPage);.  
12b20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
12b30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
12b40 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
12b50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
12b60 67 65 72 5f 77 72 69 74 65 28 70 50 74 72 50 61  ger_write(pPtrPa
12b70 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  ge->aData);.    
12b80 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12b90 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
12ba0 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29  sePage(pPtrPage)
12bb0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
12bc0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
12bd0 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e  = modifyPagePoin
12be0 74 65 72 28 70 50 74 72 50 61 67 65 2c 20 69 44  ter(pPtrPage, iD
12bf0 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
12c00 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65  , eType);.    re
12c10 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61  leasePage(pPtrPa
12c20 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
12c30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12c40 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
12c50 75 74 28 70 42 74 2c 20 69 46 72 65 65 50 61 67  ut(pBt, iFreePag
12c60 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61  e, eType, iPtrPa
12c70 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ge);.    }.  }. 
12c80 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
12c90 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
12ca0 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62  ation required b
12cb0 79 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d  y autoVacuumComm
12cc0 69 74 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20  it(). */.static 
12cd0 69 6e 74 20 61 6c 6c 6f 63 61 74 65 50 61 67 65  int allocatePage
12ce0 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d  (BtShared *, Mem
12cf0 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c  Page **, Pgno *,
12d00 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a   Pgno, u8);../*.
12d10 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
12d20 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20  is called prior 
12d30 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  to sqlite3pager_
12d40 63 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72  commit when a tr
12d50 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
12d60 63 6f 6d 6d 69 74 65 64 20 66 6f 72 20 61 6e 20  commited for an 
12d70 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
12d80 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  base..*/.static 
12d90 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f  int autoVacuumCo
12da0 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a 70  mmit(BtShared *p
12db0 42 74 2c 20 50 67 6e 6f 20 2a 6e 54 72 75 6e 63  Bt, Pgno *nTrunc
12dc0 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
12dd0 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72  er = pBt->pPager
12de0 3b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69  ;.  Pgno nFreeLi
12df0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  st;            /
12e00 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
12e10 73 20 72 65 6d 61 69 6e 69 6e 67 20 6f 6e 20 74  s remaining on t
12e20 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 2a 2f  he free-list. */
12e30 0a 20 20 69 6e 74 20 6e 50 74 72 4d 61 70 3b 20  .  int nPtrMap; 
12e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12e50 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74   Number of point
12e60 65 72 2d 6d 61 70 20 70 61 67 65 73 20 64 65 61  er-map pages dea
12e70 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 50 67  llocated */.  Pg
12e80 6e 6f 20 6f 72 69 67 53 69 7a 65 3b 20 20 20 20  no origSize;    
12e90 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
12ea0 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
12eb0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
12ec0 20 66 69 6e 53 69 7a 65 3b 20 20 20 20 20 20 20   finSize;       
12ed0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73 20         /* Pages 
12ee0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
12ef0 66 69 6c 65 20 61 66 74 65 72 20 74 72 75 6e 63  file after trunc
12f00 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ation */.  int r
12f10 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
12f20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
12f30 63 6f 64 65 20 2a 2f 0a 20 20 75 38 20 65 54 79  code */.  u8 eTy
12f40 70 65 3b 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d  pe;.  int pgsz =
12f50 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 20   pBt->pageSize; 
12f60 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 66 6f   /* Page size fo
12f70 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  r this database 
12f80 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67  */.  Pgno iDbPag
12f90 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
12fa0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
12fb0 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a  page to move */.
12fc0 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 4d 65    MemPage *pDbMe
12fd0 6d 50 61 67 65 20 3d 20 30 3b 20 20 20 2f 2a 20  mPage = 0;   /* 
12fe0 22 22 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74  "" */.  Pgno iPt
12ff0 72 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  rPage;          
13000 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
13010 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  hat contains a p
13020 6f 69 6e 74 65 72 20 74 6f 20 69 44 62 50 61 67  ointer to iDbPag
13030 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65  e */.  Pgno iFre
13040 65 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  ePage;          
13050 20 20 2f 2a 20 54 68 65 20 66 72 65 65 2d 6c 69    /* The free-li
13060 73 74 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  st page to move 
13070 69 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20  iDbPage to */.  
13080 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 4d 65  MemPage *pFreeMe
13090 6d 50 61 67 65 20 3d 20 30 3b 20 2f 2a 20 22 22  mPage = 0; /* ""
130a0 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45   */..#ifndef NDE
130b0 42 55 47 0a 20 20 69 6e 74 20 6e 52 65 66 20 3d  BUG.  int nRef =
130c0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65   sqlite3pager_re
130d0 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a  fcount(pPager);.
130e0 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
130f0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
13100 6d 20 29 3b 0a 20 20 69 66 28 20 50 54 52 4d 41  m );.  if( PTRMA
13110 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 73 71  P_ISPAGE(pBt, sq
13120 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63  lite3pager_pagec
13130 6f 75 6e 74 28 70 50 61 67 65 72 29 29 20 29 7b  ount(pPager)) ){
13140 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13150 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
13160 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72  .  }..  /* Figur
13170 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 66  e out how many f
13180 72 65 65 2d 70 61 67 65 73 20 61 72 65 20 69 6e  ree-pages are in
13190 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
131a0 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20  f there are no. 
131b0 20 2a 2a 20 66 72 65 65 20 70 61 67 65 73 2c 20   ** free pages, 
131c0 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  then auto-vacuum
131d0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a   is a no-op..  *
131e0 2f 0a 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20  /.  nFreeList = 
131f0 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
13200 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
13210 29 3b 0a 20 20 69 66 28 20 6e 46 72 65 65 4c 69  );.  if( nFreeLi
13220 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 6e 54  st==0 ){.    *nT
13230 72 75 6e 63 20 3d 20 30 3b 0a 20 20 20 20 72 65  runc = 0;.    re
13240 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13250 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 62    }..  /* This b
13260 6c 6f 63 6b 20 66 69 67 75 72 65 73 20 6f 75 74  lock figures out
13270 20 68 6f 77 20 6d 61 6e 79 20 70 61 67 65 73 20   how many pages 
13280 74 68 65 72 65 20 61 72 65 20 69 6e 20 74 68 65  there are in the
13290 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 6e   database.  ** n
132a0 6f 77 20 28 76 61 72 69 61 62 6c 65 20 6f 72 69  ow (variable ori
132b0 67 53 69 7a 65 29 2c 20 61 6e 64 20 68 6f 77 20  gSize), and how 
132c0 6d 61 6e 79 20 74 68 65 72 65 20 77 69 6c 6c 20  many there will 
132d0 62 65 20 61 66 74 65 72 20 74 68 65 0a 20 20 2a  be after the.  *
132e0 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20 28 76 61  * truncation (va
132f0 72 69 61 62 6c 65 20 66 69 6e 53 69 7a 65 29 2e  riable finSize).
13300 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  **.  ** The f
13310 69 6e 61 6c 20 73 69 7a 65 20 69 73 20 74 68 65  inal size is the
13320 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2c 20   original size, 
13330 6c 65 73 73 20 74 68 65 20 6e 75 6d 62 65 72 20  less the number 
13340 6f 66 20 66 72 65 65 20 70 61 67 65 73 0a 20 20  of free pages.  
13350 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ** in the databa
13360 73 65 2c 20 6c 65 73 73 20 61 6e 79 20 70 6f 69  se, less any poi
13370 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73 20 74  nter-map pages t
13380 68 61 74 20 77 69 6c 6c 20 6e 6f 20 6c 6f 6e 67  hat will no long
13390 65 72 0a 20 20 2a 2a 20 62 65 20 72 65 71 75 69  er.  ** be requi
133a0 72 65 64 2c 20 6c 65 73 73 20 31 20 69 66 20 74  red, less 1 if t
133b0 68 65 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20  he pending-byte 
133c0 70 61 67 65 20 77 61 73 20 70 61 72 74 20 6f 66  page was part of
133d0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
133e0 2a 2a 20 62 75 74 20 69 73 20 6e 6f 74 20 61 66  ** but is not af
133f0 74 65 72 20 74 68 65 20 74 72 75 6e 63 61 74 69  ter the truncati
13400 6f 6e 2e 0a 20 20 2a 2a 2f 0a 20 20 6f 72 69 67  on..  **/.  orig
13410 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 70 61  Size = sqlite3pa
13420 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50  ger_pagecount(pP
13430 61 67 65 72 29 3b 0a 20 20 69 66 28 20 6f 72 69  ager);.  if( ori
13440 67 53 69 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f 42  gSize==PENDING_B
13450 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
13460 0a 20 20 20 20 6f 72 69 67 53 69 7a 65 2d 2d 3b  .    origSize--;
13470 0a 20 20 7d 0a 20 20 6e 50 74 72 4d 61 70 20 3d  .  }.  nPtrMap =
13480 20 28 6e 46 72 65 65 4c 69 73 74 2d 6f 72 69 67   (nFreeList-orig
13490 53 69 7a 65 2b 50 54 52 4d 41 50 5f 50 41 47 45  Size+PTRMAP_PAGE
134a0 4e 4f 28 70 42 74 2c 20 6f 72 69 67 53 69 7a 65  NO(pBt, origSize
134b0 29 2b 70 67 73 7a 2f 35 29 2f 28 70 67 73 7a 2f  )+pgsz/5)/(pgsz/
134c0 35 29 3b 0a 20 20 66 69 6e 53 69 7a 65 20 3d 20  5);.  finSize = 
134d0 6f 72 69 67 53 69 7a 65 20 2d 20 6e 46 72 65 65  origSize - nFree
134e0 4c 69 73 74 20 2d 20 6e 50 74 72 4d 61 70 3b 0a  List - nPtrMap;.
134f0 20 20 69 66 28 20 6f 72 69 67 53 69 7a 65 3e 50    if( origSize>P
13500 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
13510 28 70 42 74 29 20 26 26 20 66 69 6e 53 69 7a 65  (pBt) && finSize
13520 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  <=PENDING_BYTE_P
13530 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
13540 66 69 6e 53 69 7a 65 2d 2d 3b 0a 20 20 7d 0a 20  finSize--;.  }. 
13550 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49   while( PTRMAP_I
13560 53 50 41 47 45 28 70 42 74 2c 20 66 69 6e 53 69  SPAGE(pBt, finSi
13570 7a 65 29 20 7c 7c 20 66 69 6e 53 69 7a 65 3d 3d  ze) || finSize==
13580 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
13590 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 66 69  E(pBt) ){.    fi
135a0 6e 53 69 7a 65 2d 2d 3b 0a 20 20 7d 0a 20 20 54  nSize--;.  }.  T
135b0 52 41 43 45 28 28 22 41 55 54 4f 56 41 43 55 55  RACE(("AUTOVACUU
135c0 4d 3a 20 42 65 67 69 6e 20 28 64 62 20 73 69 7a  M: Begin (db siz
135d0 65 20 25 64 2d 3e 25 64 29 5c 6e 22 2c 20 6f 72  e %d->%d)\n", or
135e0 69 67 53 69 7a 65 2c 20 66 69 6e 53 69 7a 65 29  igSize, finSize)
135f0 29 3b 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c  );..  /* Variabl
13600 65 20 27 66 69 6e 53 69 7a 65 27 20 77 69 6c 6c  e 'finSize' will
13610 20 62 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20   be the size of 
13620 74 68 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65  the file in page
13630 73 20 61 66 74 65 72 0a 20 20 2a 2a 20 74 68 65  s after.  ** the
13640 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 68 61 73   auto-vacuum has
13650 20 63 6f 6d 70 6c 65 74 65 64 20 28 74 68 65 20   completed (the 
13660 63 75 72 72 65 6e 74 20 66 69 6c 65 20 73 69 7a  current file siz
13670 65 20 6d 69 6e 75 73 20 74 68 65 20 6e 75 6d 62  e minus the numb
13680 65 72 0a 20 20 2a 2a 20 6f 66 20 70 61 67 65 73  er.  ** of pages
13690 20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c 69 73   on the free lis
136a0 74 29 2e 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68  t). Loop through
136b0 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74 20   the pages that 
136c0 6c 69 65 20 62 65 79 6f 6e 64 0a 20 20 2a 2a 20  lie beyond.  ** 
136d0 74 68 69 73 20 6d 61 72 6b 2c 20 61 6e 64 20 69  this mark, and i
136e0 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20 61  f they are not a
136f0 6c 72 65 61 64 79 20 6f 6e 20 74 68 65 20 66 72  lready on the fr
13700 65 65 20 6c 69 73 74 2c 20 6d 6f 76 65 20 74 68  ee list, move th
13710 65 6d 0a 20 20 2a 2a 20 74 6f 20 61 20 66 72 65  em.  ** to a fre
13720 65 20 70 61 67 65 20 65 61 72 6c 69 65 72 20 69  e page earlier i
13730 6e 20 74 68 65 20 66 69 6c 65 20 28 73 6f 6d 65  n the file (some
13740 77 68 65 72 65 20 62 65 66 6f 72 65 20 66 69 6e  where before fin
13750 53 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 66 6f  Size)..  */.  fo
13760 72 28 20 69 44 62 50 61 67 65 3d 66 69 6e 53 69  r( iDbPage=finSi
13770 7a 65 2b 31 3b 20 69 44 62 50 61 67 65 3c 3d 6f  ze+1; iDbPage<=o
13780 72 69 67 53 69 7a 65 3b 20 69 44 62 50 61 67 65  rigSize; iDbPage
13790 2b 2b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  ++ ){.    /* If 
137a0 69 44 62 50 61 67 65 20 69 73 20 61 20 70 6f 69  iDbPage is a poi
137b0 6e 74 65 72 20 6d 61 70 20 70 61 67 65 2c 20 6f  nter map page, o
137c0 72 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 62 79  r the pending-by
137d0 74 65 20 70 61 67 65 2c 20 73 6b 69 70 20 69 74  te page, skip it
137e0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 50 54 52  . */.    if( PTR
137f0 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
13800 69 44 62 50 61 67 65 29 20 7c 7c 20 69 44 62 50  iDbPage) || iDbP
13810 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  age==PENDING_BYT
13820 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
13830 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
13840 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70     }..    rc = p
13850 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 44  trmapGet(pBt, iD
13860 62 50 61 67 65 2c 20 26 65 54 79 70 65 2c 20 26  bPage, &eType, &
13870 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69  iPtrPage);.    i
13880 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
13890 20 29 20 67 6f 74 6f 20 61 75 74 6f 76 61 63 75   ) goto autovacu
138a0 75 6d 5f 6f 75 74 3b 0a 20 20 20 20 69 66 28 20  um_out;.    if( 
138b0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
138c0 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  OTPAGE ){.      
138d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
138e0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
138f0 67 6f 74 6f 20 61 75 74 6f 76 61 63 75 75 6d 5f  goto autovacuum_
13900 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  out;.    }..    
13910 2f 2a 20 49 66 20 69 44 62 50 61 67 65 20 69 73  /* If iDbPage is
13920 20 66 72 65 65 2c 20 64 6f 20 6e 6f 74 20 73 77   free, do not sw
13930 61 70 20 69 74 2e 20 20 2a 2f 0a 20 20 20 20 69  ap it.  */.    i
13940 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
13950 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20  _FREEPAGE ){.   
13960 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
13970 20 7d 0a 20 20 20 20 72 63 20 3d 20 67 65 74 50   }.    rc = getP
13980 61 67 65 28 70 42 74 2c 20 69 44 62 50 61 67 65  age(pBt, iDbPage
13990 2c 20 26 70 44 62 4d 65 6d 50 61 67 65 29 3b 0a  , &pDbMemPage);.
139a0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
139b0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 75 74  TE_OK ) goto aut
139c0 6f 76 61 63 75 75 6d 5f 6f 75 74 3b 0a 0a 20 20  ovacuum_out;..  
139d0 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6e 65    /* Find the ne
139e0 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 66  xt page in the f
139f0 72 65 65 2d 6c 69 73 74 20 74 68 61 74 20 69 73  ree-list that is
13a00 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 74 20   not already at 
13a10 74 68 65 20 65 6e 64 20 0a 20 20 20 20 2a 2a 20  the end .    ** 
13a20 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 41 20 70  of the file. A p
13a30 61 67 65 20 63 61 6e 20 62 65 20 70 75 6c 6c 65  age can be pulle
13a40 64 20 6f 66 66 20 74 68 65 20 66 72 65 65 20 6c  d off the free l
13a50 69 73 74 20 75 73 69 6e 67 20 74 68 65 20 0a 20  ist using the . 
13a60 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 50 61     ** allocatePa
13a70 67 65 28 29 20 72 6f 75 74 69 6e 65 2e 0a 20 20  ge() routine..  
13a80 20 20 2a 2f 0a 20 20 20 20 64 6f 7b 0a 20 20 20    */.    do{.   
13a90 20 20 20 69 66 28 20 70 46 72 65 65 4d 65 6d 50     if( pFreeMemP
13aa0 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  age ){.        r
13ab0 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65  eleasePage(pFree
13ac0 4d 65 6d 50 61 67 65 29 3b 0a 20 20 20 20 20 20  MemPage);.      
13ad0 20 20 70 46 72 65 65 4d 65 6d 50 61 67 65 20 3d    pFreeMemPage =
13ae0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
13af0 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 50    rc = allocateP
13b00 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 4d  age(pBt, &pFreeM
13b10 65 6d 50 61 67 65 2c 20 26 69 46 72 65 65 50 61  emPage, &iFreePa
13b20 67 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ge, 0, 0);.     
13b30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13b40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
13b50 6c 65 61 73 65 50 61 67 65 28 70 44 62 4d 65 6d  leasePage(pDbMem
13b60 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 67  Page);.        g
13b70 6f 74 6f 20 61 75 74 6f 76 61 63 75 75 6d 5f 6f  oto autovacuum_o
13b80 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
13b90 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50    assert( iFreeP
13ba0 61 67 65 3c 3d 6f 72 69 67 53 69 7a 65 20 29 3b  age<=origSize );
13bb0 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69 46 72  .    }while( iFr
13bc0 65 65 50 61 67 65 3e 66 69 6e 53 69 7a 65 20 29  eePage>finSize )
13bd0 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
13be0 65 28 70 46 72 65 65 4d 65 6d 50 61 67 65 29 3b  e(pFreeMemPage);
13bf0 0a 20 20 20 20 70 46 72 65 65 4d 65 6d 50 61 67  .    pFreeMemPag
13c00 65 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 52  e = 0;..    /* R
13c10 65 6c 6f 63 61 74 65 20 74 68 65 20 70 61 67 65  elocate the page
13c20 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f   into the body o
13c30 66 20 74 68 65 20 66 69 6c 65 2e 20 4e 6f 74 65  f the file. Note
13c40 20 74 68 61 74 20 61 6c 74 68 6f 75 67 68 20 74   that although t
13c50 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 20  he .    ** page 
13c60 68 61 73 20 6d 6f 76 65 64 20 77 69 74 68 69 6e  has moved within
13c70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
13c80 6c 65 2c 20 74 68 65 20 70 44 62 4d 65 6d 50 61  le, the pDbMemPa
13c90 67 65 20 70 6f 69 6e 74 65 72 20 0a 20 20 20 20  ge pointer .    
13ca0 2a 2a 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64  ** remains valid
13cb0 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
13cc0 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  t this function 
13cd0 63 61 6e 20 72 75 6e 20 77 69 74 68 6f 75 74 0a  can run without.
13ce0 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64 61 74      ** invalidat
13cf0 69 6e 67 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  ing cursors open
13d00 20 6f 6e 20 74 68 65 20 62 74 72 65 65 2e 20 54   on the btree. T
13d10 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  his is important
13d20 20 69 6e 20 0a 20 20 20 20 2a 2a 20 73 68 61 72   in .    ** shar
13d30 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2e 0a 20  ed-cache mode.. 
13d40 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72     */.    rc = r
13d50 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c  elocatePage(pBt,
13d60 20 70 44 62 4d 65 6d 50 61 67 65 2c 20 65 54 79   pDbMemPage, eTy
13d70 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69 46  pe, iPtrPage, iF
13d80 72 65 65 50 61 67 65 29 3b 0a 20 20 20 20 72 65  reePage);.    re
13d90 6c 65 61 73 65 50 61 67 65 28 70 44 62 4d 65 6d  leasePage(pDbMem
13da0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
13db0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
13dc0 6f 74 6f 20 61 75 74 6f 76 61 63 75 75 6d 5f 6f  oto autovacuum_o
13dd0 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  ut;.  }..  /* Th
13de0 65 20 65 6e 74 69 72 65 20 66 72 65 65 2d 6c 69  e entire free-li
13df0 73 74 20 68 61 73 20 62 65 65 6e 20 73 77 61 70  st has been swap
13e00 70 65 64 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ped to the end o
13e10 66 20 74 68 65 20 66 69 6c 65 2e 20 53 6f 0a 20  f the file. So. 
13e20 20 2a 2a 20 74 72 75 6e 63 61 74 65 20 74 68 65   ** truncate the
13e30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
13e40 6f 20 66 69 6e 53 69 7a 65 20 70 61 67 65 73 20  o finSize pages 
13e50 61 6e 64 20 63 6f 6e 73 69 64 65 72 20 74 68 65  and consider the
13e60 0a 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20  .  ** free-list 
13e70 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 72 63  empty..  */.  rc
13e80 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
13e90 77 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  write(pBt->pPage
13ea0 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 69 66 28  1->aData);.  if(
13eb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13ec0 20 67 6f 74 6f 20 61 75 74 6f 76 61 63 75 75 6d   goto autovacuum
13ed0 5f 6f 75 74 3b 0a 20 20 70 75 74 34 62 79 74 65  _out;.  put4byte
13ee0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
13ef0 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20  Data[32], 0);.  
13f00 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
13f10 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
13f20 2c 20 30 29 3b 0a 20 20 2a 6e 54 72 75 6e 63 20  , 0);.  *nTrunc 
13f30 3d 20 66 69 6e 53 69 7a 65 3b 0a 20 20 61 73 73  = finSize;.  ass
13f40 65 72 74 28 20 66 69 6e 53 69 7a 65 21 3d 50 45  ert( finSize!=PE
13f50 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
13f60 70 42 74 29 20 29 3b 0a 0a 61 75 74 6f 76 61 63  pBt) );..autovac
13f70 75 75 6d 5f 6f 75 74 3a 0a 20 20 61 73 73 65 72  uum_out:.  asser
13f80 74 28 20 6e 52 65 66 3d 3d 73 71 6c 69 74 65 33  t( nRef==sqlite3
13f90 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 28 70  pager_refcount(p
13fa0 50 61 67 65 72 29 20 29 3b 0a 20 20 69 66 28 20  Pager) );.  if( 
13fb0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13fc0 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65  .    sqlite3page
13fd0 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
13fe0 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
13ff0 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f   rc;.}.#endif../
14000 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20  *.** Commit the 
14010 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72  transaction curr
14020 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73  ently in progres
14030 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69  s..**.** This wi
14040 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77  ll release the w
14050 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
14060 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
14070 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   If there.** are
14080 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f   no active curso
14090 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65  rs, it also rele
140a0 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f  ases the read lo
140b0 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ck..*/.int sqlit
140c0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74  e3BtreeCommit(Bt
140d0 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
140e0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
140f0 74 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67  t;..  btreeInteg
14100 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  rity(p);..  /* I
14110 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73  f the handle has
14120 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
14130 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69  tion open, commi
14140 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  t the shared-btr
14150 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ees .  ** transa
14160 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68  ction and set th
14170 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74  e shared state t
14180 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20  o TRANS_READ..  
14190 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
141a0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
141b0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
141c0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
141d0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
141e0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
141f0 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
14200 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29  nTransaction>0 )
14210 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
14220 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 70  e3pager_commit(p
14230 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
14240 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14250 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
14260 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
14270 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
14280 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44  ion = TRANS_READ
14290 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d  ;.    pBt->inStm
142a0 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 75 6e 6c  t = 0;.  }.  unl
142b0 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28 70 29 3b  ockAllTables(p);
142c0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61  ..  /* If the ha
142d0 6e 64 6c 65 20 68 61 73 20 61 6e 79 20 6b 69 6e  ndle has any kin
142e0 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e  d of transaction
142f0 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74   open, decrement
14300 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
14310 0a 20 20 2a 2a 20 63 6f 75 6e 74 20 6f 66 20 74  .  ** count of t
14320 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65 2e  he shared btree.
14330 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   If the transact
14340 69 6f 6e 20 63 6f 75 6e 74 20 72 65 61 63 68 65  ion count reache
14350 73 20 30 2c 20 73 65 74 0a 20 20 2a 2a 20 74 68  s 0, set.  ** th
14360 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74  e shared state t
14370 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68  o TRANS_NONE. Th
14380 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55  e unlockBtreeIfU
14390 6e 75 73 65 64 28 29 20 63 61 6c 6c 20 62 65 6c  nused() call bel
143a0 6f 77 0a 20 20 2a 2a 20 77 69 6c 6c 20 75 6e 6c  ow.  ** will unl
143b0 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 0a 20  ock the pager.. 
143c0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   */.  if( p->inT
143d0 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans!=TRANS_NONE
143e0 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72   ){.    pBt->nTr
143f0 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20  ansaction--;.   
14400 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72   if( 0==pBt->nTr
14410 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ansaction ){.   
14420 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
14430 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f  ction = TRANS_NO
14440 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  NE;.    }.  }.. 
14450 20 2f 2a 20 53 65 74 20 74 68 65 20 68 61 6e 64   /* Set the hand
14460 6c 65 73 20 63 75 72 72 65 6e 74 20 74 72 61 6e  les current tran
14470 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f  saction state to
14480 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20   TRANS_NONE and 
14490 75 6e 6c 6f 63 6b 0a 20 20 2a 2a 20 74 68 65 20  unlock.  ** the 
144a0 70 61 67 65 72 20 69 66 20 74 68 69 73 20 63 61  pager if this ca
144b0 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e  ll closed the on
144c0 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ly read or write
144d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
144e0 2a 2f 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  */.  p->inTrans 
144f0 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
14500 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
14510 73 65 64 28 70 42 74 29 3b 0a 0a 20 20 62 74 72  sed(pBt);..  btr
14520 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
14530 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14540 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e  OK;.}..#ifndef N
14550 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75  DEBUG./*.** Retu
14560 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
14570 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6f   write-cursors o
14580 70 65 6e 20 6f 6e 20 74 68 69 73 20 68 61 6e 64  pen on this hand
14590 6c 65 2e 20 54 68 69 73 20 69 73 20 66 6f 72 20  le. This is for 
145a0 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74  use.** in assert
145b0 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  () expressions, 
145c0 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f  so it is only co
145d0 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42 55 47  mpiled if NDEBUG
145e0 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e   is not.** defin
145f0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
14600 74 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73  t countWriteCurs
14610 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42  ors(BtShared *pB
14620 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  t){.  BtCursor *
14630 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20  pCur;.  int r = 
14640 30 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42  0;.  for(pCur=pB
14650 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72  t->pCursor; pCur
14660 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65  ; pCur=pCur->pNe
14670 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  xt){.    if( pCu
14680 72 2d 3e 77 72 46 6c 61 67 20 29 20 72 2b 2b 3b  r->wrFlag ) r++;
14690 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72   .  }.  return r
146a0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ;.}.#endif..#if 
146b0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
146c0 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  EST) || defined(
146d0 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a  SQLITE_DEBUG)./*
146e0 0a 2a 2a 20 50 72 69 6e 74 20 64 65 62 75 67 67  .** Print debugg
146f0 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
14700 61 62 6f 75 74 20 61 6c 6c 20 63 75 72 73 6f 72  about all cursor
14710 73 20 74 6f 20 73 74 61 6e 64 61 72 64 20 6f 75  s to standard ou
14720 74 70 75 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tput..*/.void sq
14730 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
14740 4c 69 73 74 28 42 74 72 65 65 20 2a 70 29 7b 0a  List(Btree *p){.
14750 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
14760 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
14770 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 66 6f  t = p->pBt;.  fo
14780 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72  r(pCur=pBt->pCur
14790 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d  sor; pCur; pCur=
147a0 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pCur->pNext){.  
147b0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
147c0 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
147d0 20 20 20 20 63 68 61 72 20 2a 7a 4d 6f 64 65 20      char *zMode 
147e0 3d 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 3f  = pCur->wrFlag ?
147f0 20 22 72 77 22 20 3a 20 22 72 6f 22 3b 0a 20 20   "rw" : "ro";.  
14800 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
14810 69 6e 74 66 28 22 43 55 52 53 4f 52 20 25 70 20  intf("CURSOR %p 
14820 72 6f 6f 74 65 64 20 61 74 20 25 34 64 28 25 73  rooted at %4d(%s
14830 29 20 63 75 72 72 65 6e 74 6c 79 20 61 74 20 25  ) currently at %
14840 64 2e 25 64 25 73 5c 6e 22 2c 0a 20 20 20 20 20  d.%d%s\n",.     
14850 20 20 70 43 75 72 2c 20 70 43 75 72 2d 3e 70 67    pCur, pCur->pg
14860 6e 6f 52 6f 6f 74 2c 20 7a 4d 6f 64 65 2c 0a 20  noRoot, zMode,. 
14870 20 20 20 20 20 20 70 50 61 67 65 20 3f 20 70 50        pPage ? pP
14880 61 67 65 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 70  age->pgno : 0, p
14890 43 75 72 2d 3e 69 64 78 2c 0a 20 20 20 20 20 20  Cur->idx,.      
148a0 20 28 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d   (pCur->eState==
148b0 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 20 3f 20  CURSOR_VALID) ? 
148c0 22 22 20 3a 20 22 20 65 6f 66 22 0a 20 20 20 20  "" : " eof".    
148d0 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.
148e0 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
148f0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
14900 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20 41 6c  in progress.  Al
14910 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62  l cursors will b
14920 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20 62  e.** invalided b
14930 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  y this operation
14940 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
14950 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72 0a 2a  o use a cursor.*
14960 2a 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20  * that was open 
14970 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
14980 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74 69   of this operati
14990 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a  on will result.*
149a0 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  * in an error..*
149b0 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72  *.** This will r
149c0 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
149d0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
149e0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
149f0 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
14a00 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20  active cursors, 
14a10 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73  it also releases
14a20 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
14a30 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
14a40 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65  reeRollback(Btre
14a50 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
14a60 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
14a70 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d   = p->pBt;.  Mem
14a80 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20  Page *pPage1;.. 
14a90 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72   rc = saveAllCur
14aa0 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  sors(pBt, 0, 0);
14ab0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14ac0 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
14ad0 45 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  E.  if( rc!=SQLI
14ae0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  TE_OK ){.    /* 
14af0 54 68 69 73 20 69 73 20 61 20 68 6f 72 72 69 62  This is a horrib
14b00 6c 65 20 73 69 74 75 61 74 69 6f 6e 2e 20 41 6e  le situation. An
14b10 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20   IO or malloc() 
14b20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20 77 68  error occured wh
14b30 69 6c 73 74 0a 20 20 20 20 2a 2a 20 74 72 79 69  ilst.    ** tryi
14b40 6e 67 20 74 6f 20 73 61 76 65 20 63 75 72 73 6f  ng to save curso
14b50 72 20 70 6f 73 69 74 69 6f 6e 73 2e 20 49 66 20  r positions. If 
14b60 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 6d  this is an autom
14b70 61 74 69 63 20 72 6f 6c 6c 62 61 63 6b 20 28 61  atic rollback (a
14b80 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65 73  s.    ** the res
14b90 75 6c 74 20 6f 66 20 61 20 63 6f 6e 73 74 72 61  ult of a constra
14ba0 69 6e 74 2c 20 6d 61 6c 6c 6f 63 28 29 20 66 61  int, malloc() fa
14bb0 69 6c 75 72 65 20 6f 72 20 49 4f 20 65 72 72 6f  ilure or IO erro
14bc0 72 29 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20  r) then .    ** 
14bd0 74 68 65 20 63 61 63 68 65 20 6d 61 79 20 62 65  the cache may be
14be0 20 69 6e 74 65 72 6e 61 6c 6c 79 20 69 6e 63 6f   internally inco
14bf0 6e 73 69 73 74 65 6e 74 20 28 6e 6f 74 20 63 6f  nsistent (not co
14c00 6e 74 61 69 6e 20 76 61 6c 69 64 20 74 72 65 65  ntain valid tree
14c10 73 29 20 73 6f 0a 20 20 20 20 2a 2a 20 77 65 20  s) so.    ** we 
14c20 63 61 6e 6e 6f 74 20 73 69 6d 70 6c 79 20 72 65  cannot simply re
14c30 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 74  turn the error t
14c40 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 49 6e  o the caller. In
14c50 73 74 65 61 64 2c 20 61 62 6f 72 74 20 0a 20 20  stead, abort .  
14c60 20 20 2a 2a 20 61 6c 6c 20 71 75 65 72 69 65 73    ** all queries
14c70 20 74 68 61 74 20 6d 61 79 20 62 65 20 75 73 69   that may be usi
14c80 6e 67 20 61 6e 79 20 6f 66 20 74 68 65 20 63 75  ng any of the cu
14c90 72 73 6f 72 73 20 74 68 61 74 20 66 61 69 6c 65  rsors that faile
14ca0 64 20 74 6f 20 73 61 76 65 2e 0a 20 20 20 20 2a  d to save..    *
14cb0 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 42 74  /.    while( pBt
14cc0 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ->pCursor ){.   
14cd0 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
14ce0 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 2d 3e 70   pBt->pCursor->p
14cf0 42 74 72 65 65 2d 3e 70 53 71 6c 69 74 65 3b 0a  Btree->pSqlite;.
14d00 20 20 20 20 20 20 69 66 28 20 64 62 20 29 7b 0a        if( db ){.
14d10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 41          sqlite3A
14d20 62 6f 72 74 4f 74 68 65 72 41 63 74 69 76 65 56  bortOtherActiveV
14d30 64 62 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20  dbes(db, 0);.   
14d40 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
14d50 65 6e 64 69 66 0a 20 20 62 74 72 65 65 49 6e 74  endif.  btreeInt
14d60 65 67 72 69 74 79 28 70 29 3b 0a 20 20 75 6e 6c  egrity(p);.  unl
14d70 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28 70 29 3b  ockAllTables(p);
14d80 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ..  if( p->inTra
14d90 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
14da0 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  ){.    int rc2;.
14db0 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 52 41  .    assert( TRA
14dc0 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69  NS_WRITE==pBt->i
14dd0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a  nTransaction );.
14de0 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
14df0 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  3pager_rollback(
14e00 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
14e10 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54    if( rc2!=SQLIT
14e20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
14e30 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20   = rc2;.    }.. 
14e40 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61     /* The rollba
14e50 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73 74  ck may have dest
14e60 72 6f 79 65 64 20 74 68 65 20 70 50 61 67 65 31  royed the pPage1
14e70 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20  ->aData value.  
14e80 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 67  So.    ** call g
14e90 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65  etPage() on page
14ea0 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65   1 again to make
14eb0 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44   sure pPage1->aD
14ec0 61 74 61 20 69 73 0a 20 20 20 20 2a 2a 20 73 65  ata is.    ** se
14ed0 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a  t correctly. */.
14ee0 20 20 20 20 69 66 28 20 67 65 74 50 61 67 65 28      if( getPage(
14ef0 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 29  pBt, 1, &pPage1)
14f00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
14f10 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
14f20 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a  (pPage1);.    }.
14f30 20 20 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e      assert( coun
14f40 74 57 72 69 74 65 43 75 72 73 6f 72 73 28 70 42  tWriteCursors(pB
14f50 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74  t)==0 );.    pBt
14f60 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
14f70 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
14f80 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  }..  if( p->inTr
14f90 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans!=TRANS_NONE 
14fa0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
14fb0 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
14fc0 3e 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 6e  >0 );.    pBt->n
14fd0 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20  Transaction--;. 
14fe0 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e     if( 0==pBt->n
14ff0 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20  Transaction ){. 
15000 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e       pBt->inTran
15010 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
15020 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  NONE;.    }.  }.
15030 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20  .  p->inTrans = 
15040 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 42  TRANS_NONE;.  pB
15050 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  t->inStmt = 0;. 
15060 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
15070 75 73 65 64 28 70 42 74 29 3b 0a 0a 20 20 62 74  used(pBt);..  bt
15080 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
15090 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
150a0 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 73  ./*.** Start a s
150b0 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e  tatement subtran
150c0 73 61 63 74 69 6f 6e 2e 20 20 54 68 65 20 73 75  saction.  The su
150d0 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  btransaction can
150e0 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65  .** can be rolle
150f0 64 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65  d back independe
15100 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e  ntly of the main
15110 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
15120 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20   You must start 
15130 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65  a transaction be
15140 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61 20  fore starting a 
15150 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  subtransaction..
15160 2a 2a 20 54 68 65 20 73 75 62 74 72 61 6e 73 61  ** The subtransa
15170 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61  ction is ended a
15180 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 69 66 20  utomatically if 
15190 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63  the main transac
151a0 74 69 6f 6e 0a 2a 2a 20 63 6f 6d 6d 69 74 73 20  tion.** commits 
151b0 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a  or rolls back..*
151c0 2a 0a 2a 2a 20 4f 6e 6c 79 20 6f 6e 65 20 73 75  *.** Only one su
151d0 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79  btransaction may
151e0 20 62 65 20 61 63 74 69 76 65 20 61 74 20 61 20   be active at a 
151f0 74 69 6d 65 2e 20 20 49 74 20 69 73 20 61 6e 20  time.  It is an 
15200 65 72 72 6f 72 20 74 6f 20 74 72 79 0a 2a 2a 20  error to try.** 
15210 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 73  to start a new s
15220 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66  ubtransaction if
15230 20 61 6e 6f 74 68 65 72 20 73 75 62 74 72 61 6e   another subtran
15240 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61  saction is alrea
15250 64 79 20 61 63 74 69 76 65 2e 0a 2a 2a 0a 2a 2a  dy active..**.**
15260 20 53 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72   Statement subtr
15270 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75  ansactions are u
15280 73 65 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76  sed around indiv
15290 69 64 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  idual SQL statem
152a0 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61 72 65  ents.** that are
152b0 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
152c0 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d  n a BEGIN...COMM
152d0 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20  IT block.  If a 
152e0 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72  constraint.** er
152f0 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69  ror occurs withi
15300 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c  n the statement,
15310 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 74   the effect of t
15320 68 61 74 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e  hat one statemen
15330 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c  t.** can be roll
15340 65 64 20 62 61 63 6b 20 77 69 74 68 6f 75 74 20  ed back without 
15350 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61  having to rollba
15360 63 6b 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  ck the entire tr
15370 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e  ansaction..*/.in
15380 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  t sqlite3BtreeBe
15390 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70  ginStmt(Btree *p
153a0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
153b0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
153c0 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 28 70 2d  ->pBt;.  if( (p-
153d0 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f  >inTrans!=TRANS_
153e0 57 52 49 54 45 29 20 7c 7c 20 70 42 74 2d 3e 69  WRITE) || pBt->i
153f0 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 72 65 74  nStmt ){.    ret
15400 75 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  urn pBt->readOnl
15410 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  y ? SQLITE_READO
15420 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52  NLY : SQLITE_ERR
15430 4f 52 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  OR;.  }.  assert
15440 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
15450 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
15460 45 20 29 3b 0a 20 20 72 63 20 3d 20 70 42 74 2d  E );.  rc = pBt-
15470 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49  >readOnly ? SQLI
15480 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65 33 70  TE_OK : sqlite3p
15490 61 67 65 72 5f 73 74 6d 74 5f 62 65 67 69 6e 28  ager_stmt_begin(
154a0 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
154b0 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 31 3b  pBt->inStmt = 1;
154c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
154d0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74  ../*.** Commit t
154e0 68 65 20 73 74 61 74 6d 65 6e 74 20 73 75 62 74  he statment subt
154f0 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65  ransaction curre
15500 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73  ntly in progress
15510 2e 20 20 49 66 20 6e 6f 0a 2a 2a 20 73 75 62 74  .  If no.** subt
15520 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
15530 74 69 76 65 2c 20 74 68 69 73 20 69 73 20 61 20  tive, this is a 
15540 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71  no-op..*/.int sq
15550 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
15560 53 74 6d 74 28 42 74 72 65 65 20 2a 70 29 7b 0a  Stmt(Btree *p){.
15570 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
15580 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
15590 42 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69  Bt;.  if( pBt->i
155a0 6e 53 74 6d 74 20 26 26 20 21 70 42 74 2d 3e 72  nStmt && !pBt->r
155b0 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72  eadOnly ){.    r
155c0 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
155d0 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 70 42 74  _stmt_commit(pBt
155e0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c  ->pPager);.  }el
155f0 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  se{.    rc = SQL
15600 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 42  ITE_OK;.  }.  pB
15610 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  t->inStmt = 0;. 
15620 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
15630 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68  *.** Rollback th
15640 65 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65  e active stateme
15650 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
15660 6e 2e 20 20 49 66 20 6e 6f 20 73 75 62 74 72 61  n.  If no subtra
15670 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61  nsaction.** is a
15680 63 74 69 76 65 20 74 68 69 73 20 72 6f 75 74 69  ctive this routi
15690 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
156a0 2a 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73  *.** All cursors
156b0 20 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64   will be invalid
156c0 61 74 65 64 20 62 79 20 74 68 69 73 20 6f 70 65  ated by this ope
156d0 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74  ration.  Any att
156e0 65 6d 70 74 0a 2a 2a 20 74 6f 20 75 73 65 20 61  empt.** to use a
156f0 20 63 75 72 73 6f 72 20 74 68 61 74 20 77 61 73   cursor that was
15700 20 6f 70 65 6e 20 61 74 20 74 68 65 20 62 65 67   open at the beg
15710 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73 20 6f  inning of this o
15720 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c  peration.** will
15730 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 65 72   result in an er
15740 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ror..*/.int sqli
15750 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
15760 53 74 6d 74 28 42 74 72 65 65 20 2a 70 29 7b 0a  Stmt(Btree *p){.
15770 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
15780 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64  E_OK;.  BtShared
15790 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
157a0 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 44    sqlite3MallocD
157b0 69 73 61 6c 6c 6f 77 28 29 3b 0a 20 20 69 66 28  isallow();.  if(
157c0 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 26 26 20   pBt->inStmt && 
157d0 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  !pBt->readOnly )
157e0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
157f0 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 72 6f 6c  e3pager_stmt_rol
15800 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65  lback(pBt->pPage
15810 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
15820 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72  countWriteCursor
15830 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20 20  s(pBt)==0 );.   
15840 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30   pBt->inStmt = 0
15850 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4d  ;.  }.  sqlite3M
15860 61 6c 6c 6f 63 41 6c 6c 6f 77 28 29 3b 0a 20 20  allocAllow();.  
15870 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
15880 0a 2a 2a 20 44 65 66 61 75 6c 74 20 6b 65 79 20  .** Default key 
15890 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
158a0 69 6f 6e 20 74 6f 20 62 65 20 75 73 65 64 20 69  ion to be used i
158b0 66 20 6e 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20  f no comparison 
158c0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73  function.** is s
158d0 70 65 63 69 66 69 65 64 20 6f 6e 20 74 68 65 20  pecified on the 
158e0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
158f0 6f 72 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74  or() call..*/.st
15900 61 74 69 63 20 69 6e 74 20 64 66 6c 74 43 6f 6d  atic int dfltCom
15910 70 61 72 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  pare(.  void *No
15920 74 55 73 65 64 2c 20 20 20 20 20 20 20 20 20 20  tUsed,          
15930 20 20 20 2f 2a 20 55 73 65 72 20 64 61 74 61 20     /* User data 
15940 69 73 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 20  is not used */. 
15950 20 69 6e 74 20 6e 31 2c 20 63 6f 6e 73 74 20 76   int n1, const v
15960 6f 69 64 20 2a 70 31 2c 20 20 20 20 2f 2a 20 46  oid *p1,    /* F
15970 69 72 73 74 20 6b 65 79 20 74 6f 20 63 6f 6d 70  irst key to comp
15980 61 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 32 2c  are */.  int n2,
15990 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 32 20   const void *p2 
159a0 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 6b 65      /* Second ke
159b0 79 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a  y to compare */.
159c0 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 63 20  ){.  int c;.  c 
159d0 3d 20 6d 65 6d 63 6d 70 28 70 31 2c 20 70 32 2c  = memcmp(p1, p2,
159e0 20 6e 31 3c 6e 32 20 3f 20 6e 31 20 3a 20 6e 32   n1<n2 ? n1 : n2
159f0 29 3b 0a 20 20 69 66 28 20 63 3d 3d 30 20 29 7b  );.  if( c==0 ){
15a00 0a 20 20 20 20 63 20 3d 20 6e 31 20 2d 20 6e 32  .    c = n1 - n2
15a10 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63  ;.  }.  return c
15a20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
15a30 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66  e a new cursor f
15a40 6f 72 20 74 68 65 20 42 54 72 65 65 20 77 68 6f  or the BTree who
15a50 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68  se root is on th
15a60 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65  e page.** iTable
15a70 2e 20 20 54 68 65 20 61 63 74 20 6f 66 20 61 63  .  The act of ac
15a80 71 75 69 72 69 6e 67 20 61 20 63 75 72 73 6f 72  quiring a cursor
15a90 20 67 65 74 73 20 61 20 72 65 61 64 20 6c 6f 63   gets a read loc
15aa0 6b 20 6f 6e 20 0a 2a 2a 20 74 68 65 20 64 61 74  k on .** the dat
15ab0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
15ac0 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 30 2c 20  * If wrFlag==0, 
15ad0 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
15ae0 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65 64  can only be used
15af0 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 2a 2a   for reading..**
15b00 20 49 66 20 77 72 46 6c 61 67 3d 3d 31 2c 20 74   If wrFlag==1, t
15b10 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63  hen the cursor c
15b20 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 72  an be used for r
15b30 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a  eading or for.**
15b40 20 77 72 69 74 69 6e 67 20 69 66 20 6f 74 68 65   writing if othe
15b50 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72  r conditions for
15b60 20 77 72 69 74 69 6e 67 20 61 72 65 20 61 6c 73   writing are als
15b70 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 0a 2a 2a  o met.  These.**
15b80 20 61 72 65 20 74 68 65 20 63 6f 6e 64 69 74 69   are the conditi
15b90 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20 62 65  ons that must be
15ba0 20 6d 65 74 20 69 6e 20 6f 72 64 65 72 20 66 6f   met in order fo
15bb0 72 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20  r writing to.** 
15bc0 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a  be allowed:.**.*
15bd0 2a 20 31 3a 20 20 54 68 65 20 63 75 72 73 6f 72  * 1:  The cursor
15be0 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
15bf0 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c  opened with wrFl
15c00 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20  ag==1.**.** 2:  
15c10 4e 6f 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73  No other cursors
15c20 20 6d 61 79 20 62 65 20 6f 70 65 6e 20 77 69 74   may be open wit
15c30 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74  h wrFlag==0 on t
15c40 68 65 20 73 61 6d 65 20 74 61 62 6c 65 0a 2a 2a  he same table.**
15c50 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61  .** 3:  The data
15c60 62 61 73 65 20 6d 75 73 74 20 62 65 20 77 72 69  base must be wri
15c70 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65  table (not on re
15c80 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a  ad-only media).*
15c90 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d  *.** 4:  There m
15ca0 75 73 74 20 62 65 20 61 6e 20 61 63 74 69 76 65  ust be an active
15cb0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
15cc0 0a 2a 2a 20 43 6f 6e 64 69 74 69 6f 6e 20 32 20  .** Condition 2 
15cd0 77 61 72 72 61 6e 74 73 20 66 75 72 74 68 65 72  warrants further
15ce0 20 64 69 73 63 75 73 73 69 6f 6e 2e 20 20 49 66   discussion.  If
15cf0 20 61 6e 79 20 63 75 72 73 6f 72 20 69 73 20 6f   any cursor is o
15d00 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20 61 20 74 61  pened.** on a ta
15d10 62 6c 65 20 77 69 74 68 20 77 72 46 6c 61 67 3d  ble with wrFlag=
15d20 3d 30 2c 20 74 68 61 74 20 70 72 65 76 65 6e 74  =0, that prevent
15d30 73 20 61 6c 6c 20 6f 74 68 65 72 20 63 75 72 73  s all other curs
15d40 6f 72 73 20 66 72 6f 6d 0a 2a 2a 20 77 72 69 74  ors from.** writ
15d50 69 6e 67 20 74 6f 20 74 68 61 74 20 74 61 62 6c  ing to that tabl
15d60 65 2e 20 20 54 68 69 73 20 69 73 20 61 20 6b 69  e.  This is a ki
15d70 6e 64 20 6f 66 20 22 72 65 61 64 2d 6c 6f 63 6b  nd of "read-lock
15d80 22 2e 20 20 57 68 65 6e 20 61 20 63 75 72 73 6f  ".  When a curso
15d90 72 0a 2a 2a 20 69 73 20 6f 70 65 6e 65 64 20 77  r.** is opened w
15da0 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 69 74  ith wrFlag==0 it
15db0 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
15dc0 68 61 74 20 74 68 65 20 74 61 62 6c 65 20 77 69  hat the table wi
15dd0 6c 6c 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65  ll not.** change
15de0 20 61 73 20 6c 6f 6e 67 20 61 73 20 74 68 65 20   as long as the 
15df0 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 2e 20  cursor is open. 
15e00 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65   This allows the
15e10 20 63 75 72 73 6f 72 20 74 6f 0a 2a 2a 20 64 6f   cursor to.** do
15e20 20 61 20 73 65 71 75 65 6e 74 69 61 6c 20 73 63   a sequential sc
15e30 61 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  an of the table 
15e40 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
15e50 6f 20 77 6f 72 72 79 20 61 62 6f 75 74 0a 2a 2a  o worry about.**
15e60 20 65 6e 74 72 69 65 73 20 62 65 69 6e 67 20 69   entries being i
15e70 6e 73 65 72 74 65 64 20 6f 72 20 64 65 6c 65 74  nserted or delet
15e80 65 64 20 64 75 72 69 6e 67 20 74 68 65 20 73 63  ed during the sc
15e90 61 6e 2e 20 20 43 75 72 73 6f 72 73 20 73 68 6f  an.  Cursors sho
15ea0 75 6c 64 0a 2a 2a 20 62 65 20 6f 70 65 6e 65 64  uld.** be opened
15eb0 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20   with wrFlag==0 
15ec0 6f 6e 6c 79 20 69 66 20 74 68 69 73 20 72 65 61  only if this rea
15ed0 64 2d 6c 6f 63 6b 20 70 72 6f 70 65 72 74 79 20  d-lock property 
15ee0 69 73 20 6e 65 65 64 65 64 2e 0a 2a 2a 20 54 68  is needed..** Th
15ef0 61 74 20 69 73 20 74 6f 20 73 61 79 2c 20 63 75  at is to say, cu
15f00 72 73 6f 72 73 20 73 68 6f 75 6c 64 20 62 65 20  rsors should be 
15f10 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c  opened with wrFl
15f20 61 67 3d 3d 30 20 6f 6e 6c 79 20 69 66 20 74 68  ag==0 only if th
15f30 65 79 0a 2a 2a 20 69 6e 74 65 6e 64 20 74 6f 20  ey.** intend to 
15f40 75 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 42  use the sqlite3B
15f50 74 72 65 65 4e 65 78 74 28 29 20 73 79 73 74 65  treeNext() syste
15f60 6d 20 63 61 6c 6c 2e 20 20 41 6c 6c 20 6f 74 68  m call.  All oth
15f70 65 72 20 63 75 72 73 6f 72 73 0a 2a 2a 20 73 68  er cursors.** sh
15f80 6f 75 6c 64 20 62 65 20 6f 70 65 6e 65 64 20 77  ould be opened w
15f90 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 20 65 76  ith wrFlag==1 ev
15fa0 65 6e 20 69 66 20 74 68 65 79 20 6e 65 76 65 72  en if they never
15fb0 20 72 65 61 6c 6c 79 20 69 6e 74 65 6e 64 0a 2a   really intend.*
15fc0 2a 20 74 6f 20 77 72 69 74 65 2e 0a 2a 2a 20 0a  * to write..** .
15fd0 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69  ** No checking i
15fe0 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73  s done to make s
15ff0 75 72 65 20 74 68 61 74 20 70 61 67 65 20 69 54  ure that page iT
16000 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74  able really is t
16010 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20  he.** root page 
16020 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49 66  of a b-tree.  If
16030 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e   it is not, then
16040 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 71 75   the cursor acqu
16050 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  ired.** will not
16060 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e   work correctly.
16070 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6d 70 61  .**.** The compa
16080 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6d  rison function m
16090 75 73 74 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79  ust be logically
160a0 20 74 68 65 20 73 61 6d 65 20 66 6f 72 20 65 76   the same for ev
160b0 65 72 79 20 63 75 72 73 6f 72 0a 2a 2a 20 6f 6e  ery cursor.** on
160c0 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 74 61   a particular ta
160d0 62 6c 65 2e 20 20 43 68 61 6e 67 69 6e 67 20 74  ble.  Changing t
160e0 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  he comparison fu
160f0 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75  nction will resu
16100 6c 74 0a 2a 2a 20 69 6e 20 69 6e 63 6f 72 72 65  lt.** in incorre
16110 63 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20  ct operations.  
16120 49 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  If the compariso
16130 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 4e 55  n function is NU
16140 4c 4c 2c 20 61 0a 2a 2a 20 64 65 66 61 75 6c 74  LL, a.** default
16150 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
16160 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 20 20 54  tion is used.  T
16170 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  he comparison fu
16180 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 61 6c 77  nction is.** alw
16190 61 79 73 20 69 67 6e 6f 72 65 64 20 66 6f 72 20  ays ignored for 
161a0 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2e 0a 2a  INTKEY tables..*
161b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
161c0 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65  eeCursor(.  Btre
161d0 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
161e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
16200 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54  tree */.  int iT
16210 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
16220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16230 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
16240 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f  ge of table to o
16250 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46  pen */.  int wrF
16260 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  lag,            
16270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16280 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69       /* 1 to wri
16290 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20  te. 0 read-only 
162a0 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43 6d 70 29  */.  int (*xCmp)
162b0 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74  (void*,int,const
162c0 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74   void*,int,const
162d0 20 76 6f 69 64 2a 29 2c 20 2f 2a 20 4b 65 79 20   void*), /* Key 
162e0 43 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 20  Comparison func 
162f0 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 2c  */.  void *pArg,
16300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16320 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f   /* First arg to
16330 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20   xCompare() */. 
16340 20 42 74 43 75 72 73 6f 72 20 2a 2a 70 70 43 75   BtCursor **ppCu
16350 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
16360 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16370 57 72 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72  Write new cursor
16380 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
16390 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f 72  t rc;.  BtCursor
163a0 20 2a 70 43 75 72 3b 0a 20 20 42 74 53 68 61 72   *pCur;.  BtShar
163b0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
163c0 3b 0a 0a 20 20 2a 70 70 43 75 72 20 3d 20 30 3b  ;..  *ppCur = 0;
163d0 0a 20 20 69 66 28 20 77 72 46 6c 61 67 20 29 7b  .  if( wrFlag ){
163e0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 72 65  .    if( pBt->re
163f0 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  adOnly ){.      
16400 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
16410 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20  ADONLY;.    }.  
16420 20 20 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c    if( checkReadL
16430 6f 63 6b 73 28 70 2c 20 69 54 61 62 6c 65 2c 20  ocks(p, iTable, 
16440 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  0) ){.      retu
16450 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
16460 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
16470 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d  f( pBt->pPage1==
16480 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6c 6f  0 ){.    rc = lo
16490 63 6b 42 74 72 65 65 57 69 74 68 52 65 74 72 79  ckBtreeWithRetry
164a0 28 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  (p);.    if( rc!
164b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
164c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
164d0 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72 20     }.  }.  pCur 
164e0 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
164f0 73 69 7a 65 6f 66 28 2a 70 43 75 72 29 20 29 3b  sizeof(*pCur) );
16500 0a 20 20 69 66 28 20 70 43 75 72 3d 3d 30 20 29  .  if( pCur==0 )
16510 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
16520 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
16530 6f 20 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f  o create_cursor_
16540 65 78 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20  exception;.  }. 
16550 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20   pCur->pgnoRoot 
16560 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a  = (Pgno)iTable;.
16570 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31 20    if( iTable==1 
16580 26 26 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  && sqlite3pager_
16590 70 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  pagecount(pBt->p
165a0 50 61 67 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20  Pager)==0 ){.   
165b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 4d 50   rc = SQLITE_EMP
165c0 54 59 3b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65  TY;.    goto cre
165d0 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70  ate_cursor_excep
165e0 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  tion;.  }.  rc =
165f0 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
16600 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
16610 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 70 50 61 67  oot, &pCur->pPag
16620 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  e, 0);.  if( rc!
16630 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16640 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 63 75    goto create_cu
16650 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a  rsor_exception;.
16660 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68    }..  /* Now th
16670 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f  at no other erro
16680 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69  rs can occur, fi
16690 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20  nish filling in 
166a0 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a  the BtCursor.  *
166b0 2a 20 76 61 72 69 61 62 6c 65 73 2c 20 6c 69 6e  * variables, lin
166c0 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74  k the cursor int
166d0 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6c  o the BtShared l
166e0 69 73 74 20 61 6e 64 20 73 65 74 20 2a 70 70 43  ist and set *ppC
166f0 75 72 20 28 74 68 65 0a 20 20 2a 2a 20 6f 75 74  ur (the.  ** out
16700 70 75 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  put argument to 
16710 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 29 2e 0a  this function)..
16720 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 78 43 6f    */.  pCur->xCo
16730 6d 70 61 72 65 20 3d 20 78 43 6d 70 20 3f 20 78  mpare = xCmp ? x
16740 43 6d 70 20 3a 20 64 66 6c 74 43 6f 6d 70 61 72  Cmp : dfltCompar
16750 65 3b 0a 20 20 70 43 75 72 2d 3e 70 41 72 67 20  e;.  pCur->pArg 
16760 3d 20 70 41 72 67 3b 0a 20 20 70 43 75 72 2d 3e  = pArg;.  pCur->
16770 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 43  pBtree = p;.  pC
16780 75 72 2d 3e 77 72 46 6c 61 67 20 3d 20 77 72 46  ur->wrFlag = wrF
16790 6c 61 67 3b 0a 20 20 70 43 75 72 2d 3e 70 4e 65  lag;.  pCur->pNe
167a0 78 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f  xt = pBt->pCurso
167b0 72 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70  r;.  if( pCur->p
167c0 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 43 75 72  Next ){.    pCur
167d0 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
167e0 20 70 43 75 72 3b 0a 20 20 7d 0a 20 20 70 42 74   pCur;.  }.  pBt
167f0 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72  ->pCursor = pCur
16800 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65  ;.  pCur->eState
16810 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
16820 44 3b 0a 20 20 2a 70 70 43 75 72 20 3d 20 70 43  D;.  *ppCur = pC
16830 75 72 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  ur;..  return SQ
16840 4c 49 54 45 5f 4f 4b 3b 0a 63 72 65 61 74 65 5f  LITE_OK;.create_
16850 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e  cursor_exception
16860 3a 0a 20 20 69 66 28 20 70 43 75 72 20 29 7b 0a  :.  if( pCur ){.
16870 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
16880 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20  pCur->pPage);.  
16890 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 75    sqliteFree(pCu
168a0 72 29 3b 0a 20 20 7d 0a 20 20 75 6e 6c 6f 63 6b  r);.  }.  unlock
168b0 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
168c0 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  t);.  return rc;
168d0 0a 7d 0a 0a 23 69 66 20 30 20 20 2f 2a 20 4e 6f  .}..#if 0  /* No
168e0 74 20 55 73 65 64 20 2a 2f 0a 2f 2a 0a 2a 2a 20  t Used */./*.** 
168f0 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
16900 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
16910 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 64  on function used
16920 20 62 79 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f   by a cursor..*/
16930 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
16940 65 65 53 65 74 43 6f 6d 70 61 72 65 28 0a 20 20  eeSetCompare(.  
16950 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
16960 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
16970 72 20 74 6f 20 77 68 6f 73 65 20 63 6f 6d 70 61  r to whose compa
16980 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69  rison function i
16990 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 69  s changed */.  i
169a0 6e 74 28 2a 78 43 6d 70 29 28 76 6f 69 64 2a 2c  nt(*xCmp)(void*,
169b0 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c  int,const void*,
169c0 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29  int,const void*)
169d0 2c 20 2f 2a 20 4e 65 77 20 63 6f 6d 70 61 72 69  , /* New compari
169e0 73 6f 6e 20 66 75 6e 63 20 2a 2f 0a 20 20 76 6f  son func */.  vo
169f0 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20  id *pArg        
16a00 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d    /* First argum
16a10 65 6e 74 20 74 6f 20 78 43 6d 70 28 29 20 2a 2f  ent to xCmp() */
16a20 0a 29 7b 0a 20 20 70 43 75 72 2d 3e 78 43 6f 6d  .){.  pCur->xCom
16a30 70 61 72 65 20 3d 20 78 43 6d 70 20 3f 20 78 43  pare = xCmp ? xC
16a40 6d 70 20 3a 20 64 66 6c 74 43 6f 6d 70 61 72 65  mp : dfltCompare
16a50 3b 0a 20 20 70 43 75 72 2d 3e 70 41 72 67 20 3d  ;.  pCur->pArg =
16a60 20 70 41 72 67 3b 0a 7d 0a 23 65 6e 64 69 66 0a   pArg;.}.#endif.
16a70 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63  ./*.** Close a c
16a80 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64  ursor.  The read
16a90 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
16aa0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 72 65  abase file is re
16ab0 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74  leased.** when t
16ac0 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69  he last cursor i
16ad0 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74  s closed..*/.int
16ae0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
16af0 73 65 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  seCursor(BtCurso
16b00 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 53 68  r *pCur){.  BtSh
16b10 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
16b20 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20  ->pBtree->pBt;. 
16b30 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43   restoreOrClearC
16b40 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
16b50 75 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 43  ur, 0);.  if( pC
16b60 75 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20  ur->pPrev ){.   
16b70 20 70 43 75 72 2d 3e 70 50 72 65 76 2d 3e 70 4e   pCur->pPrev->pN
16b80 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  ext = pCur->pNex
16b90 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
16ba0 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70  pBt->pCursor = p
16bb0 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  Cur->pNext;.  }.
16bc0 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78    if( pCur->pNex
16bd0 74 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70  t ){.    pCur->p
16be0 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43  Next->pPrev = pC
16bf0 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20  ur->pPrev;.  }. 
16c00 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
16c10 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 75 6e 6c  r->pPage);.  unl
16c20 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
16c30 28 70 42 74 29 3b 0a 20 20 73 71 6c 69 74 65 46  (pBt);.  sqliteF
16c40 72 65 65 28 70 43 75 72 29 3b 0a 20 20 72 65 74  ree(pCur);.  ret
16c50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
16c60 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 74  ../*.** Make a t
16c70 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20  emporary cursor 
16c80 62 79 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68  by filling in th
16c90 65 20 66 69 65 6c 64 73 20 6f 66 20 70 54 65 6d  e fields of pTem
16ca0 70 43 75 72 2e 0a 2a 2a 20 54 68 65 20 74 65 6d  pCur..** The tem
16cb0 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20 69 73  porary cursor is
16cc0 20 6e 6f 74 20 6f 6e 20 74 68 65 20 63 75 72 73   not on the curs
16cd0 6f 72 20 6c 69 73 74 20 66 6f 72 20 74 68 65 20  or list for the 
16ce0 42 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  Btree..*/.static
16cf0 20 76 6f 69 64 20 67 65 74 54 65 6d 70 43 75 72   void getTempCur
16d00 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43  sor(BtCursor *pC
16d10 75 72 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 54  ur, BtCursor *pT
16d20 65 6d 70 43 75 72 29 7b 0a 20 20 6d 65 6d 63 70  empCur){.  memcp
16d30 79 28 70 54 65 6d 70 43 75 72 2c 20 70 43 75 72  y(pTempCur, pCur
16d40 2c 20 73 69 7a 65 6f 66 28 2a 70 43 75 72 29 29  , sizeof(*pCur))
16d50 3b 0a 20 20 70 54 65 6d 70 43 75 72 2d 3e 70 4e  ;.  pTempCur->pN
16d60 65 78 74 20 3d 20 30 3b 0a 20 20 70 54 65 6d 70  ext = 0;.  pTemp
16d70 43 75 72 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a  Cur->pPrev = 0;.
16d80 20 20 69 66 28 20 70 54 65 6d 70 43 75 72 2d 3e    if( pTempCur->
16d90 70 50 61 67 65 20 29 7b 0a 20 20 20 20 73 71 6c  pPage ){.    sql
16da0 69 74 65 33 70 61 67 65 72 5f 72 65 66 28 70 54  ite3pager_ref(pT
16db0 65 6d 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61  empCur->pPage->a
16dc0 44 61 74 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Data);.  }.}../*
16dd0 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 74 65 6d  .** Delete a tem
16de0 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20 73 75  porary cursor su
16df0 63 68 20 61 73 20 77 61 73 20 6d 61 64 65 20 62  ch as was made b
16e00 79 20 74 68 65 20 43 72 65 61 74 65 54 65 6d 70  y the CreateTemp
16e10 6f 72 61 72 79 43 75 72 73 6f 72 28 29 0a 2a 2a  oraryCursor().**
16e20 20 66 75 6e 63 74 69 6f 6e 20 61 62 6f 76 65 2e   function above.
16e30 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
16e40 72 65 6c 65 61 73 65 54 65 6d 70 43 75 72 73 6f  releaseTempCurso
16e50 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  r(BtCursor *pCur
16e60 29 7b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70  ){.  if( pCur->p
16e70 50 61 67 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Page ){.    sqli
16e80 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70  te3pager_unref(p
16e90 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61 44 61 74  Cur->pPage->aDat
16ea0 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  a);.  }.}../*.**
16eb0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 42   Make sure the B
16ec0 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 66 69 65  tCursor.info fie
16ed0 6c 64 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  ld of the given 
16ee0 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e  cursor is valid.
16ef0 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74  .** If it is not
16f00 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20   already valid, 
16f10 63 61 6c 6c 20 70 61 72 73 65 43 65 6c 6c 28 29  call parseCell()
16f20 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a   to fill it in..
16f30 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69  **.** BtCursor.i
16f40 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f  nfo is a cache o
16f50 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  f the informatio
16f60 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  n in the current
16f70 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20   cell..** Using 
16f80 74 68 69 73 20 63 61 63 68 65 20 72 65 64 75 63  this cache reduc
16f90 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  es the number of
16fa0 20 63 61 6c 6c 73 20 74 6f 20 70 61 72 73 65 43   calls to parseC
16fb0 65 6c 6c 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ell()..*/.static
16fc0 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e 66   void getCellInf
16fd0 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  o(BtCursor *pCur
16fe0 29 7b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  ){.  if( pCur->i
16ff0 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a  nfo.nSize==0 ){.
17000 20 20 20 20 70 61 72 73 65 43 65 6c 6c 28 70 43      parseCell(pC
17010 75 72 2d 3e 70 50 61 67 65 2c 20 70 43 75 72 2d  ur->pPage, pCur-
17020 3e 69 64 78 2c 20 26 70 43 75 72 2d 3e 69 6e 66  >idx, &pCur->inf
17030 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66  o);.  }else{.#if
17040 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20  ndef NDEBUG.    
17050 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
17060 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c     memset(&info,
17070 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29   0, sizeof(info)
17080 29 3b 0a 20 20 20 20 70 61 72 73 65 43 65 6c 6c  );.    parseCell
17090 28 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 70 43  (pCur->pPage, pC
170a0 75 72 2d 3e 69 64 78 2c 20 26 69 6e 66 6f 29 3b  ur->idx, &info);
170b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d  .    assert( mem
170c0 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72  cmp(&info, &pCur
170d0 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69  ->info, sizeof(i
170e0 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64  nfo))==0 );.#end
170f0 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  if.  }.}../*.** 
17100 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68  Set *pSize to th
17110 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75  e size of the bu
17120 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f 20 68  ffer needed to h
17130 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  old the value of
17140 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f 72 20  .** the key for 
17150 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
17160 79 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  y.  If the curso
17170 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e  r is not pointin
17180 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64 20  g.** to a valid 
17190 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20 69 73  entry, *pSize is
171a0 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a   set to 0. .**.*
171b0 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20 77 69  * For a table wi
171c0 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20 66 6c  th the INTKEY fl
171d0 61 67 20 73 65 74 2c 20 74 68 69 73 20 72 6f 75  ag set, this rou
171e0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
171f0 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20   key.** itself, 
17200 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  not the number o
17210 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6b  f bytes in the k
17220 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ey..*/.int sqlit
17230 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 42  e3BtreeKeySize(B
17240 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
17250 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e  64 *pSize){.  in
17260 74 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72  t rc = restoreOr
17270 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  ClearCursorPosit
17280 69 6f 6e 28 70 43 75 72 2c 20 31 29 3b 0a 20 20  ion(pCur, 1);.  
17290 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
172a0 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
172b0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
172c0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c  URSOR_INVALID ||
172d0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
172e0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
172f0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
17300 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
17310 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 2a 70 53  LID ){.      *pS
17320 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ize = 0;.    }el
17330 73 65 7b 0a 20 20 20 20 20 20 67 65 74 43 65 6c  se{.      getCel
17340 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20  lInfo(pCur);.   
17350 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72     *pSize = pCur
17360 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20  ->info.nKey;.   
17370 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
17380 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  rc;.}../*.** Set
17390 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 6e   *pSize to the n
173a0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
173b0 66 20 64 61 74 61 20 69 6e 20 74 68 65 20 65 6e  f data in the en
173c0 74 72 79 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f  try the.** curso
173d0 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
173e0 74 73 20 74 6f 2e 20 20 41 6c 77 61 79 73 20 72  ts to.  Always r
173f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
17400 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69 73 20 6e  .** Failure is n
17410 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20 20 49 66  ot possible.  If
17420 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   the cursor is n
17430 6f 74 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  ot currently.** 
17440 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 20 65  pointing to an e
17450 6e 74 72 79 20 28 77 68 69 63 68 20 63 61 6e 20  ntry (which can 
17460 68 61 70 70 65 6e 2c 20 66 6f 72 20 65 78 61 6d  happen, for exam
17470 70 6c 65 2c 20 69 66 0a 2a 2a 20 74 68 65 20 64  ple, if.** the d
17480 61 74 61 62 61 73 65 20 69 73 20 65 6d 70 74 79  atabase is empty
17490 29 20 74 68 65 6e 20 2a 70 53 69 7a 65 20 69 73  ) then *pSize is
174a0 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 69 6e   set to 0..*/.in
174b0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61  t sqlite3BtreeDa
174c0 74 61 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20  taSize(BtCursor 
174d0 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 53 69 7a  *pCur, u32 *pSiz
174e0 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 72  e){.  int rc = r
174f0 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72  estoreOrClearCur
17500 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
17510 2c 20 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 1);.  if( rc==
17520 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17530 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
17540 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
17550 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
17560 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
17570 4c 49 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70  LID );.    if( p
17580 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
17590 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
175a0 20 20 20 20 20 2f 2a 20 4e 6f 74 20 70 6f 69 6e       /* Not poin
175b0 74 69 6e 67 20 61 74 20 61 20 76 61 6c 69 64 20  ting at a valid 
175c0 65 6e 74 72 79 20 2d 20 73 65 74 20 2a 70 53 69  entry - set *pSi
175d0 7a 65 20 74 6f 20 30 2e 20 2a 2f 0a 20 20 20 20  ze to 0. */.    
175e0 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20    *pSize = 0;.  
175f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67    }else{.      g
17600 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
17610 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d  ;.      *pSize =
17620 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74   pCur->info.nDat
17630 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  a;.    }.  }.  r
17640 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17650 2a 2a 20 52 65 61 64 20 70 61 79 6c 6f 61 64 20  ** Read payload 
17660 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
17670 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
17680 74 68 65 20 70 43 75 72 20 63 75 72 73 6f 72 20  the pCur cursor 
17690 69 73 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74  is.** pointing t
176a0 6f 2e 20 20 42 65 67 69 6e 20 72 65 61 64 69 6e  o.  Begin readin
176b0 67 20 74 68 65 20 70 61 79 6c 6f 61 64 20 61 74  g the payload at
176c0 20 22 6f 66 66 73 65 74 22 20 61 6e 64 20 72 65   "offset" and re
176d0 61 64 0a 2a 2a 20 61 20 74 6f 74 61 6c 20 6f 66  ad.** a total of
176e0 20 22 61 6d 74 22 20 62 79 74 65 73 2e 20 20 50   "amt" bytes.  P
176f0 75 74 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e  ut the result in
17700 20 7a 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   zBuf..**.** Thi
17710 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e  s routine does n
17720 6f 74 20 6d 61 6b 65 20 61 20 64 69 73 74 69 6e  ot make a distin
17730 63 74 69 6f 6e 20 62 65 74 77 65 65 6e 20 6b 65  ction between ke
17740 79 20 61 6e 64 20 64 61 74 61 2e 0a 2a 2a 20 49  y and data..** I
17750 74 20 6a 75 73 74 20 72 65 61 64 73 20 62 79 74  t just reads byt
17760 65 73 20 66 72 6f 6d 20 74 68 65 20 70 61 79 6c  es from the payl
17770 6f 61 64 20 61 72 65 61 2e 20 20 44 61 74 61 20  oad area.  Data 
17780 6d 69 67 68 74 20 61 70 70 65 61 72 0a 2a 2a 20  might appear.** 
17790 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65  on the main page
177a0 20 6f 72 20 62 65 20 73 63 61 74 74 65 72 65 64   or be scattered
177b0 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65   out on multiple
177c0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
177d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
177e0 65 74 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43  etPayload(.  BtC
177f0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
17800 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e    /* Cursor poin
17810 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f  ting to entry to
17820 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
17830 69 6e 74 20 6f 66 66 73 65 74 2c 20 20 20 20 20  int offset,     
17840 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65       /* Begin re
17850 61 64 69 6e 67 20 74 68 69 73 20 66 61 72 20 69  ading this far i
17860 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20  nto payload */. 
17870 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20   int amt,       
17880 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68        /* Read th
17890 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f  is many bytes */
178a0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
178b0 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65   *pBuf, /* Write
178c0 20 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20   the bytes into 
178d0 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a  this buffer */ .
178e0 20 20 69 6e 74 20 73 6b 69 70 4b 65 79 20 20 20    int skipKey   
178f0 20 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65 74         /* offset
17900 20 62 65 67 69 6e 73 20 61 74 20 64 61 74 61 20   begins at data 
17910 69 66 20 74 68 69 73 20 69 73 20 74 72 75 65 20  if this is true 
17920 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
17930 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b   char *aPayload;
17940 0a 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65  .  Pgno nextPage
17950 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  ;.  int rc;.  Me
17960 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
17970 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 0a 20  BtShared *pBt;. 
17980 20 69 6e 74 20 6f 76 66 6c 53 69 7a 65 3b 0a 20   int ovflSize;. 
17990 20 75 33 32 20 6e 4b 65 79 3b 0a 0a 20 20 61 73   u32 nKey;..  as
179a0 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 26 26  sert( pCur!=0 &&
179b0 20 70 43 75 72 2d 3e 70 50 61 67 65 21 3d 30 20   pCur->pPage!=0 
179c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
179d0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
179e0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70 42 74  R_VALID );.  pBt
179f0 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d   = pCur->pBtree-
17a00 3e 70 42 74 3b 0a 20 20 70 50 61 67 65 20 3d 20  >pBt;.  pPage = 
17a10 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61  pCur->pPage;.  a
17a20 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78  ssert( pCur->idx
17a30 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78  >=0 && pCur->idx
17a40 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
17a50 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  .  getCellInfo(p
17a60 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64  Cur);.  aPayload
17a70 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43   = pCur->info.pC
17a80 65 6c 6c 20 2b 20 70 43 75 72 2d 3e 69 6e 66 6f  ell + pCur->info
17a90 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69 66 28 20  .nHeader;.  if( 
17aa0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
17ab0 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a 20  .    nKey = 0;. 
17ac0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65 79   }else{.    nKey
17ad0 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b   = pCur->info.nK
17ae0 65 79 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ey;.  }.  assert
17af0 28 20 6f 66 66 73 65 74 3e 3d 30 20 29 3b 0a 20  ( offset>=0 );. 
17b00 20 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a   if( skipKey ){.
17b10 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 4b      offset += nK
17b20 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 66  ey;.  }.  if( of
17b30 66 73 65 74 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b  fset+amt > nKey+
17b40 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61  pCur->info.nData
17b50 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
17b60 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
17b70 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43  .  if( offset<pC
17b80 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
17b90 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61  ){.    int a = a
17ba0 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66  mt;.    if( a+of
17bb0 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e  fset>pCur->info.
17bc0 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  nLocal ){.      
17bd0 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  a = pCur->info.n
17be0 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a  Local - offset;.
17bf0 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79      }.    memcpy
17c00 28 70 42 75 66 2c 20 26 61 50 61 79 6c 6f 61 64  (pBuf, &aPayload
17c10 5b 6f 66 66 73 65 74 5d 2c 20 61 29 3b 0a 20 20  [offset], a);.  
17c20 20 20 69 66 28 20 61 3d 3d 61 6d 74 20 29 7b 0a    if( a==amt ){.
17c30 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
17c40 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
17c50 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20    offset = 0;.  
17c60 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20    pBuf += a;.   
17c70 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c   amt -= a;.  }el
17c80 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d  se{.    offset -
17c90 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
17ca0 63 61 6c 3b 0a 20 20 7d 0a 20 20 6f 76 66 6c 53  cal;.  }.  ovflS
17cb0 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
17cc0 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 69 66 28  eSize - 4;.  if(
17cd0 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 6e 65   amt>0 ){.    ne
17ce0 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
17cf0 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72  e(&aPayload[pCur
17d00 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b  ->info.nLocal]);
17d10 0a 20 20 20 20 77 68 69 6c 65 28 20 61 6d 74 3e  .    while( amt>
17d20 30 20 26 26 20 6e 65 78 74 50 61 67 65 20 29 7b  0 && nextPage ){
17d30 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
17d40 74 65 33 70 61 67 65 72 5f 67 65 74 28 70 42 74  te3pager_get(pBt
17d50 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61  ->pPager, nextPa
17d60 67 65 2c 20 28 76 6f 69 64 2a 2a 29 26 61 50 61  ge, (void**)&aPa
17d70 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 69 66  yload);.      if
17d80 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
17d90 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
17da0 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65 78 74      }.      next
17db0 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
17dc0 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20  aPayload);.     
17dd0 20 69 66 28 20 6f 66 66 73 65 74 3c 6f 76 66 6c   if( offset<ovfl
17de0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
17df0 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20  int a = amt;.   
17e00 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66       if( a + off
17e10 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29  set > ovflSize )
17e20 7b 0a 20 20 20 20 20 20 20 20 20 20 61 20 3d 20  {.          a = 
17e30 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65  ovflSize - offse
17e40 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
17e50 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66       memcpy(pBuf
17e60 2c 20 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73  , &aPayload[offs
17e70 65 74 2b 34 5d 2c 20 61 29 3b 0a 20 20 20 20 20  et+4], a);.     
17e80 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20     offset = 0;. 
17e90 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b         amt -= a;
17ea0 0a 20 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d  .        pBuf +=
17eb0 20 61 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   a;.      }else{
17ec0 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20  .        offset 
17ed0 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20  -= ovflSize;.   
17ee0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
17ef0 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 61 50  e3pager_unref(aP
17f00 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 7d 0a 20  ayload);.    }. 
17f10 20 7d 0a 0a 20 20 69 66 28 20 61 6d 74 3e 30 20   }..  if( amt>0 
17f20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
17f30 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
17f40 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  T;.  }.  return 
17f50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
17f60 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66  .** Read part of
17f70 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63 69 61   the key associa
17f80 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20  ted with cursor 
17f90 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a  pCur.  Exactly.*
17fa0 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69  * "amt" bytes wi
17fb0 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64  ll be transfered
17fc0 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54   into pBuf[].  T
17fd0 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62  he transfer.** b
17fe0 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74  egins at "offset
17ff0 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  "..**.** Return 
18000 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
18010 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72  cess or an error
18020 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e   code if anythin
18030 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
18040 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65    An error is re
18050 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65  turned if "offse
18060 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72  t+amt" is larger
18070 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61   than.** the ava
18080 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a  ilable payload..
18090 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
180a0 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72 20  reeKey(BtCursor 
180b0 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65  *pCur, u32 offse
180c0 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
180d0 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72   *pBuf){.  int r
180e0 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65  c = restoreOrCle
180f0 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  arCursorPosition
18100 28 70 43 75 72 2c 20 31 29 3b 0a 20 20 69 66 28  (pCur, 1);.  if(
18110 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
18120 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
18130 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
18140 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
18150 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
18160 61 67 65 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  age!=0 );.    if
18170 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69  ( pCur->pPage->i
18180 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72  ntKey ){.      r
18190 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
181a0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
181b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
181c0 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  r->pPage->intKey
181d0 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
181e0 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20  t( pCur->idx>=0 
181f0 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 43 75  && pCur->idx<pCu
18200 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  r->pPage->nCell 
18210 29 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 50  );.    rc = getP
18220 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66  ayload(pCur, off
18230 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67  set, amt, (unsig
18240 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20  ned char*)pBuf, 
18250 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
18260 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
18270 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  ad part of the d
18280 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77  ata associated w
18290 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e  ith cursor pCur.
182a0 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d    Exactly.** "am
182b0 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65  t" bytes will be
182c0 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f   transfered into
182d0 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72   pBuf[].  The tr
182e0 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73  ansfer.** begins
182f0 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a   at "offset"..**
18300 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
18310 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
18320 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
18330 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
18340 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20  s.** wrong.  An 
18350 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
18360 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74  d if "offset+amt
18370 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  " is larger than
18380 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c  .** the availabl
18390 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e  e payload..*/.in
183a0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61  t sqlite3BtreeDa
183b0 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ta(BtCursor *pCu
183c0 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75  r, u32 offset, u
183d0 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42  32 amt, void *pB
183e0 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  uf){.  int rc = 
183f0 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75  restoreOrClearCu
18400 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
18410 72 2c 20 31 29 3b 0a 20 20 69 66 28 20 72 63 3d  r, 1);.  if( rc=
18420 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18430 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
18440 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
18450 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65  ALID );.    asse
18460 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 21  rt( pCur->pPage!
18470 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
18480 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26  ( pCur->idx>=0 &
18490 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 43 75 72  & pCur->idx<pCur
184a0 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ->pPage->nCell )
184b0 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 50 61  ;.    rc = getPa
184c0 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
184d0 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 31  et, amt, pBuf, 1
184e0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
184f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
18500 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
18510 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
18520 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e  tion from the en
18530 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  try that the .**
18540 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20   pCur cursor is 
18550 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68  pointing to.  Th
18560 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20  e pointer is to 
18570 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
18580 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20 73  .** the key if s
18590 6b 69 70 4b 65 79 3d 3d 30 20 61 6e 64 20 69 74  kipKey==0 and it
185a0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 62   points to the b
185b0 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61  eginning of data
185c0 20 69 66 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d   if.** skipKey==
185d0 31 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  1.  The number o
185e0 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c  f bytes of avail
185f0 61 62 6c 65 20 6b 65 79 2f 64 61 74 61 20 69 73  able key/data is
18600 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
18610 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d   *pAmt.  If *pAm
18620 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76  t==0, then the v
18630 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 77 69  alue returned wi
18640 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 20 76  ll not be.** a v
18650 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  alid pointer..**
18660 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
18670 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
18680 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d  ion.  It is comm
18690 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72  on for the entir
186a0 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74  e key.** and dat
186b0 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20  a to fit on the 
186c0 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66  local page and f
186d0 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e  or there to be n
186e0 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61  o overflow.** pa
186f0 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20  ges.  When that 
18700 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74  is so, this rout
18710 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64 20  ine can be used 
18720 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a  to access the.**
18730 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77 69   key and data wi
18740 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63  thout making a c
18750 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79  opy.  If the key
18760 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69   and/or data spi
18770 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72  lls.** onto over
18780 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e  flow pages, then
18790 20 67 65 74 50 61 79 6c 6f 61 64 28 29 20 6d 75   getPayload() mu
187a0 73 74 20 62 65 20 75 73 65 64 20 74 6f 20 72 65  st be used to re
187b0 61 73 73 65 6d 62 6c 79 0a 2a 2a 20 74 68 65 20  assembly.** the 
187c0 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70  key/data and cop
187d0 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61  y it into a prea
187e0 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e  llocated buffer.
187f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74  .**.** The point
18800 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  er returned by t
18810 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b  his routine look
18820 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20  s directly into 
18830 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61  the cached.** pa
18840 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
18850 73 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69  se.  The data mi
18860 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f  ght change or mo
18870 76 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  ve the next time
18880 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f  .** any btree ro
18890 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
188a0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
188b0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
188c0 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20  fetchPayload(.  
188d0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
188e0 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70       /* Cursor p
188f0 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79  ointing to entry
18900 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
18910 0a 20 20 69 6e 74 20 2a 70 41 6d 74 2c 20 20 20  .  int *pAmt,   
18920 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
18930 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
18940 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68  vailable bytes h
18950 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6b 69  ere */.  int ski
18960 70 4b 65 79 20 20 20 20 20 20 20 20 20 20 2f 2a  pKey          /*
18970 20 72 65 61 64 20 62 65 67 69 6e 6e 69 6e 67 20   read beginning 
18980 61 74 20 64 61 74 61 20 69 66 20 74 68 69 73 20  at data if this 
18990 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  is true */.){.  
189a0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
189b0 50 61 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50 61  Payload;.  MemPa
189c0 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 75 33 32  ge *pPage;.  u32
189d0 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4c 6f   nKey;.  int nLo
189e0 63 61 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  cal;..  assert( 
189f0 70 43 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d  pCur!=0 && pCur-
18a00 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61  >pPage!=0 );.  a
18a10 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
18a20 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
18a30 44 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70  D );.  pPage = p
18a40 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73  Cur->pPage;.  as
18a50 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e  sert( pCur->idx>
18a60 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c  =0 && pCur->idx<
18a70 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
18a80 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
18a90 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20  ur);.  aPayload 
18aa0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65  = pCur->info.pCe
18ab0 6c 6c 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 2b  ll;.  aPayload +
18ac0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65  = pCur->info.nHe
18ad0 61 64 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67  ader;.  if( pPag
18ae0 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
18af0 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65 6c   nKey = 0;.  }el
18b00 73 65 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 70  se{.    nKey = p
18b10 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
18b20 20 20 7d 0a 20 20 69 66 28 20 73 6b 69 70 4b 65    }.  if( skipKe
18b30 79 20 29 7b 0a 20 20 20 20 61 50 61 79 6c 6f 61  y ){.    aPayloa
18b40 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 6e  d += nKey;.    n
18b50 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e  Local = pCur->in
18b60 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65 79  fo.nLocal - nKey
18b70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
18b80 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e  Local = pCur->in
18b90 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 69  fo.nLocal;.    i
18ba0 66 28 20 6e 4c 6f 63 61 6c 3e 6e 4b 65 79 20 29  f( nLocal>nKey )
18bb0 7b 0a 20 20 20 20 20 20 6e 4c 6f 63 61 6c 20 3d  {.      nLocal =
18bc0 20 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d   nKey;.    }.  }
18bd0 0a 20 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63 61  .  *pAmt = nLoca
18be0 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 50 61 79  l;.  return aPay
18bf0 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  load;.}.../*.** 
18c00 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68  For the entry th
18c10 61 74 20 63 75 72 73 6f 72 20 70 43 75 72 20 69  at cursor pCur i
18c20 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75  s point to, retu
18c30 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79  rn as.** many by
18c40 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f  tes of the key o
18c50 72 20 64 61 74 61 20 61 73 20 61 72 65 20 61 76  r data as are av
18c60 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c  ailable on the l
18c70 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70  ocal.** b-tree p
18c80 61 67 65 2e 20 20 57 72 69 74 65 20 74 68 65 20  age.  Write the 
18c90 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61  number of availa
18ca0 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a  ble bytes into *
18cb0 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  pAmt..**.** The 
18cc0 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
18cd0 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20   is ephemeral.  
18ce0 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79  The key/data may
18cf0 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64   move.** or be d
18d00 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20  estroyed on the 
18d10 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79  next call to any
18d20 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2e 0a   Btree routine..
18d30 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74  **.** These rout
18d40 69 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f 20  ines is used to 
18d50 67 65 74 20 71 75 69 63 6b 20 61 63 63 65 73 73  get quick access
18d60 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61   to key and data
18d70 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f  .** in the commo
18d80 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20  n case where no 
18d90 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
18da0 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73  re used..*/.cons
18db0 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42  t void *sqlite3B
18dc0 74 72 65 65 4b 65 79 46 65 74 63 68 28 42 74 43  treeKeyFetch(BtC
18dd0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
18de0 20 2a 70 41 6d 74 29 7b 0a 20 20 69 66 28 20 70   *pAmt){.  if( p
18df0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
18e00 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
18e10 20 72 65 74 75 72 6e 20 28 63 6f 6e 73 74 20 76   return (const v
18e20 6f 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61  oid*)fetchPayloa
18e30 64 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 30 29  d(pCur, pAmt, 0)
18e40 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
18e50 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ;.}.const void *
18e60 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61  sqlite3BtreeData
18e70 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a  Fetch(BtCursor *
18e80 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29  pCur, int *pAmt)
18e90 7b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  {.  if( pCur->eS
18ea0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
18eb0 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ID ){.    return
18ec0 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65   (const void*)fe
18ed0 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  tchPayload(pCur,
18ee0 20 70 41 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a 20   pAmt, 1);.  }. 
18ef0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f   return 0;.}.../
18f00 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
18f10 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e  rsor down to a n
18f20 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20  ew child page.  
18f30 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75  The newPgno argu
18f40 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70  ment is the.** p
18f50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
18f60 65 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20  e child page to 
18f70 6d 6f 76 65 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74  move to..*/.stat
18f80 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69  ic int moveToChi
18f90 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ld(BtCursor *pCu
18fa0 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b  r, u32 newPgno){
18fb0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
18fc0 50 61 67 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a  Page *pNewPage;.
18fd0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 50    MemPage *pOldP
18fe0 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20  age;.  BtShared 
18ff0 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
19000 72 65 65 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73  ree->pBt;..  ass
19010 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
19020 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
19030 29 3b 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64  );.  rc = getAnd
19040 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65  InitPage(pBt, ne
19050 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67 65  wPgno, &pNewPage
19060 2c 20 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a  , pCur->pPage);.
19070 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
19080 6e 20 72 63 3b 0a 20 20 70 4e 65 77 50 61 67 65  n rc;.  pNewPage
19090 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d 20 70 43  ->idxParent = pC
190a0 75 72 2d 3e 69 64 78 3b 0a 20 20 70 4f 6c 64 50  ur->idx;.  pOldP
190b0 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
190c0 65 3b 0a 20 20 70 4f 6c 64 50 61 67 65 2d 3e 69  e;.  pOldPage->i
190d0 64 78 53 68 69 66 74 20 3d 20 30 3b 0a 20 20 72  dxShift = 0;.  r
190e0 65 6c 65 61 73 65 50 61 67 65 28 70 4f 6c 64 50  eleasePage(pOldP
190f0 61 67 65 29 3b 0a 20 20 70 43 75 72 2d 3e 70 50  age);.  pCur->pP
19100 61 67 65 20 3d 20 70 4e 65 77 50 61 67 65 3b 0a  age = pNewPage;.
19110 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 30 3b    pCur->idx = 0;
19120 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
19130 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  ize = 0;.  if( p
19140 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31  NewPage->nCell<1
19150 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
19160 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
19170 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
19180 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
19190 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
191a0 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
191b0 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  the virtual root
191c0 20 6f 66 20 69 74 73 20 74 61 62 6c 65 2e 0a 2a   of its table..*
191d0 2a 0a 2a 2a 20 54 68 65 20 76 69 72 74 75 61 6c  *.** The virtual
191e0 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 74 68   root page is th
191f0 65 20 72 6f 6f 74 20 70 61 67 65 20 66 6f 72 20  e root page for 
19200 6d 6f 73 74 20 74 61 62 6c 65 73 2e 20 20 42 75  most tables.  Bu
19210 74 0a 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62  t.** for the tab
19220 6c 65 20 72 6f 6f 74 65 64 20 6f 6e 20 70 61 67  le rooted on pag
19230 65 20 31 2c 20 73 6f 6d 65 74 69 6d 65 20 74 68  e 1, sometime th
19240 65 20 72 65 61 6c 20 72 6f 6f 74 20 70 61 67 65  e real root page
19250 0a 2a 2a 20 69 73 20 65 6d 70 74 79 20 65 78 63  .** is empty exc
19260 65 70 74 20 66 6f 72 20 74 68 65 20 72 69 67 68  ept for the righ
19270 74 2d 70 6f 69 6e 74 65 72 2e 20 20 49 6e 20 73  t-pointer.  In s
19280 75 63 68 20 63 61 73 65 73 20 74 68 65 0a 2a 2a  uch cases the.**
19290 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
192a0 67 65 20 69 73 20 74 68 65 20 70 61 67 65 20 74  ge is the page t
192b0 68 61 74 20 74 68 65 20 72 69 67 68 74 2d 70 6f  hat the right-po
192c0 69 6e 74 65 72 20 6f 66 20 70 61 67 65 0a 2a 2a  inter of page.**
192d0 20 31 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74   1 is pointing t
192e0 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
192f0 20 69 73 52 6f 6f 74 50 61 67 65 28 4d 65 6d 50   isRootPage(MemP
19300 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 4d  age *pPage){.  M
19310 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 20  emPage *pParent 
19320 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  = pPage->pParent
19330 3b 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 3d  ;.  if( pParent=
19340 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
19350 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e 70 67   if( pParent->pg
19360 6e 6f 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b  no>1 ) return 0;
19370 0a 20 20 69 66 28 20 67 65 74 32 62 79 74 65 28  .  if( get2byte(
19380 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
19390 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
193a0 65 74 2b 33 5d 29 3d 3d 30 20 29 20 72 65 74 75  et+3])==0 ) retu
193b0 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30  rn 1;.  return 0
193c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
193d0 74 68 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f  the cursor up to
193e0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
193f0 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64  ..**.** pCur->id
19400 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  x is set to the 
19410 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20  cell index that 
19420 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69  contains the poi
19430 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70  nter.** to the p
19440 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e  age we are comin
19450 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61  g from.  If we a
19460 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74  re coming from t
19470 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74  he.** right-most
19480 20 63 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e   child page then
19490 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65   pCur->idx is se
194a0 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68  t to one more th
194b0 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73  an.** the larges
194c0 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f  t cell index..*/
194d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 6f 76  .static void mov
194e0 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73  eToParent(BtCurs
194f0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d  or *pCur){.  Mem
19500 50 61 67 65 20 2a 70 50 61 72 65 6e 74 3b 0a 20  Page *pParent;. 
19510 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
19520 0a 20 20 69 6e 74 20 69 64 78 50 61 72 65 6e 74  .  int idxParent
19530 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  ;..  assert( pCu
19540 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
19550 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70 50 61  R_VALID );.  pPa
19560 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
19570 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
19580 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
19590 28 20 21 69 73 52 6f 6f 74 50 61 67 65 28 70 50  ( !isRootPage(pP
195a0 61 67 65 29 20 29 3b 0a 20 20 70 50 61 72 65 6e  age) );.  pParen
195b0 74 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65  t = pPage->pPare
195c0 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  nt;.  assert( pP
195d0 61 72 65 6e 74 21 3d 30 20 29 3b 0a 20 20 69 64  arent!=0 );.  id
195e0 78 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d  xParent = pPage-
195f0 3e 69 64 78 50 61 72 65 6e 74 3b 0a 20 20 73 71  >idxParent;.  sq
19600 6c 69 74 65 33 70 61 67 65 72 5f 72 65 66 28 70  lite3pager_ref(p
19610 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 29 3b 0a  Parent->aData);.
19620 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
19630 61 67 65 29 3b 0a 20 20 70 43 75 72 2d 3e 70 50  age);.  pCur->pP
19640 61 67 65 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20  age = pParent;. 
19650 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
19660 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  e = 0;.  assert(
19670 20 70 50 61 72 65 6e 74 2d 3e 69 64 78 53 68 69   pParent->idxShi
19680 66 74 3d 3d 30 20 29 3b 0a 20 20 70 43 75 72 2d  ft==0 );.  pCur-
19690 3e 69 64 78 20 3d 20 69 64 78 50 61 72 65 6e 74  >idx = idxParent
196a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
196b0 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
196c0 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2f 0a 73  e root page.*/.s
196d0 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
196e0 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Root(BtCursor *p
196f0 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  Cur){.  MemPage 
19700 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63  *pRoot;.  int rc
19710 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
19720 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
19730 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42  pCur->pBtree->pB
19740 74 3b 0a 0a 20 20 72 65 73 74 6f 72 65 4f 72 43  t;..  restoreOrC
19750 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
19760 6f 6e 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 70  on(pCur, 0);.  p
19770 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 70 50 61  Root = pCur->pPa
19780 67 65 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 20  ge;.  if( pRoot 
19790 26 26 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d  && pRoot->pgno==
197a0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29  pCur->pgnoRoot )
197b0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52  {.    assert( pR
197c0 6f 6f 74 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  oot->isInit );. 
197d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
197e0 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b  .      SQLITE_OK
197f0 21 3d 28 72 63 20 3d 20 67 65 74 41 6e 64 49 6e  !=(rc = getAndIn
19800 69 74 50 61 67 65 28 70 42 74 2c 20 70 43 75 72  itPage(pBt, pCur
19810 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f  ->pgnoRoot, &pRo
19820 6f 74 2c 20 30 29 29 0a 20 20 20 20 29 7b 0a 20  ot, 0)).    ){. 
19830 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
19840 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
19850 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ID;.      return
19860 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
19870 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
19880 3e 70 50 61 67 65 29 3b 0a 20 20 20 20 70 43 75  >pPage);.    pCu
19890 72 2d 3e 70 50 61 67 65 20 3d 20 70 52 6f 6f 74  r->pPage = pRoot
198a0 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 64  ;.  }.  pCur->id
198b0 78 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69  x = 0;.  pCur->i
198c0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
198d0 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c   if( pRoot->nCel
198e0 6c 3d 3d 30 20 26 26 20 21 70 52 6f 6f 74 2d 3e  l==0 && !pRoot->
198f0 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f  leaf ){.    Pgno
19900 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20 61 73   subpage;.    as
19910 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e  sert( pRoot->pgn
19920 6f 3d 3d 31 20 29 3b 0a 20 20 20 20 73 75 62 70  o==1 );.    subp
19930 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
19940 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f  pRoot->aData[pRo
19950 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ot->hdrOffset+8]
19960 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
19970 75 62 70 61 67 65 3e 30 20 29 3b 0a 20 20 20 20  ubpage>0 );.    
19980 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
19990 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20  URSOR_VALID;.   
199a0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
199b0 64 28 70 43 75 72 2c 20 73 75 62 70 61 67 65 29  d(pCur, subpage)
199c0 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53  ;.  }.  pCur->eS
199d0 74 61 74 65 20 3d 20 28 28 70 43 75 72 2d 3e 70  tate = ((pCur->p
199e0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 29 3f 43  Page->nCell>0)?C
199f0 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43 55 52 53  URSOR_VALID:CURS
19a00 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a 20 20 72  OR_INVALID);.  r
19a10 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
19a20 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
19a30 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c  or down to the l
19a40 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e  eft-most leaf en
19a50 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a  try beneath the.
19a60 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63  ** entry to whic
19a70 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  h it is currentl
19a80 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a  y pointing..**.*
19a90 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  * The left-most 
19aa0 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20  leaf is the one 
19ab0 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73  with the smalles
19ac0 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73  t key - the firs
19ad0 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e  t.** in ascendin
19ae0 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  g order..*/.stat
19af0 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66  ic int moveToLef
19b00 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a  tmost(BtCursor *
19b10 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67  pCur){.  Pgno pg
19b20 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  no;.  int rc;.  
19b30 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
19b40 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
19b50 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
19b60 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65  VALID );.  while
19b70 28 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72  ( !(pPage = pCur
19b80 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66 20 29  ->pPage)->leaf )
19b90 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
19ba0 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43  ur->idx>=0 && pC
19bb0 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e  ur->idx<pPage->n
19bc0 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f  Cell );.    pgno
19bd0 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64   = get4byte(find
19be0 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72  Cell(pPage, pCur
19bf0 2d 3e 69 64 78 29 29 3b 0a 20 20 20 20 72 63 20  ->idx));.    rc 
19c00 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
19c10 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69  ur, pgno);.    i
19c20 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
19c30 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  c;.  }.  return 
19c40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
19c50 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
19c60 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20  sor down to the 
19c70 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20  right-most leaf 
19c80 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
19c90 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77 68 69  e.** page to whi
19ca0 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74  ch it is current
19cb0 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f  ly pointing.  No
19cc0 74 69 63 65 20 74 68 65 20 64 69 66 66 65 72 65  tice the differe
19cd0 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d  nce.** between m
19ce0 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20  oveToLeftmost() 
19cf0 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  and moveToRightm
19d00 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65  ost().  moveToLe
19d10 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64  ftmost().** find
19d20 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  s the left-most 
19d30 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
19d40 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72 65 61  e *entry* wherea
19d50 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  s moveToRightmos
19d60 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65  t().** finds the
19d70 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
19d80 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 70  y beneath the *p
19d90 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  age*..**.** The 
19da0 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79  right-most entry
19db0 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68   is the one with
19dc0 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79   the largest key
19dd0 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b   - the last.** k
19de0 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  ey in ascending 
19df0 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
19e00 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68 74   int moveToRight
19e10 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  most(BtCursor *p
19e20 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e  Cur){.  Pgno pgn
19e30 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  o;.  int rc;.  M
19e40 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
19e50 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
19e60 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
19e70 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28  ALID );.  while(
19e80 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d   !(pPage = pCur-
19e90 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66 20 29 7b  >pPage)->leaf ){
19ea0 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
19eb0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
19ec0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
19ed0 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75  set+8]);.    pCu
19ee0 72 2d 3e 69 64 78 20 3d 20 70 50 61 67 65 2d 3e  r->idx = pPage->
19ef0 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20  nCell;.    rc = 
19f00 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
19f10 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28  , pgno);.    if(
19f20 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
19f30 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 64 78  .  }.  pCur->idx
19f40 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20   = pPage->nCell 
19f50 2d 20 31 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  - 1;.  pCur->inf
19f60 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 72  o.nSize = 0;.  r
19f70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
19f80 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
19f90 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69  cursor to the fi
19fa0 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
19fb0 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
19fc0 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
19fd0 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70  success.  Set *p
19fe0 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20  Res to 0 if the 
19ff0 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20  cursor actually 
1a000 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68  points to someth
1a010 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70  ing.** or set *p
1a020 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20  Res to 1 if the 
1a030 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
1a040 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1a050 72 65 65 46 69 72 73 74 28 42 74 43 75 72 73 6f  reeFirst(BtCurso
1a060 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
1a070 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
1a080 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
1a090 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
1a0a0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1a0b0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
1a0c0 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
1a0d0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1a0e0 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
1a0f0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 52  ll==0 );.    *pR
1a100 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  es = 1;.    retu
1a110 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1a120 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  }.  assert( pCur
1a130 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30  ->pPage->nCell>0
1a140 20 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b   );.  *pRes = 0;
1a150 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65  .  rc = moveToLe
1a160 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
1a170 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1a180 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
1a190 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
1a1a0 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ry in the table.
1a1b0 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
1a1c0 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
1a1d0 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20  .  Set *pRes to 
1a1e0 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  0 if the cursor 
1a1f0 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20  actually points 
1a200 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20  to something.** 
1a210 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  or set *pRes to 
1a220 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  1 if the table i
1a230 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20  s empty..*/.int 
1a240 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74  sqlite3BtreeLast
1a250 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1a260 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
1a270 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 6d 6f  nt rc;.  rc = mo
1a280 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
1a290 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1a2a0 6e 20 72 63 3b 0a 20 20 69 66 28 20 43 55 52 53  n rc;.  if( CURS
1a2b0 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
1a2c0 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
1a2d0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
1a2e0 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  age->nCell==0 );
1a2f0 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a  .    *pRes = 1;.
1a300 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1a310 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65  E_OK;.  }.  asse
1a320 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
1a330 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
1a340 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20  ;.  *pRes = 0;. 
1a350 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68   rc = moveToRigh
1a360 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 72  tmost(pCur);.  r
1a370 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
1a380 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
1a390 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
1a3a0 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65  s to an entry ne
1a3b0 61 72 20 70 4b 65 79 2f 6e 4b 65 79 2e 0a 2a 2a  ar pKey/nKey..**
1a3c0 20 52 65 74 75 72 6e 20 61 20 73 75 63 63 65 73   Return a succes
1a3d0 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f  s code..**.** Fo
1a3e0 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c  r INTKEY tables,
1a3f0 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20 70   only the nKey p
1a400 61 72 61 6d 65 74 65 72 20 69 73 20 75 73 65 64  arameter is used
1a410 2e 20 20 70 4b 65 79 20 69 73 0a 2a 2a 20 69 67  .  pKey is.** ig
1a420 6e 6f 72 65 64 2e 20 20 46 6f 72 20 6f 74 68 65  nored.  For othe
1a430 72 20 74 61 62 6c 65 73 2c 20 6e 4b 65 79 20 69  r tables, nKey i
1a440 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1a450 62 79 74 65 73 20 6f 66 20 64 61 74 61 0a 2a 2a  bytes of data.**
1a460 20 69 6e 20 70 4b 65 79 2e 20 20 54 68 65 20 63   in pKey.  The c
1a470 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
1a480 6f 6e 20 73 70 65 63 69 66 69 65 64 20 77 68 65  on specified whe
1a490 6e 20 74 68 65 20 63 75 72 73 6f 72 20 77 61 73  n the cursor was
1a4a0 0a 2a 2a 20 63 72 65 61 74 65 64 20 69 73 20 75  .** created is u
1a4b0 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 6b  sed to compare k
1a4c0 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  eys..**.** If an
1a4d0 20 65 78 61 63 74 20 6d 61 74 63 68 20 69 73 20   exact match is 
1a4e0 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20  not found, then 
1a4f0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c  the cursor is al
1a500 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69  ways.** left poi
1a510 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20  nting at a leaf 
1a520 70 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64  page which would
1a530 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20   hold the entry 
1a540 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72  if it.** were pr
1a550 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73  esent.  The curs
1a560 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  or might point t
1a570 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20  o an entry that 
1a580 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20  comes.** before 
1a590 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b 65 79  or after the key
1a5a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75  ..**.** The resu
1a5b0 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67 20  lt of comparing 
1a5c0 74 68 65 20 6b 65 79 20 77 69 74 68 20 74 68 65  the key with the
1a5d0 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20   entry to which 
1a5e0 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 69 73  the.** cursor is
1a5f0 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 52 65   written to *pRe
1a600 73 20 69 66 20 70 52 65 73 21 3d 4e 55 4c 4c 2e  s if pRes!=NULL.
1a610 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66    The meaning of
1a620 0a 2a 2a 20 74 68 69 73 20 76 61 6c 75 65 20 69  .** this value i
1a630 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  s as follows:.**
1a640 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20  .**     *pRes<0 
1a650 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
1a660 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
1a670 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
1a680 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
1a690 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72        is smaller
1a6a0 20 74 68 61 6e 20 70 4b 65 79 20 6f 72 20 69 66   than pKey or if
1a6b0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
1a6c0 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  pty.**          
1a6d0 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20          and the 
1a6e0 63 75 72 73 6f 72 20 69 73 20 74 68 65 72 65 66  cursor is theref
1a6f0 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74  ore left point t
1a700 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a  o nothing..**.**
1a710 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20       *pRes==0   
1a720 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
1a730 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
1a740 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
1a750 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1a760 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68     exactly match
1a770 65 73 20 70 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20  es pKey..**.**  
1a780 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20     *pRes>0      
1a790 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
1a7a0 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
1a7b0 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
1a7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7d0 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
1a7e0 70 4b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  pKey..*/.int sql
1a7f0 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28  ite3BtreeMoveto(
1a800 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1a810 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
1a820 2c 20 69 36 34 20 6e 4b 65 79 2c 20 69 6e 74 20  , i64 nKey, int 
1a830 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
1a840 3b 0a 20 20 69 6e 74 20 74 72 79 52 69 67 68 74  ;.  int tryRight
1a850 6d 6f 73 74 3b 0a 20 20 72 63 20 3d 20 6d 6f 76  most;.  rc = mov
1a860 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
1a870 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1a880 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70   rc;.  assert( p
1a890 43 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20  Cur->pPage );.  
1a8a0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
1a8b0 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
1a8c0 20 74 72 79 52 69 67 68 74 6d 6f 73 74 20 3d 20   tryRightmost = 
1a8d0 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74  pCur->pPage->int
1a8e0 4b 65 79 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  Key;.  if( pCur-
1a8f0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1a900 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a  INVALID ){.    *
1a910 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61  pRes = -1;.    a
1a920 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61  ssert( pCur->pPa
1a930 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  ge->nCell==0 );.
1a940 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1a950 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  E_OK;.  }.  for(
1a960 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72  ;;){.    int lwr
1a970 2c 20 75 70 72 3b 0a 20 20 20 20 50 67 6e 6f 20  , upr;.    Pgno 
1a980 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50  chldPg;.    MemP
1a990 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
1a9a0 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 69 6e  r->pPage;.    in
1a9b0 74 20 63 20 3d 20 2d 31 3b 20 20 2f 2a 20 70 52  t c = -1;  /* pR
1a9c0 65 73 20 72 65 74 75 72 6e 20 69 66 20 74 61 62  es return if tab
1a9d0 6c 65 20 69 73 20 65 6d 70 74 79 20 6d 75 73 74  le is empty must
1a9e0 20 62 65 20 2d 31 20 2a 2f 0a 20 20 20 20 6c 77   be -1 */.    lw
1a9f0 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d  r = 0;.    upr =
1aa00 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b   pPage->nCell-1;
1aa10 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
1aa20 3e 69 6e 74 4b 65 79 20 26 26 20 70 4b 65 79 3d  >intKey && pKey=
1aa30 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
1aa40 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1aa50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
1aa60 20 20 77 68 69 6c 65 28 20 6c 77 72 3c 3d 75 70    while( lwr<=up
1aa70 72 20 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20  r ){.      void 
1aa80 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20  *pCellKey;.     
1aa90 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20   i64 nCellKey;. 
1aaa0 20 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d       pCur->idx =
1aab0 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 0a 20 20   (lwr+upr)/2;.  
1aac0 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
1aad0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Size = 0;.      
1aae0 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
1aaf0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  y ){.        u8 
1ab00 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20  *pCell;.        
1ab10 69 66 28 20 74 72 79 52 69 67 68 74 6d 6f 73 74  if( tryRightmost
1ab20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43   ){.          pC
1ab30 75 72 2d 3e 69 64 78 20 3d 20 75 70 72 3b 0a 20  ur->idx = upr;. 
1ab40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1ab50 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
1ab60 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  l(pPage, pCur->i
1ab70 64 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68 69  dx) + pPage->chi
1ab80 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20  ldPtrSize;.     
1ab90 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61     if( pPage->ha
1aba0 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  sData ){.       
1abb0 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20     u32 dummy;.  
1abc0 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2b 3d          pCell +=
1abd0 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 43 65   getVarint32(pCe
1abe0 6c 6c 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20  ll, &dummy);.   
1abf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67       }.        g
1ac00 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20  etVarint(pCell, 
1ac10 28 75 36 34 20 2a 29 26 6e 43 65 6c 6c 4b 65 79  (u64 *)&nCellKey
1ac20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
1ac30 43 65 6c 6c 4b 65 79 3c 6e 4b 65 79 20 29 7b 0a  CellKey<nKey ){.
1ac40 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 2d 31            c = -1
1ac50 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
1ac60 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3e 6e 4b 65  if( nCellKey>nKe
1ac70 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  y ){.          c
1ac80 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 20   = +1;.         
1ac90 20 74 72 79 52 69 67 68 74 6d 6f 73 74 20 3d 20   tryRightmost = 
1aca0 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
1acb0 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  {.          c = 
1acc0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
1acd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ace0 20 20 69 6e 74 20 61 76 61 69 6c 61 62 6c 65 3b    int available;
1acf0 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65  .        pCellKe
1ad00 79 20 3d 20 28 76 6f 69 64 20 2a 29 66 65 74 63  y = (void *)fetc
1ad10 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 26  hPayload(pCur, &
1ad20 61 76 61 69 6c 61 62 6c 65 2c 20 30 29 3b 0a 20  available, 0);. 
1ad30 20 20 20 20 20 20 20 6e 43 65 6c 6c 4b 65 79 20         nCellKey 
1ad40 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  = pCur->info.nKe
1ad50 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  y;.        if( a
1ad60 76 61 69 6c 61 62 6c 65 3e 3d 6e 43 65 6c 6c 4b  vailable>=nCellK
1ad70 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
1ad80 63 20 3d 20 70 43 75 72 2d 3e 78 43 6f 6d 70 61  c = pCur->xCompa
1ad90 72 65 28 70 43 75 72 2d 3e 70 41 72 67 2c 20 6e  re(pCur->pArg, n
1ada0 43 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b 65  CellKey, pCellKe
1adb0 79 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a  y, nKey, pKey);.
1adc0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1add0 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65           pCellKe
1ade0 79 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  y = sqliteMalloc
1adf0 52 61 77 28 20 6e 43 65 6c 6c 4b 65 79 20 29 3b  Raw( nCellKey );
1ae00 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
1ae10 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 20 72 65 74  CellKey==0 ) ret
1ae20 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
1ae30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1ae40 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
1ae50 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b  (pCur, 0, nCellK
1ae60 65 79 2c 20 28 76 6f 69 64 20 2a 29 70 43 65 6c  ey, (void *)pCel
1ae70 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  lKey);.         
1ae80 20 63 20 3d 20 70 43 75 72 2d 3e 78 43 6f 6d 70   c = pCur->xComp
1ae90 61 72 65 28 70 43 75 72 2d 3e 70 41 72 67 2c 20  are(pCur->pArg, 
1aea0 6e 43 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b  nCellKey, pCellK
1aeb0 65 79 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 29 3b  ey, nKey, pKey);
1aec0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1aed0 65 46 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b  eFree(pCellKey);
1aee0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1aef0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1af00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1af10 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20  .      if( c==0 
1af20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1af30 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 26  Page->leafData &
1af40 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  & !pPage->leaf )
1af50 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20  {.          lwr 
1af60 3d 20 70 43 75 72 2d 3e 69 64 78 3b 0a 20 20 20  = pCur->idx;.   
1af70 20 20 20 20 20 20 20 75 70 72 20 3d 20 6c 77 72         upr = lwr
1af80 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   - 1;.          
1af90 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
1afa0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1afb0 69 66 28 20 70 52 65 73 20 29 20 2a 70 52 65 73  if( pRes ) *pRes
1afc0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1afd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1afe0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1aff0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3c    }.      if( c<
1b000 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 77 72  0 ){.        lwr
1b010 20 3d 20 70 43 75 72 2d 3e 69 64 78 2b 31 3b 0a   = pCur->idx+1;.
1b020 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1b030 20 20 20 20 20 75 70 72 20 3d 20 70 43 75 72 2d       upr = pCur-
1b040 3e 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  >idx-1;.      }.
1b050 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1b060 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 29 3b 0a  ( lwr==upr+1 );.
1b070 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1b080 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20  e->isInit );.   
1b090 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
1b0a0 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67   ){.      chldPg
1b0b0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
1b0c0 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e  if( lwr>=pPage->
1b0d0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63  nCell ){.      c
1b0e0 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65  hldPg = get4byte
1b0f0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
1b100 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
1b110 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  8]);.    }else{.
1b120 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67        chldPg = g
1b130 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
1b140 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20  (pPage, lwr));. 
1b150 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68 6c     }.    if( chl
1b160 64 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  dPg==0 ){.      
1b170 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64  assert( pCur->id
1b180 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64  x>=0 && pCur->id
1b190 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  x<pCur->pPage->n
1b1a0 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 69 66  Cell );.      if
1b1b0 28 20 70 52 65 73 20 29 20 2a 70 52 65 73 20 3d  ( pRes ) *pRes =
1b1c0 20 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   c;.      return
1b1d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1b1e0 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20  }.    pCur->idx 
1b1f0 3d 20 6c 77 72 3b 0a 20 20 20 20 70 43 75 72 2d  = lwr;.    pCur-
1b200 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
1b210 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
1b220 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68 6c 64  Child(pCur, chld
1b230 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  Pg);.    if( rc 
1b240 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1b250 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rc;.    }.  }.  
1b260 2f 2a 20 4e 4f 54 20 52 45 41 43 48 45 44 20 2a  /* NOT REACHED *
1b270 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  /.}../*.** Retur
1b280 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 63 75  n TRUE if the cu
1b290 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e  rsor is not poin
1b2a0 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
1b2b0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   of the table..*
1b2c0 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62  *.** TRUE will b
1b2d0 65 20 72 65 74 75 72 6e 65 64 20 61 66 74 65 72  e returned after
1b2e0 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
1b2f0 65 33 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f  e3BtreeNext() mo
1b300 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20  ves.** past the 
1b310 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
1b320 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74  e table or sqlit
1b330 65 33 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f  e3BtreePrev() mo
1b340 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20  ves past.** the 
1b350 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52  first entry.  TR
1b360 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72  UE is also retur
1b370 6e 65 64 20 69 66 20 74 68 65 20 74 61 62 6c 65  ned if the table
1b380 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
1b390 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f  t sqlite3BtreeEo
1b3a0 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  f(BtCursor *pCur
1b3b0 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68  ){.  /* TODO: Wh
1b3c0 61 74 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  at if the cursor
1b3d0 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45   is in CURSOR_RE
1b3e0 51 55 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c  QUIRESEEK but al
1b3f0 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a  l table entries.
1b400 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64    ** have been d
1b410 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41 50 49  eleted? This API
1b420 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68   will need to ch
1b430 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61  ange to return a
1b440 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a  n error code.  *
1b450 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65  * as well as the
1b460 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20   boolean result 
1b470 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65  value..  */.  re
1b480 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c  turn (CURSOR_VAL
1b490 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID!=pCur->eState
1b4a0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61  );.}../*.** Adva
1b4b0 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  nce the cursor t
1b4c0 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79  o the next entry
1b4d0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1b4e0 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73  .  If.** success
1b4f0 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ful then set *pR
1b500 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75  es=0.  If the cu
1b510 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65  rsor.** was alre
1b520 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ady pointing to 
1b530 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
1b540 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
1b550 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f  efore.** this ro
1b560 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
1b570 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  , then set *pRes
1b580 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  =1..*/.int sqlit
1b590 65 33 42 74 72 65 65 4e 65 78 74 28 42 74 43 75  e3BtreeNext(BtCu
1b5a0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
1b5b0 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
1b5c0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
1b5d0 67 65 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ge;..#ifndef SQL
1b5e0 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
1b5f0 43 41 43 48 45 0a 20 20 72 63 20 3d 20 72 65 73  CACHE.  rc = res
1b600 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f  toreOrClearCurso
1b610 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 2c 20  rPosition(pCur, 
1b620 31 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  1);.  if( rc!=SQ
1b630 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1b640 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
1b650 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 3e 30  if( pCur->skip>0
1b660 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b   ){.    pCur->sk
1b670 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65  ip = 0;.    *pRe
1b680 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  s = 0;.    retur
1b690 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1b6a0 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20  .  pCur->skip = 
1b6b0 30 3b 0a 23 65 6e 64 69 66 20 0a 0a 20 20 61 73  0;.#endif ..  as
1b6c0 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b  sert( pRes!=0 );
1b6d0 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
1b6e0 3e 70 50 61 67 65 3b 0a 20 20 69 66 28 20 43 55  >pPage;.  if( CU
1b6f0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
1b700 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
1b710 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
1b720 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1b730 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  K;.  }.  assert(
1b740 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
1b750 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1b760 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65  ->idx<pPage->nCe
1b770 6c 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69  ll );..  pCur->i
1b780 64 78 2b 2b 3b 0a 20 20 70 43 75 72 2d 3e 69 6e  dx++;.  pCur->in
1b790 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
1b7a0 69 66 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 70  if( pCur->idx>=p
1b7b0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  Page->nCell ){. 
1b7c0 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
1b7d0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  eaf ){.      rc 
1b7e0 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
1b7f0 75 72 2c 20 67 65 74 34 62 79 74 65 28 26 70 50  ur, get4byte(&pP
1b800 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
1b810 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29  ->hdrOffset+8]))
1b820 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
1b830 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1b840 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66    rc = moveToLef
1b850 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
1b860 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
1b870 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1b880 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20     }.    do{.   
1b890 20 20 20 69 66 28 20 69 73 52 6f 6f 74 50 61 67     if( isRootPag
1b8a0 65 28 70 50 61 67 65 29 20 29 7b 0a 20 20 20 20  e(pPage) ){.    
1b8b0 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
1b8c0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74         pCur->eSt
1b8d0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
1b8e0 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65  ALID;.        re
1b8f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1b900 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f        }.      mo
1b910 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29  veToParent(pCur)
1b920 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20  ;.      pPage = 
1b930 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20  pCur->pPage;.   
1b940 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69   }while( pCur->i
1b950 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  dx>=pPage->nCell
1b960 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   );.    *pRes = 
1b970 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  0;.    if( pPage
1b980 2d 3e 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20  ->leafData ){.  
1b990 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1b9a0 42 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20  BtreeNext(pCur, 
1b9b0 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pRes);.    }else
1b9c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1b9d0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1b9e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1b9f0 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20  .  *pRes = 0;.  
1ba00 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
1ba10 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1ba20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
1ba30 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  c = moveToLeftmo
1ba40 73 74 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75  st(pCur);.  retu
1ba50 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1ba60 53 74 65 70 20 74 68 65 20 63 75 72 73 6f 72 20  Step the cursor 
1ba70 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74  to the back to t
1ba80 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72  he previous entr
1ba90 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
1baa0 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73  e.  If.** succes
1bab0 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70  sful then set *p
1bac0 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63  Res=0.  If the c
1bad0 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72  ursor.** was alr
1bae0 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  eady pointing to
1baf0 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
1bb00 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1bb10 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20   before.** this 
1bb20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
1bb30 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ed, then set *pR
1bb40 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  es=1..*/.int sql
1bb50 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
1bb60 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  s(BtCursor *pCur
1bb70 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
1bb80 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e 6f 20 70  int rc;.  Pgno p
1bb90 67 6e 6f 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  gno;.  MemPage *
1bba0 70 50 61 67 65 3b 0a 0a 23 69 66 6e 64 65 66 20  pPage;..#ifndef 
1bbb0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
1bbc0 45 44 5f 43 41 43 48 45 0a 20 20 72 63 20 3d 20  ED_CACHE.  rc = 
1bbd0 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75  restoreOrClearCu
1bbe0 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
1bbf0 72 2c 20 31 29 3b 0a 20 20 69 66 28 20 72 63 21  r, 1);.  if( rc!
1bc00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1bc10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1bc20 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69  .  if( pCur->ski
1bc30 70 3c 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  p<0 ){.    pCur-
1bc40 3e 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a  >skip = 0;.    *
1bc50 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65  pRes = 0;.    re
1bc60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1bc70 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70    }.  pCur->skip
1bc80 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20   = 0;.#endif..  
1bc90 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  if( CURSOR_INVAL
1bca0 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
1bcb0 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
1bcc0 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
1bcd0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
1bce0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
1bcf0 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  age;.  assert( p
1bd00 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
1bd10 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1bd20 69 64 78 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  idx>=0 );.  if( 
1bd30 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
1bd40 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
1bd50 79 74 65 28 20 66 69 6e 64 43 65 6c 6c 28 70 50  yte( findCell(pP
1bd60 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 20  age, pCur->idx) 
1bd70 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  );.    rc = move
1bd80 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67  ToChild(pCur, pg
1bd90 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  no);.    if( rc 
1bda0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1bdb0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68   rc = moveToRigh
1bdc0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
1bdd0 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28  else{.    while(
1bde0 20 70 43 75 72 2d 3e 69 64 78 3d 3d 30 20 29 7b   pCur->idx==0 ){
1bdf0 0a 20 20 20 20 20 20 69 66 28 20 69 73 52 6f 6f  .      if( isRoo
1be00 74 50 61 67 65 28 70 50 61 67 65 29 20 29 7b 0a  tPage(pPage) ){.
1be10 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53          pCur->eS
1be20 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
1be30 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 2a  VALID;.        *
1be40 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  pRes = 1;.      
1be50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1be60 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
1be70 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70    moveToParent(p
1be80 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67  Cur);.      pPag
1be90 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
1bea0 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
1beb0 3e 69 64 78 2d 2d 3b 0a 20 20 20 20 70 43 75 72  >idx--;.    pCur
1bec0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
1bed0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
1bee0 3e 6c 65 61 66 44 61 74 61 20 26 26 20 21 70 50  >leafData && !pP
1bef0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
1bf00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1bf10 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75  treePrevious(pCu
1bf20 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65  r, pRes);.    }e
1bf30 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
1bf40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1bf50 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30  .  }.  *pRes = 0
1bf60 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1bf70 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
1bf80 20 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d   a new page from
1bf90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1bfa0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  le..**.** The ne
1bfb0 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64  w page is marked
1bfc0 20 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20   as dirty.  (In 
1bfd0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c  other words, sql
1bfe0 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28  ite3pager_write(
1bff0 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79  ).** has already
1c000 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20   been called on 
1c010 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20  the new page.)  
1c020 54 68 65 20 6e 65 77 20 70 61 67 65 20 68 61 73  The new page has
1c030 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65   also.** been re
1c040 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65  ferenced and the
1c050 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
1c060 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
1c070 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73  for calling.** s
1c080 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
1c090 66 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70  f() on the new p
1c0a0 61 67 65 20 77 68 65 6e 20 69 74 20 69 73 20 64  age when it is d
1c0b0 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  one..**.** SQLIT
1c0c0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1c0d0 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e   on success.  An
1c0e0 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76  y other return v
1c0f0 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a  alue indicates.*
1c100 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70  * an error.  *pp
1c110 50 61 67 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20  Page and *pPgno 
1c120 61 72 65 20 75 6e 64 65 66 69 6e 65 64 20 69 6e  are undefined in
1c130 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e   the event of an
1c140 20 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f   error..** Do no
1c150 74 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33  t invoke sqlite3
1c160 70 61 67 65 72 5f 75 6e 72 65 66 28 29 20 6f 6e  pager_unref() on
1c170 20 2a 70 70 50 61 67 65 20 69 66 20 61 6e 20 65   *ppPage if an e
1c180 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
1c190 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22  ..**.** If the "
1c1a0 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65 74 65  nearby" paramete
1c1b0 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e  r is not 0, then
1c1c0 20 61 20 28 66 65 65 62 6c 65 29 20 65 66 66 6f   a (feeble) effo
1c1d0 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a  rt is made to .*
1c1e0 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20  * locate a page 
1c1f0 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67  close to the pag
1c200 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79  e number "nearby
1c210 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20  ".  This can be 
1c220 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74  used in an.** at
1c230 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65  tempt to keep re
1c240 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73  lated pages clos
1c250 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20  e to each other 
1c260 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1c270 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69  file,.** which i
1c280 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20  n turn can make 
1c290 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20  database access 
1c2a0 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  faster..**.** If
1c2b0 20 74 68 65 20 22 65 78 61 63 74 22 20 70 61 72   the "exact" par
1c2c0 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c  ameter is not 0,
1c2d0 20 61 6e 64 20 74 68 65 20 70 61 67 65 2d 6e 75   and the page-nu
1c2e0 6d 62 65 72 20 6e 65 61 72 62 79 20 65 78 69 73  mber nearby exis
1c2f0 74 73 20 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20  ts .** anywhere 
1c300 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
1c310 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 75 61  , then it is gua
1c320 72 65 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65  renteed to be re
1c330 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20  turned. This.** 
1c340 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20  is only used by 
1c350 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
1c360 62 61 73 65 73 20 77 68 65 6e 20 61 6c 6c 6f 63  bases when alloc
1c370 61 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c  ating a new tabl
1c380 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1c390 20 61 6c 6c 6f 63 61 74 65 50 61 67 65 28 0a 20   allocatePage(. 
1c3a0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
1c3b0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
1c3c0 61 67 65 2c 20 0a 20 20 50 67 6e 6f 20 2a 70 50  age, .  Pgno *pP
1c3d0 67 6e 6f 2c 20 0a 20 20 50 67 6e 6f 20 6e 65 61  gno, .  Pgno nea
1c3e0 72 62 79 2c 0a 20 20 75 38 20 65 78 61 63 74 0a  rby,.  u8 exact.
1c3f0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
1c400 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  age1;.  int rc;.
1c410 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 2f 2a 20    int n;     /* 
1c420 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
1c430 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  on the freelist 
1c440 2a 2f 0a 20 20 69 6e 74 20 6b 3b 20 20 20 20 20  */.  int k;     
1c450 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61  /* Number of lea
1c460 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b  ves on the trunk
1c470 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   of the freelist
1c480 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
1c490 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d  Trunk = 0;.  Mem
1c4a0 50 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b  Page *pPrevTrunk
1c4b0 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 31 20   = 0;..  pPage1 
1c4c0 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20  = pBt->pPage1;. 
1c4d0 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70   n = get4byte(&p
1c4e0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
1c4f0 29 3b 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a  );.  if( n>0 ){.
1c500 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65      /* There are
1c510 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
1c520 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f  eelist.  Reuse o
1c530 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65  ne of those page
1c540 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69  s. */.    Pgno i
1c550 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65  Trunk;.    u8 se
1c560 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a  archList = 0; /*
1c570 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73   If the free-lis
1c580 74 20 6d 75 73 74 20 62 65 20 73 65 61 72 63 68  t must be search
1c590 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20  ed for 'nearby' 
1c5a0 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49  */.    .    /* I
1c5b0 66 20 74 68 65 20 27 65 78 61 63 74 27 20 70 61  f the 'exact' pa
1c5c0 72 61 6d 65 74 65 72 20 77 61 73 20 74 72 75 65  rameter was true
1c5d0 20 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20   and a query of 
1c5e0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
1c5f0 20 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61      ** shows tha
1c600 74 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72  t the page 'near
1c610 62 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65  by' is somewhere
1c620 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
1c630 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74  t, then.    ** t
1c640 68 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77  he entire-list w
1c650 69 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64 20  ill be searched 
1c660 66 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20  for that page.. 
1c670 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51     */.#ifndef SQ
1c680 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1c690 43 55 55 4d 0a 20 20 20 20 69 66 28 20 65 78 61  CUUM.    if( exa
1c6a0 63 74 20 29 7b 0a 20 20 20 20 20 20 75 38 20 65  ct ){.      u8 e
1c6b0 54 79 70 65 3b 0a 20 20 20 20 20 20 61 73 73 65  Type;.      asse
1c6c0 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a  rt( nearby>0 );.
1c6d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
1c6e0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b  t->autoVacuum );
1c6f0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
1c700 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62  apGet(pBt, nearb
1c710 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20  y, &eType, 0);. 
1c720 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
1c730 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 69  turn rc;.      i
1c740 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
1c750 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20  _FREEPAGE ){.   
1c760 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
1c770 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
1c780 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 65 61 72     *pPgno = near
1c790 62 79 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  by;.    }.#endif
1c7a0 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
1c7b0 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  nt the free-list
1c7c0 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74   count by 1. Set
1c7d0 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69   iTrunk to the i
1c7e0 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20  ndex of the.    
1c7f0 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69  ** first free-li
1c800 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69  st trunk page. i
1c810 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69  PrevTrunk is ini
1c820 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f  tially 1..    */
1c830 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1c840 33 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61  3pager_write(pPa
1c850 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  ge1->aData);.   
1c860 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1c870 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62 79 74   rc;.    put4byt
1c880 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1c890 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20  [36], n-1);..   
1c8a0 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74   /* The code wit
1c8b0 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73  hin this loop is
1c8c0 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69   run only once i
1c8d0 66 20 74 68 65 20 27 73 65 61 72 63 68 4c 69 73  f the 'searchLis
1c8e0 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20  t' variable.    
1c8f0 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20  ** is not true. 
1c900 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 72 75  Otherwise, it ru
1c910 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ns once for each
1c920 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74   trunk-page on t
1c930 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c  he.    ** free-l
1c940 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61  ist until the pa
1c950 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c  ge 'nearby' is l
1c960 6f 63 61 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  ocated..    */. 
1c970 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50     do {.      pP
1c980 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e  revTrunk = pTrun
1c990 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  k;.      if( pPr
1c9a0 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
1c9b0 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
1c9c0 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b  byte(&pPrevTrunk
1c9d0 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20  ->aData[0]);.   
1c9e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c9f0 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62    iTrunk = get4b
1ca00 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
1ca10 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d  ta[32]);.      }
1ca20 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 50  .      rc = getP
1ca30 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c  age(pBt, iTrunk,
1ca40 20 26 70 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20   &pTrunk);.     
1ca50 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1ca60 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20     pTrunk = 0;. 
1ca70 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1ca80 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
1ca90 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 6b 20       }..      k 
1caa0 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
1cab0 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20  nk->aData[4]);. 
1cac0 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26       if( k==0 &&
1cad0 20 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a   !searchList ){.
1cae0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
1caf0 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76  runk has no leav
1cb00 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20  es and the list 
1cb10 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61  is not being sea
1cb20 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20  rched. .        
1cb30 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74 68  ** So extract th
1cb40 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73  e trunk page its
1cb50 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20 61  elf and use it a
1cb60 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20  s the newly .   
1cb70 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65       ** allocate
1cb80 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  d page */.      
1cb90 20 20 61 73 73 65 72 74 28 20 70 50 72 65 76 54    assert( pPrevT
1cba0 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  runk==0 );.     
1cbb0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70     rc = sqlite3p
1cbc0 61 67 65 72 5f 77 72 69 74 65 28 70 54 72 75 6e  ager_write(pTrun
1cbd0 6b 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20  k->aData);.     
1cbe0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
1cbf0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1cc00 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
1cc10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1cc20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b   *pPgno = iTrunk
1cc30 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
1cc40 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
1cc50 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  32], &pTrunk->aD
1cc60 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
1cc70 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54      *ppPage = pT
1cc80 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54  runk;.        pT
1cc90 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
1cca0 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
1ccb0 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25  TE: %d trunk - %
1ccc0 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66  d free pages lef
1ccd0 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d  t\n", *pPgno, n-
1cce0 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  1));.      }else
1ccf0 20 69 66 28 20 6b 3e 70 42 74 2d 3e 75 73 61 62   if( k>pBt->usab
1cd00 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a  leSize/4 - 8 ){.
1cd10 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
1cd20 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20   of k is out of 
1cd30 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65  range.  Database
1cd40 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20   corruption */. 
1cd50 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1cd60 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1cd70 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
1cd80 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
1cd90 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1cda0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1cdb0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1cdc0 73 65 61 72 63 68 4c 69 73 74 20 26 26 20 6e 65  searchList && ne
1cdd0 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 29 7b 0a  arby==iTrunk ){.
1cde0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c          /* The l
1cdf0 69 73 74 20 69 73 20 62 65 69 6e 67 20 73 65 61  ist is being sea
1ce00 72 63 68 65 64 20 61 6e 64 20 74 68 69 73 20 74  rched and this t
1ce10 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65  runk page is the
1ce20 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
1ce30 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65   to allocate, re
1ce40 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
1ce50 68 65 72 20 69 74 20 68 61 73 20 6c 65 61 76 65  her it has leave
1ce60 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
1ce70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2a 70        assert( *p
1ce80 50 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b 0a  Pgno==iTrunk );.
1ce90 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20          *ppPage 
1cea0 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
1ceb0 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30    searchList = 0
1cec0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
1ced0 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
1cee0 65 28 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 29  e(pTrunk->aData)
1cef0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1cf00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
1cf10 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
1cf20 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
1cf30 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30          if( k==0
1cf40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
1cf50 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  ( !pPrevTrunk ){
1cf60 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
1cf70 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
1cf80 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
1cf90 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
1cfa0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
1cfb0 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
1cfc0 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  py(&pPrevTrunk->
1cfd0 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e  aData[0], &pTrun
1cfe0 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
1cff0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1d000 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1d010 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75        /* The tru
1d020 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71 75 69  nk page is requi
1d030 72 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  red by the calle
1d040 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e  r but it contain
1d050 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s .          ** 
1d060 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65  pointers to free
1d070 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68  -list leaves. Th
1d080 65 20 66 69 72 73 74 20 6c 65 61 66 20 62 65 63  e first leaf bec
1d090 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20  omes a trunk.   
1d0a0 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69         ** page i
1d0b0 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20  n this case..   
1d0c0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1d0d0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65      MemPage *pNe
1d0e0 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  wTrunk;.        
1d0f0 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b    Pgno iNewTrunk
1d100 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
1d110 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a  unk->aData[8]);.
1d120 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 67            rc = g
1d130 65 74 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77  etPage(pBt, iNew
1d140 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e  Trunk, &pNewTrun
1d150 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  k);.          if
1d160 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1d170 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  ){.            g
1d180 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
1d190 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
1d1a0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   }.          rc 
1d1b0 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77  = sqlite3pager_w
1d1c0 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e  rite(pNewTrunk->
1d1d0 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20  aData);.        
1d1e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1d1f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1d200 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1d210 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
1d220 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1d230 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
1d240 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1d250 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65       memcpy(&pNe
1d260 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  wTrunk->aData[0]
1d270 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
1d280 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
1d290 20 20 20 70 75 74 34 62 79 74 65 28 26 70 4e 65     put4byte(&pNe
1d2a0 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  wTrunk->aData[4]
1d2b0 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  , k-1);.        
1d2c0 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72    memcpy(&pNewTr
1d2d0 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26  unk->aData[8], &
1d2e0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32  pTrunk->aData[12
1d2f0 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20  ], (k-1)*4);.   
1d300 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
1d310 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ge(pNewTrunk);. 
1d320 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50           if( !pP
1d330 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
1d340 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
1d350 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
1d360 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b  32], iNewTrunk);
1d370 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
1d380 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
1d390 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
1d3a0 77 72 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b  write(pPrevTrunk
1d3b0 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20  ->aData);.      
1d3c0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
1d3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f                go
1d3e0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
1d3f0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
1d400 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1d410 70 75 74 34 62 79 74 65 28 26 70 50 72 65 76 54  put4byte(&pPrevT
1d420 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
1d430 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  iNewTrunk);.    
1d440 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d450 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  }.        pTrunk
1d460 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52   = 0;.        TR
1d470 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
1d480 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72  %d trunk - %d fr
1d490 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22  ee pages left\n"
1d4a0 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b  , *pPgno, n-1));
1d4b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65  .#endif.      }e
1d4c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
1d4d0 45 78 74 72 61 63 74 20 61 20 6c 65 61 66 20 66  Extract a leaf f
1d4e0 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f  rom the trunk */
1d4f0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 6c 6f  .        int clo
1d500 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67  sest;.        Pg
1d510 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20  no iPage;.      
1d520 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1d530 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d  *aData = pTrunk-
1d540 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20  >aData;.        
1d550 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
1d560 72 5f 77 72 69 74 65 28 61 44 61 74 61 29 3b 0a  r_write(aData);.
1d570 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
1d580 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
1d590 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
1d5a0 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
1d5b0 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79        if( nearby
1d5c0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
1d5d0 69 6e 74 20 69 2c 20 64 69 73 74 3b 0a 20 20 20  int i, dist;.   
1d5e0 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
1d5f0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 69   0;.          di
1d600 73 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  st = get4byte(&a
1d610 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62  Data[8]) - nearb
1d620 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  y;.          if(
1d630 20 64 69 73 74 3c 30 20 29 20 64 69 73 74 20 3d   dist<0 ) dist =
1d640 20 2d 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20   -dist;.        
1d650 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20    for(i=1; i<k; 
1d660 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
1d670 20 20 69 6e 74 20 64 32 20 3d 20 67 65 74 34 62    int d2 = get4b
1d680 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34  yte(&aData[8+i*4
1d690 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20  ]) - nearby;.   
1d6a0 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c           if( d2<
1d6b0 30 20 29 20 64 32 20 3d 20 2d 64 32 3b 0a 20 20  0 ) d2 = -d2;.  
1d6c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32            if( d2
1d6d0 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  <dist ){.       
1d6e0 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
1d6f0 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   i;.            
1d700 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20    dist = d2;.   
1d710 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1d720 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1d730 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1d740 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20  closest = 0;.   
1d750 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1d760 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  iPage = get4byte
1d770 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73  (&aData[8+closes
1d780 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  t*4]);.        i
1d790 66 28 20 21 73 65 61 72 63 68 4c 69 73 74 20 7c  f( !searchList |
1d7a0 7c 20 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20  | iPage==nearby 
1d7b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50  ){.          *pP
1d7c0 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20  gno = iPage;.   
1d7d0 20 20 20 20 20 20 20 69 66 28 20 2a 70 50 67 6e         if( *pPgn
1d7e0 6f 3e 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70  o>sqlite3pager_p
1d7f0 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
1d800 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
1d810 20 20 20 20 20 2f 2a 20 46 72 65 65 20 70 61 67       /* Free pag
1d820 65 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66  e off the end of
1d830 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20   the file */.   
1d840 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1d850 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1d860 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  KPT;.          }
1d870 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45  .          TRACE
1d880 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
1d890 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25  was leaf %d of %
1d8a0 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20  d on trunk %d". 
1d8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8c0 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20  ": %d more free 
1d8d0 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20  pages\n",.      
1d8e0 20 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e             *pPgn
1d8f0 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c  o, closest+1, k,
1d900 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e   pTrunk->pgno, n
1d910 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1));.          
1d920 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20  if( closest<k-1 
1d930 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
1d940 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63  emcpy(&aData[8+c
1d950 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74  losest*4], &aDat
1d960 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20  a[4+k*4], 4);.  
1d970 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d980 20 20 20 20 70 75 74 34 62 79 74 65 28 26 61 44      put4byte(&aD
1d990 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20  ata[4], k-1);.  
1d9a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74          rc = get
1d9b0 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f  Page(pBt, *pPgno
1d9c0 2c 20 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  , ppPage);.     
1d9d0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1d9e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d9f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67        sqlite3pag
1da00 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b  er_dont_rollback
1da10 28 28 2a 70 70 50 61 67 65 29 2d 3e 61 44 61 74  ((*ppPage)->aDat
1da20 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  a);.            
1da30 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
1da40 72 5f 77 72 69 74 65 28 28 2a 70 70 50 61 67 65  r_write((*ppPage
1da50 29 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20  )->aData);.     
1da60 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1da70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1da80 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
1da90 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
1daa0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1dab0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1dac0 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
1dad0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
1dae0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65      }.      rele
1daf0 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75  asePage(pPrevTru
1db00 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76  nk);.      pPrev
1db10 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d  Trunk = 0;.    }
1db20 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73  while( searchLis
1db30 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t );.  }else{.  
1db40 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e    /* There are n
1db50 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  o pages on the f
1db60 72 65 65 6c 69 73 74 2c 20 73 6f 20 63 72 65 61  reelist, so crea
1db70 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 61 74  te a new page at
1db80 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 64 20   the.    ** end 
1db90 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  of the file */. 
1dba0 20 20 20 2a 70 50 67 6e 6f 20 3d 20 73 71 6c 69     *pPgno = sqli
1dbb0 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75  te3pager_pagecou
1dbc0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20  nt(pBt->pPager) 
1dbd0 2b 20 31 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  + 1;..#ifndef SQ
1dbe0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1dbf0 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
1dc00 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20  ->autoVacuum && 
1dc10 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
1dc20 74 2c 20 2a 70 50 67 6e 6f 29 20 29 7b 0a 20 20  t, *pPgno) ){.  
1dc30 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f      /* If *pPgno
1dc40 20 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f 69   refers to a poi
1dc50 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 61  nter-map page, a
1dc60 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77 20  llocate two new 
1dc70 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 61  pages.      ** a
1dc80 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
1dc90 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66   file instead of
1dca0 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74 20   one. The first 
1dcb0 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a 20  allocated page. 
1dcc0 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20       ** becomes 
1dcd0 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61  a new pointer-ma
1dce0 70 20 70 61 67 65 2c 20 74 68 65 20 73 65 63 6f  p page, the seco
1dcf0 6e 64 20 69 73 20 75 73 65 64 20 62 79 20 74 68  nd is used by th
1dd00 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20  e caller..      
1dd10 2a 2f 0a 20 20 20 20 20 20 54 52 41 43 45 28 28  */.      TRACE((
1dd20 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72  "ALLOCATE: %d fr
1dd30 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28  om end of file (
1dd40 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
1dd50 29 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a  )\n", *pPgno));.
1dd60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2a 70        assert( *p
1dd70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
1dd80 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
1dd90 20 20 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b        (*pPgno)++
1dda0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
1ddb0 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67      assert( *pPg
1ddc0 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
1ddd0 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20  _PAGE(pBt) );.  
1dde0 20 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70    rc = getPage(p
1ddf0 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61  Bt, *pPgno, ppPa
1de00 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
1de10 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1de20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
1de30 65 72 5f 77 72 69 74 65 28 28 2a 70 70 50 61 67  er_write((*ppPag
1de40 65 29 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  e)->aData);.    
1de50 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1de60 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
1de70 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
1de80 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45  .    }.    TRACE
1de90 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
1dea0 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65  from end of file
1deb0 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20  \n", *pPgno));. 
1dec0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70   }..  assert( *p
1ded0 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
1dee0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
1def0 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61  .end_allocate_pa
1df00 67 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  ge:.  releasePag
1df10 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c  e(pTrunk);.  rel
1df20 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72  easePage(pPrevTr
1df30 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  unk);.  return r
1df40 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  c;.}../*.** Add 
1df50 61 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  a page of the da
1df60 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 74  tabase file to t
1df70 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a  he freelist..**.
1df80 2a 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  ** sqlite3pager_
1df90 75 6e 72 65 66 28 29 20 69 73 20 4e 4f 54 20 63  unref() is NOT c
1dfa0 61 6c 6c 65 64 20 66 6f 72 20 70 50 61 67 65 2e  alled for pPage.
1dfb0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
1dfc0 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  reePage(MemPage 
1dfd0 2a 70 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61  *pPage){.  BtSha
1dfe0 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
1dff0 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65  ->pBt;.  MemPage
1e000 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e   *pPage1 = pBt->
1e010 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63  pPage1;.  int rc
1e020 2c 20 6e 2c 20 6b 3b 0a 0a 20 20 2f 2a 20 50 72  , n, k;..  /* Pr
1e030 65 70 61 72 65 20 74 68 65 20 70 61 67 65 20 66  epare the page f
1e040 6f 72 20 66 72 65 65 69 6e 67 20 2a 2f 0a 20 20  or freeing */.  
1e050 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
1e060 67 6e 6f 3e 31 20 29 3b 0a 20 20 70 50 61 67 65  gno>1 );.  pPage
1e070 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
1e080 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
1e090 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 70  e->pParent);.  p
1e0a0 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20  Page->pParent = 
1e0b0 30 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65  0;..  /* Increme
1e0c0 6e 74 20 74 68 65 20 66 72 65 65 20 70 61 67 65  nt the free page
1e0d0 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65 31   count on pPage1
1e0e0 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
1e0f0 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 70 50  e3pager_write(pP
1e100 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20  age1->aData);.  
1e110 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1e120 72 63 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79  rc;.  n = get4by
1e130 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
1e140 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79  a[36]);.  put4by
1e150 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
1e160 61 5b 33 36 5d 2c 20 6e 2b 31 29 3b 0a 0a 23 69  a[36], n+1);..#i
1e170 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55  fdef SQLITE_SECU
1e180 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20 49  RE_DELETE.  /* I
1e190 66 20 74 68 65 20 53 51 4c 49 54 45 5f 53 45 43  f the SQLITE_SEC
1e1a0 55 52 45 5f 44 45 4c 45 54 45 20 63 6f 6d 70 69  URE_DELETE compi
1e1b0 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69  le-time option i
1e1c0 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a  s enabled, then.
1e1d0 20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c    ** always full
1e1e0 79 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65  y overwrite dele
1e1f0 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ted information 
1e200 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 2a 2f  with zeros..  */
1e210 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70  .  rc = sqlite3p
1e220 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65  ager_write(pPage
1e230 2d 3e 61 44 61 74 61 29 3b 0a 20 20 69 66 28 20  ->aData);.  if( 
1e240 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1e250 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e    memset(pPage->
1e260 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d  aData, 0, pPage-
1e270 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  >pBt->pageSize);
1e280 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
1e290 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1e2a0 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 49 66 20  OVACUUM.  /* If 
1e2b0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
1e2c0 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
1e2d0 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72  m, write an entr
1e2e0 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  y in the pointer
1e2f0 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64  -map.  ** to ind
1e300 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 70  icate that the p
1e310 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a  age is free..  *
1e320 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74  /.  if( pBt->aut
1e330 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
1e340 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
1e350 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20  t, pPage->pgno, 
1e360 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c  PTRMAP_FREEPAGE,
1e370 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
1e380 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
1e390 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e  .#endif..  if( n
1e3a0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
1e3b0 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
1e3c0 66 72 65 65 20 70 61 67 65 20 2a 2f 0a 20 20 20  free page */.   
1e3d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
1e3e0 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 2d 3e  er_write(pPage->
1e3f0 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20  aData);.    if( 
1e400 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1e410 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65      memset(pPage
1e420 2d 3e 61 44 61 74 61 2c 20 30 2c 20 38 29 3b 0a  ->aData, 0, 8);.
1e430 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
1e440 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
1e450 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
1e460 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d     TRACE(("FREE-
1e470 50 41 47 45 3a 20 25 64 20 66 69 72 73 74 5c 6e  PAGE: %d first\n
1e480 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29  ", pPage->pgno))
1e490 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
1e4a0 2a 20 4f 74 68 65 72 20 66 72 65 65 20 70 61 67  * Other free pag
1e4b0 65 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  es already exist
1e4c0 2e 20 20 52 65 74 72 69 76 65 20 74 68 65 20 66  .  Retrive the f
1e4d0 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a  irst trunk page.
1e4e0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 72      ** of the fr
1e4f0 65 65 6c 69 73 74 20 61 6e 64 20 66 69 6e 64 20  eelist and find 
1e500 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 6c 65 61  out how many lea
1e510 76 65 73 20 69 74 20 68 61 73 2e 20 2a 2f 0a 20  ves it has. */. 
1e520 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75     MemPage *pTru
1e530 6e 6b 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74  nk;.    rc = get
1e540 50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62 79  Page(pBt, get4by
1e550 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
1e560 61 5b 33 32 5d 29 2c 20 26 70 54 72 75 6e 6b 29  a[32]), &pTrunk)
1e570 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
1e580 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6b 20  eturn rc;.    k 
1e590 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
1e5a0 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20  nk->aData[4]);. 
1e5b0 20 20 20 69 66 28 20 6b 3e 3d 70 42 74 2d 3e 75     if( k>=pBt->u
1e5c0 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20  sableSize/4 - 8 
1e5d0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
1e5e0 74 72 75 6e 6b 20 69 73 20 66 75 6c 6c 2e 20 20  trunk is full.  
1e5f0 54 75 72 6e 20 74 68 65 20 70 61 67 65 20 62 65  Turn the page be
1e600 69 6e 67 20 66 72 65 65 64 20 69 6e 74 6f 20 61  ing freed into a
1e610 20 6e 65 77 0a 20 20 20 20 20 20 2a 2a 20 74 72   new.      ** tr
1e620 75 6e 6b 20 70 61 67 65 20 77 69 74 68 20 6e 6f  unk page with no
1e630 20 6c 65 61 76 65 73 2e 20 2a 2f 0a 20 20 20 20   leaves. */.    
1e640 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
1e650 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 2d  ger_write(pPage-
1e660 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 69  >aData);.      i
1e670 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1e680 63 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  c;.      put4byt
1e690 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  e(pPage->aData, 
1e6a0 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 3b 0a 20  pTrunk->pgno);. 
1e6b0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1e6c0 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  Page->aData[4], 
1e6d0 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  0);.      put4by
1e6e0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
1e6f0 61 5b 33 32 5d 2c 20 70 50 61 67 65 2d 3e 70 67  a[32], pPage->pg
1e700 6e 6f 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45  no);.      TRACE
1e710 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64  (("FREE-PAGE: %d
1e720 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20   new trunk page 
1e730 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c  replacing %d\n",
1e740 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
1e750 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 54 72 75  Page->pgno, pTru
1e760 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  nk->pgno));.    
1e770 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
1e780 41 64 64 20 74 68 65 20 6e 65 77 6c 79 20 66 72  Add the newly fr
1e790 65 65 64 20 70 61 67 65 20 61 73 20 61 20 6c 65  eed page as a le
1e7a0 61 66 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  af on the curren
1e7b0 74 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20  t trunk */.     
1e7c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
1e7d0 65 72 5f 77 72 69 74 65 28 70 54 72 75 6e 6b 2d  er_write(pTrunk-
1e7e0 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 69  >aData);.      i
1e7f0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1e800 63 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  c;.      put4byt
1e810 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
1e820 5b 34 5d 2c 20 6b 2b 31 29 3b 0a 20 20 20 20 20  [4], k+1);.     
1e830 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
1e840 6b 2d 3e 61 44 61 74 61 5b 38 2b 6b 2a 34 5d 2c  k->aData[8+k*4],
1e850 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 23   pPage->pgno);.#
1e860 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 53 45  ifndef SQLITE_SE
1e870 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 20 20  CURE_DELETE.    
1e880 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64    sqlite3pager_d
1e890 6f 6e 74 5f 77 72 69 74 65 28 70 42 74 2d 3e 70  ont_write(pBt->p
1e8a0 50 61 67 65 72 2c 20 70 50 61 67 65 2d 3e 70 67  Pager, pPage->pg
1e8b0 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  no);.#endif.    
1e8c0 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50    TRACE(("FREE-P
1e8d0 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20  AGE: %d leaf on 
1e8e0 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22  trunk page %d\n"
1e8f0 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72  ,pPage->pgno,pTr
1e900 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  unk->pgno));.   
1e910 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61   }.    releasePa
1e920 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 7d 0a  ge(pTrunk);.  }.
1e930 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1e940 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f  /*.** Free any o
1e950 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73  verflow pages as
1e960 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
1e970 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f  e given Cell..*/
1e980 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61  .static int clea
1e990 72 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  rCell(MemPage *p
1e9a0 50 61 67 65 2c 20 75 6e 73 69 67 6e 65 64 20 63  Page, unsigned c
1e9b0 68 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 42  har *pCell){.  B
1e9c0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1e9d0 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c  Page->pBt;.  Cel
1e9e0 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67  lInfo info;.  Pg
1e9f0 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69  no ovflPgno;.  i
1ea00 6e 74 20 72 63 3b 0a 0a 20 20 70 61 72 73 65 43  nt rc;..  parseC
1ea10 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
1ea20 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69  ell, &info);.  i
1ea30 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
1ea40 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  w==0 ){.    retu
1ea50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f  rn SQLITE_OK;  /
1ea60 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  * No overflow pa
1ea70 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68  ges. Return with
1ea80 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
1ea90 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c  ng */.  }.  ovfl
1eaa0 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
1eab0 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
1eac0 72 66 6c 6f 77 5d 29 3b 0a 20 20 77 68 69 6c 65  rflow]);.  while
1ead0 28 20 6f 76 66 6c 50 67 6e 6f 21 3d 30 20 29 7b  ( ovflPgno!=0 ){
1eae0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  .    MemPage *pO
1eaf0 76 66 6c 3b 0a 20 20 20 20 69 66 28 20 6f 76 66  vfl;.    if( ovf
1eb00 6c 50 67 6e 6f 3e 73 71 6c 69 74 65 33 70 61 67  lPgno>sqlite3pag
1eb10 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 42 74  er_pagecount(pBt
1eb20 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  ->pPager) ){.   
1eb30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1eb40 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1eb50 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 67 65     }.    rc = ge
1eb60 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 50  tPage(pBt, ovflP
1eb70 67 6e 6f 2c 20 26 70 4f 76 66 6c 29 3b 0a 20 20  gno, &pOvfl);.  
1eb80 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1eb90 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67  n rc;.    ovflPg
1eba0 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 4f  no = get4byte(pO
1ebb0 76 66 6c 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  vfl->aData);.   
1ebc0 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70   rc = freePage(p
1ebd0 4f 76 66 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  Ovfl);.    sqlit
1ebe0 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70 4f  e3pager_unref(pO
1ebf0 76 66 6c 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  vfl->aData);.   
1ec00 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1ec10 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   rc;.  }.  retur
1ec20 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1ec30 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65  /*.** Create the
1ec40 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 75   byte sequence u
1ec50 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74  sed to represent
1ec60 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20   a cell on page 
1ec70 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69  pPage.** and wri
1ec80 74 65 20 74 68 61 74 20 62 79 74 65 20 73 65 71  te that byte seq
1ec90 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c  uence into pCell
1eca0 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61  [].  Overflow pa
1ecb0 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63  ges are.** alloc
1ecc0 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20  ated and filled 
1ecd0 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  in as necessary.
1ece0 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72    The calling pr
1ecf0 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65  ocedure.** is re
1ed00 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61  sponsible for ma
1ed10 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66 69 63  king sure suffic
1ed20 69 65 6e 74 20 73 70 61 63 65 20 68 61 73 20 62  ient space has b
1ed30 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  een allocated.**
1ed40 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a   for pCell[]..**
1ed50 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43  .** Note that pC
1ed60 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63  ell does not nec
1ed70 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70  essary need to p
1ed80 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67  oint to the pPag
1ed90 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61  e->aData.** area
1eda0 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70  .  pCell might p
1edb0 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d  oint to some tem
1edc0 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20  porary storage. 
1edd0 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a   The cell will.*
1ede0 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64  * be constructed
1edf0 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61   in this tempora
1ee00 72 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70  ry area then cop
1ee10 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e  ied into pPage->
1ee20 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a  aData.** later..
1ee30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
1ee40 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  llInCell(.  MemP
1ee50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
1ee60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1ee70 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
1ee80 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ains the cell */
1ee90 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1eea0 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
1eeb0 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65    /* Complete te
1eec0 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a  xt of the cell *
1eed0 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
1eee0 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20  pKey, i64 nKey, 
1eef0 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f     /* The key */
1ef00 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
1ef10 44 61 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20  Data,int nData, 
1ef20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f    /* The data */
1ef30 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20  .  int *pnSize  
1ef40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef50 20 20 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20    /* Write cell 
1ef60 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  size here */.){.
1ef70 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a    int nPayload;.
1ef80 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63    const u8 *pSrc
1ef90 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c  ;.  int nSrc, n,
1efa0 20 72 63 3b 0a 20 20 69 6e 74 20 73 70 61 63 65   rc;.  int space
1efb0 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20  Left;.  MemPage 
1efc0 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65  *pOvfl = 0;.  Me
1efd0 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73  mPage *pToReleas
1efe0 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65  e = 0;.  unsigne
1eff0 64 20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a  d char *pPrior;.
1f000 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1f010 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53  *pPayload;.  BtS
1f020 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
1f030 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20  ge->pBt;.  Pgno 
1f040 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20  pgnoOvfl = 0;.  
1f050 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a 20 20 43  int nHeader;.  C
1f060 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20  ellInfo info;.. 
1f070 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
1f080 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65  header. */.  nHe
1f090 61 64 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  ader = 0;.  if( 
1f0a0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
1f0b0 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 34      nHeader += 4
1f0c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
1f0d0 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20  e->hasData ){.  
1f0e0 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
1f0f0 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48  Varint(&pCell[nH
1f100 65 61 64 65 72 5d 2c 20 6e 44 61 74 61 29 3b 0a  eader], nData);.
1f110 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 44 61    }else{.    nDa
1f120 74 61 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 48  ta = 0;.  }.  nH
1f130 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69  eader += putVari
1f140 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65  nt(&pCell[nHeade
1f150 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65 79  r], *(u64*)&nKey
1f160 29 3b 0a 20 20 70 61 72 73 65 43 65 6c 6c 50 74  );.  parseCellPt
1f170 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
1f180 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74  &info);.  assert
1f190 28 20 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3d 3d  ( info.nHeader==
1f1a0 6e 48 65 61 64 65 72 20 29 3b 0a 20 20 61 73 73  nHeader );.  ass
1f1b0 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  ert( info.nKey==
1f1c0 6e 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74  nKey );.  assert
1f1d0 28 20 69 6e 66 6f 2e 6e 44 61 74 61 3d 3d 6e 44  ( info.nData==nD
1f1e0 61 74 61 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 46  ata );.  .  /* F
1f1f0 69 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f  ill in the paylo
1f200 61 64 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64  ad */.  nPayload
1f210 20 3d 20 6e 44 61 74 61 3b 0a 20 20 69 66 28 20   = nData;.  if( 
1f220 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
1f230 0a 20 20 20 20 70 53 72 63 20 3d 20 70 44 61 74  .    pSrc = pDat
1f240 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 44  a;.    nSrc = nD
1f250 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d  ata;.    nData =
1f260 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1f270 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65   nPayload += nKe
1f280 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4b  y;.    pSrc = pK
1f290 65 79 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e  ey;.    nSrc = n
1f2a0 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53 69  Key;.  }.  *pnSi
1f2b0 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b  ze = info.nSize;
1f2c0 0a 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 69  .  spaceLeft = i
1f2d0 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50  nfo.nLocal;.  pP
1f2e0 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b  ayload = &pCell[
1f2f0 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70 50 72 69  nHeader];.  pPri
1f300 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f  or = &pCell[info
1f310 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20  .iOverflow];..  
1f320 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e  while( nPayload>
1f330 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61  0 ){.    if( spa
1f340 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66  ceLeft==0 ){.#if
1f350 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1f360 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
1f370 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61    Pgno pgnoPtrma
1f380 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a  p = pgnoOvfl; /*
1f390 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70   Overflow page p
1f3a0 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79  ointer-map entry
1f3b0 20 70 61 67 65 20 2a 2f 0a 23 65 6e 64 69 66 0a   page */.#endif.
1f3c0 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
1f3d0 61 74 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f  atePage(pBt, &pO
1f3e0 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20  vfl, &pgnoOvfl, 
1f3f0 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69  pgnoOvfl, 0);.#i
1f400 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1f410 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
1f420 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74     /* If the dat
1f430 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61  abase supports a
1f440 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20  uto-vacuum, and 
1f450 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75  the second or su
1f460 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a  bsequent.      *
1f470 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  * overflow page 
1f480 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74  is being allocat
1f490 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79  ed, add an entry
1f4a0 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   to the pointer-
1f4b0 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  map.      ** for
1f4c0 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20   that page now. 
1f4d0 54 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68  The entry for th
1f4e0 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
1f4f0 20 70 61 67 65 20 77 69 6c 6c 20 62 65 0a 20 20   page will be.  
1f500 20 20 20 20 2a 2a 20 61 64 64 65 64 20 6c 61 74      ** added lat
1f510 65 72 2c 20 62 79 20 74 68 65 20 69 6e 73 65 72  er, by the inser
1f520 74 43 65 6c 6c 28 29 20 72 6f 75 74 69 6e 65 2e  tCell() routine.
1f530 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1f540 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
1f550 75 75 6d 20 26 26 20 70 67 6e 6f 50 74 72 6d 61  uum && pgnoPtrma
1f560 70 21 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49  p!=0 && rc==SQLI
1f570 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1f580 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
1f590 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 50  pBt, pgnoOvfl, P
1f5a0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c  TRMAP_OVERFLOW2,
1f5b0 20 70 67 6e 6f 50 74 72 6d 61 70 29 3b 0a 20 20   pgnoPtrmap);.  
1f5c0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1f5d0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
1f5e0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1f5f0 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20  (pToRelease);.  
1f600 20 20 20 20 20 20 2f 2a 20 63 6c 65 61 72 43 65        /* clearCe
1f610 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  ll(pPage, pCell)
1f620 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74  ; */.        ret
1f630 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1f640 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
1f650 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29  Prior, pgnoOvfl)
1f660 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
1f670 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
1f680 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61 73  .      pToReleas
1f690 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20  e = pOvfl;.     
1f6a0 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d   pPrior = pOvfl-
1f6b0 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 70 75  >aData;.      pu
1f6c0 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 30  t4byte(pPrior, 0
1f6d0 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c 6f 61  );.      pPayloa
1f6e0 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74  d = &pOvfl->aDat
1f6f0 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70 61 63  a[4];.      spac
1f700 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75 73 61  eLeft = pBt->usa
1f710 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20  bleSize - 4;.   
1f720 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c   }.    n = nPayl
1f730 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73  oad;.    if( n>s
1f740 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20 73  paceLeft ) n = s
1f750 70 61 63 65 4c 65 66 74 3b 0a 20 20 20 20 69 66  paceLeft;.    if
1f760 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e  ( n>nSrc ) n = n
1f770 53 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Src;.    assert(
1f780 20 70 53 72 63 20 29 3b 0a 20 20 20 20 6d 65 6d   pSrc );.    mem
1f790 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53  cpy(pPayload, pS
1f7a0 72 63 2c 20 6e 29 3b 0a 20 20 20 20 6e 50 61 79  rc, n);.    nPay
1f7b0 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70  load -= n;.    p
1f7c0 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20  Payload += n;.  
1f7d0 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20    pSrc += n;.   
1f7e0 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20   nSrc -= n;.    
1f7f0 73 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a  spaceLeft -= n;.
1f800 20 20 20 20 69 66 28 20 6e 53 72 63 3d 3d 30 20      if( nSrc==0 
1f810 29 7b 0a 20 20 20 20 20 20 6e 53 72 63 20 3d 20  ){.      nSrc = 
1f820 6e 44 61 74 61 3b 0a 20 20 20 20 20 20 70 53 72  nData;.      pSr
1f830 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 7d  c = pData;.    }
1f840 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61  .  }.  releasePa
1f850 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a  ge(pToRelease);.
1f860 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f870 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
1f880 6e 67 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e  nge the MemPage.
1f890 70 50 61 72 65 6e 74 20 70 6f 69 6e 74 65 72 20  pParent pointer 
1f8a0 6f 6e 20 74 68 65 20 70 61 67 65 20 77 68 6f 73  on the page whos
1f8b0 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 67  e number is.** g
1f8c0 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63 6f  iven in the seco
1f8d0 6e 64 20 61 72 67 75 6d 65 6e 74 20 73 6f 20 74  nd argument so t
1f8e0 68 61 74 20 4d 65 6d 50 61 67 65 2e 70 50 61 72  hat MemPage.pPar
1f8f0 65 6e 74 20 68 6f 6c 64 73 20 74 68 65 0a 2a 2a  ent holds the.**
1f900 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20   pointer in the 
1f910 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 2e 0a  third argument..
1f920 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
1f930 70 61 72 65 6e 74 50 61 67 65 28 42 74 53 68 61  parentPage(BtSha
1f940 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
1f950 67 6e 6f 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4e  gno, MemPage *pN
1f960 65 77 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 64  ewParent, int id
1f970 78 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  x){.  MemPage *p
1f980 54 68 69 73 3b 0a 20 20 75 6e 73 69 67 6e 65 64  This;.  unsigned
1f990 20 63 68 61 72 20 2a 61 44 61 74 61 3b 0a 0a 20   char *aData;.. 
1f9a0 20 61 73 73 65 72 74 28 20 70 4e 65 77 50 61 72   assert( pNewPar
1f9b0 65 6e 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ent!=0 );.  if( 
1f9c0 70 67 6e 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e  pgno==0 ) return
1f9d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
1f9e0 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
1f9f0 72 21 3d 30 20 29 3b 0a 20 20 61 44 61 74 61 20  r!=0 );.  aData 
1fa00 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c  = sqlite3pager_l
1fa10 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65  ookup(pBt->pPage
1fa20 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  r, pgno);.  if( 
1fa30 61 44 61 74 61 20 29 7b 0a 20 20 20 20 70 54 68  aData ){.    pTh
1fa40 69 73 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 26  is = (MemPage*)&
1fa50 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53  aData[pBt->pageS
1fa60 69 7a 65 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  ize];.    assert
1fa70 28 20 70 54 68 69 73 2d 3e 61 44 61 74 61 3d 3d  ( pThis->aData==
1fa80 61 44 61 74 61 20 29 3b 0a 20 20 20 20 69 66 28  aData );.    if(
1fa90 20 70 54 68 69 73 2d 3e 69 73 49 6e 69 74 20 29   pThis->isInit )
1faa0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 68 69  {.      if( pThi
1fab0 73 2d 3e 70 50 61 72 65 6e 74 21 3d 70 4e 65 77  s->pParent!=pNew
1fac0 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  Parent ){.      
1fad0 20 20 69 66 28 20 70 54 68 69 73 2d 3e 70 50 61    if( pThis->pPa
1fae0 72 65 6e 74 20 29 20 73 71 6c 69 74 65 33 70 61  rent ) sqlite3pa
1faf0 67 65 72 5f 75 6e 72 65 66 28 70 54 68 69 73 2d  ger_unref(pThis-
1fb00 3e 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 29  >pParent->aData)
1fb10 3b 0a 20 20 20 20 20 20 20 20 70 54 68 69 73 2d  ;.        pThis-
1fb20 3e 70 50 61 72 65 6e 74 20 3d 20 70 4e 65 77 50  >pParent = pNewP
1fb30 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 73  arent;.        s
1fb40 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65 66 28  qlite3pager_ref(
1fb50 70 4e 65 77 50 61 72 65 6e 74 2d 3e 61 44 61 74  pNewParent->aDat
1fb60 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  a);.      }.    
1fb70 20 20 70 54 68 69 73 2d 3e 69 64 78 50 61 72 65    pThis->idxPare
1fb80 6e 74 20 3d 20 69 64 78 3b 0a 20 20 20 20 7d 0a  nt = idx;.    }.
1fb90 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
1fba0 5f 75 6e 72 65 66 28 61 44 61 74 61 29 3b 0a 20  _unref(aData);. 
1fbb0 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
1fbc0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1fbd0 55 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75  UM.  if( pBt->au
1fbe0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
1fbf0 72 65 74 75 72 6e 20 70 74 72 6d 61 70 50 75 74  return ptrmapPut
1fc00 28 70 42 74 2c 20 70 67 6e 6f 2c 20 50 54 52 4d  (pBt, pgno, PTRM
1fc10 41 50 5f 42 54 52 45 45 2c 20 70 4e 65 77 50 61  AP_BTREE, pNewPa
1fc20 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d  rent->pgno);.  }
1fc30 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
1fc40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
1fc50 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
1fc60 65 20 70 50 61 72 65 6e 74 20 70 6f 69 6e 74 65  e pParent pointe
1fc70 72 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 72 65  r of all childre
1fc80 6e 20 6f 66 20 70 50 61 67 65 20 74 6f 20 70 6f  n of pPage to po
1fc90 69 6e 74 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 70  int back.** to p
1fca0 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f  Page..**.** In o
1fcb0 74 68 65 72 20 77 6f 72 64 73 2c 20 66 6f 72 20  ther words, for 
1fcc0 65 76 65 72 79 20 63 68 69 6c 64 20 6f 66 20 70  every child of p
1fcd0 50 61 67 65 2c 20 69 6e 76 6f 6b 65 20 72 65 70  Page, invoke rep
1fce0 61 72 65 6e 74 50 61 67 65 28 29 0a 2a 2a 20 74  arentPage().** t
1fcf0 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
1fd00 20 65 61 63 68 20 63 68 69 6c 64 20 6b 6e 6f 77   each child know
1fd10 73 20 74 68 61 74 20 70 50 61 67 65 20 69 73 20  s that pPage is 
1fd20 69 74 73 20 70 61 72 65 6e 74 2e 0a 2a 2a 0a 2a  its parent..**.*
1fd30 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
1fd40 65 74 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72  ets called after
1fd50 20 79 6f 75 20 6d 65 6d 63 70 79 28 29 20 6f 6e   you memcpy() on
1fd60 65 20 70 61 67 65 20 69 6e 74 6f 0a 2a 2a 20 61  e page into.** a
1fd70 6e 6f 74 68 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  nother..*/.stati
1fd80 63 20 69 6e 74 20 72 65 70 61 72 65 6e 74 43 68  c int reparentCh
1fd90 69 6c 64 50 61 67 65 73 28 4d 65 6d 50 61 67 65  ildPages(MemPage
1fda0 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
1fdb0 69 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  i;.  BtShared *p
1fdc0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
1fdd0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1fde0 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50  TE_OK;..  if( pP
1fdf0 61 67 65 2d 3e 6c 65 61 66 20 29 20 72 65 74 75  age->leaf ) retu
1fe00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
1fe10 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67   for(i=0; i<pPag
1fe20 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a  e->nCell; i++){.
1fe30 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20      u8 *pCell = 
1fe40 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
1fe50 69 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61  i);.    if( !pPa
1fe60 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
1fe70 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74 50    rc = reparentP
1fe80 61 67 65 28 70 42 74 2c 20 67 65 74 34 62 79 74  age(pBt, get4byt
1fe90 65 28 70 43 65 6c 6c 29 2c 20 70 50 61 67 65 2c  e(pCell), pPage,
1fea0 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   i);.      if( r
1feb0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
1fec0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1fed0 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65    }.  if( !pPage
1fee0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 63  ->leaf ){.    rc
1fef0 20 3d 20 72 65 70 61 72 65 6e 74 50 61 67 65 28   = reparentPage(
1ff00 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 26 70  pBt, get4byte(&p
1ff10 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
1ff20 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
1ff30 2c 20 0a 20 20 20 20 20 20 20 70 50 61 67 65 2c  , .       pPage,
1ff40 20 69 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e   i);.    pPage->
1ff50 69 64 78 53 68 69 66 74 20 3d 20 30 3b 0a 20 20  idxShift = 0;.  
1ff60 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1ff70 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
1ff80 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f  he i-th cell fro
1ff90 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20 72  m pPage.  This r
1ffa0 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20 70  outine effects p
1ffb0 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68  Page only..** Th
1ffc0 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  e cell content i
1ffd0 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64  s not freed or d
1ffe0 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20  eallocated.  It 
1fff0 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a  is assumed that.
20000 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  ** the cell cont
20010 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70  ent has been cop
20020 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c  ied someplace el
20030 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
20040 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65  e just.** remove
20050 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  s the reference 
20060 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d  to the cell from
20070 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73   pPage..**.** "s
20080 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e  z" must be the n
20090 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
200a0 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73  n the cell..*/.s
200b0 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43  tatic void dropC
200c0 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
200d0 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74  ge, int idx, int
200e0 20 73 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20   sz){.  int i;  
200f0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
20100 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
20110 20 70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   pc;         /* 
20120 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63  Offset to cell c
20130 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62  ontent of cell b
20140 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a  eing deleted */.
20150 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
20160 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74    /* pPage->aDat
20170 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20  a */.  u8 *ptr; 
20180 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
20190 6f 20 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f  o move bytes aro
201a0 75 6e 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b  und within data[
201b0 5d 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  ] */..  assert( 
201c0 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50  idx>=0 && idx<pP
201d0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
201e0 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c  assert( sz==cell
201f0 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29  Size(pPage, idx)
20200 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
20210 6c 69 74 65 33 70 61 67 65 72 5f 69 73 77 72 69  lite3pager_iswri
20220 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 61 44  teable(pPage->aD
20230 61 74 61 29 20 29 3b 0a 20 20 64 61 74 61 20 3d  ata) );.  data =
20240 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
20250 20 70 74 72 20 3d 20 26 64 61 74 61 5b 70 50 61   ptr = &data[pPa
20260 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ge->cellOffset +
20270 20 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20   2*idx];.  pc = 
20280 67 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20  get2byte(ptr);. 
20290 20 61 73 73 65 72 74 28 20 70 63 3e 31 30 20 26   assert( pc>10 &
202a0 26 20 70 63 2b 73 7a 3c 3d 70 50 61 67 65 2d 3e  & pc+sz<=pPage->
202b0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
202c0 29 3b 0a 20 20 66 72 65 65 53 70 61 63 65 28 70  );.  freeSpace(p
202d0 50 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20  Page, pc, sz);. 
202e0 20 66 6f 72 28 69 3d 69 64 78 2b 31 3b 20 69 3c   for(i=idx+1; i<
202f0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b  pPage->nCell; i+
20300 2b 2c 20 70 74 72 2b 3d 32 29 7b 0a 20 20 20 20  +, ptr+=2){.    
20310 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b 32 5d 3b  ptr[0] = ptr[2];
20320 0a 20 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74  .    ptr[1] = pt
20330 72 5b 33 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 67  r[3];.  }.  pPag
20340 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75  e->nCell--;.  pu
20350 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61  t2byte(&data[pPa
20360 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d  ge->hdrOffset+3]
20370 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b  , pPage->nCell);
20380 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
20390 2b 3d 20 32 3b 0a 20 20 70 50 61 67 65 2d 3e 69  += 2;.  pPage->i
203a0 64 78 53 68 69 66 74 20 3d 20 31 3b 0a 7d 0a 0a  dxShift = 1;.}..
203b0 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e  /*.** Insert a n
203c0 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65  ew cell on pPage
203d0 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22   at cell index "
203e0 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74  i".  pCell point
203f0 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  s to the.** cont
20400 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e  ent of the cell.
20410 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  .**.** If the ce
20420 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20  ll content will 
20430 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c  fit on the page,
20440 20 74 68 65 6e 20 70 75 74 20 69 74 20 74 68 65   then put it the
20450 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69  re.  If it.** wi
20460 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e  ll not fit, then
20470 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
20480 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
20490 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a   into pTemp if.*
204a0 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e  * pTemp is not n
204b0 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73  ull.  Regardless
204c0 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63   of pTemp, alloc
204d0 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a  ate a new entry.
204e0 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 4f 76  ** in pPage->aOv
204f0 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74  fl[] and make it
20500 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 65   point to the ce
20510 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74 68  ll content (eith
20520 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f  er.** in pTemp o
20530 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  r the original p
20540 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72  Cell) and also r
20550 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78 2e  ecord its index.
20560 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20   .** Allocating 
20570 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70  a new entry in p
20580 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d  Page->aCell[] im
20590 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20 70  plies that .** p
205a0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
205b0 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a  is incremented..
205c0 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70 20 69  **.** If nSkip i
205d0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
205e0 20 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74 68 65   do not copy the
205f0 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62 79 74   first nSkip byt
20600 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63 65 6c  es of the.** cel
20610 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  l. The caller wi
20620 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68 65  ll overwrite the
20630 6d 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  m after this fun
20640 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49  ction returns. I
20650 66 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20 6e 6f  f.** nSkip is no
20660 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70 43 65  n-zero, then pCe
20670 6c 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69 6e 74  ll may not point
20680 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 6d   to an invalid m
20690 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 0a  emory location .
206a0 2a 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b 6e 53  ** (but pCell+nS
206b0 6b 69 70 20 69 73 20 61 6c 77 61 79 73 20 76 61  kip is always va
206c0 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lid)..*/.static 
206d0 69 6e 74 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a  int insertCell(.
206e0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
206f0 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f  ,   /* Page into
20700 20 77 68 69 63 68 20 77 65 20 61 72 65 20 63 6f   which we are co
20710 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69  pying */.  int i
20720 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
20730 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73  New cell becomes
20740 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f   the i-th cell o
20750 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  f the page */.  
20760 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  u8 *pCell,      
20770 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20    /* Content of 
20780 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a  the new cell */.
20790 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20 20    int sz,       
207a0 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
207b0 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c  content in pCell
207c0 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c   */.  u8 *pTemp,
207d0 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
207e0 73 74 6f 72 61 67 65 20 73 70 61 63 65 20 66 6f  storage space fo
207f0 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64  r pCell, if need
20800 65 64 20 2a 2f 0a 20 20 75 38 20 6e 53 6b 69 70  ed */.  u8 nSkip
20810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
20820 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20 66 69  not write the fi
20830 72 73 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20  rst nSkip bytes 
20840 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 29  of the cell */.)
20850 7b 0a 20 20 69 6e 74 20 69 64 78 3b 20 20 20 20  {.  int idx;    
20860 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
20870 6f 20 77 72 69 74 65 20 6e 65 77 20 63 65 6c 6c  o write new cell
20880 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74 61   content in data
20890 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20  [] */.  int j;  
208a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
208b0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
208c0 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20  nt top;         
208d0 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
208e0 66 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e  f content for an
208f0 79 20 63 65 6c 6c 20 69 6e 20 64 61 74 61 5b 5d  y cell in data[]
20900 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20   */.  int end;  
20910 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
20920 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 6c   byte past the l
20930 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  ast cell pointer
20940 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
20950 69 6e 74 20 69 6e 73 3b 20 20 20 20 20 20 20 20  int ins;        
20960 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64 61    /* Index in da
20970 74 61 5b 5d 20 77 68 65 72 65 20 6e 65 77 20 63  ta[] where new c
20980 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73 20 69  ell pointer is i
20990 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74  nserted */.  int
209a0 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 2f   hdr;          /
209b0 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 64 61  * Offset into da
209c0 74 61 5b 5d 20 6f 66 20 74 68 65 20 70 61 67 65  ta[] of the page
209d0 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
209e0 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f   cellOffset;   /
209f0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 66 69 72  * Address of fir
20a00 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  st cell pointer 
20a10 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75  in data[] */.  u
20a20 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
20a30 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20   /* The content 
20a40 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67  of the whole pag
20a50 65 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20  e */.  u8 *ptr; 
20a60 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
20a70 20 66 6f 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f   for moving info
20a80 72 6d 61 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69  rmation around i
20a90 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 61  n data[] */..  a
20aa0 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69  ssert( i>=0 && i
20ab0 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70  <=pPage->nCell+p
20ac0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
20ad0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d  );.  assert( sz=
20ae0 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61  =cellSizePtr(pPa
20af0 67 65 2c 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20  ge, pCell) );.  
20b00 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 70  assert( sqlite3p
20b10 61 67 65 72 5f 69 73 77 72 69 74 65 61 62 6c 65  ager_iswriteable
20b20 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 20 29  (pPage->aData) )
20b30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  ;.  if( pPage->n
20b40 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32  Overflow || sz+2
20b50 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b  >pPage->nFree ){
20b60 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70 20 29  .    if( pTemp )
20b70 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  {.      memcpy(p
20b80 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70 43 65 6c  Temp+nSkip, pCel
20b90 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69  l+nSkip, sz-nSki
20ba0 70 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20  p);.      pCell 
20bb0 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20  = pTemp;.    }. 
20bc0 20 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f     j = pPage->nO
20bd0 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61  verflow++;.    a
20be0 73 73 65 72 74 28 20 6a 3c 73 69 7a 65 6f 66 28  ssert( j<sizeof(
20bf0 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29 2f 73 69  pPage->aOvfl)/si
20c00 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66  zeof(pPage->aOvf
20c10 6c 5b 30 5d 29 20 29 3b 0a 20 20 20 20 70 50 61  l[0]) );.    pPa
20c20 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70 43 65  ge->aOvfl[j].pCe
20c30 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20  ll = pCell;.    
20c40 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e  pPage->aOvfl[j].
20c50 69 64 78 20 3d 20 69 3b 0a 20 20 20 20 70 50 61  idx = i;.    pPa
20c60 67 65 2d 3e 6e 46 72 65 65 20 3d 20 30 3b 0a 20  ge->nFree = 0;. 
20c70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 61 74 61   }else{.    data
20c80 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
20c90 0a 20 20 20 20 68 64 72 20 3d 20 70 50 61 67 65  .    hdr = pPage
20ca0 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20  ->hdrOffset;.   
20cb0 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28   top = get2byte(
20cc0 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
20cd0 20 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20     cellOffset = 
20ce0 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
20cf0 74 3b 0a 20 20 20 20 65 6e 64 20 3d 20 63 65 6c  t;.    end = cel
20d00 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67  lOffset + 2*pPag
20d10 65 2d 3e 6e 43 65 6c 6c 20 2b 20 32 3b 0a 20 20  e->nCell + 2;.  
20d20 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73    ins = cellOffs
20d30 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20 20 69 66  et + 2*i;.    if
20d40 28 20 65 6e 64 20 3e 20 74 6f 70 20 2d 20 73 7a  ( end > top - sz
20d50 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
20d60 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67   = defragmentPag
20d70 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
20d80 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
20d90 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
20da0 20 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62       top = get2b
20db0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
20dc0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
20dd0 20 65 6e 64 20 2b 20 73 7a 20 3c 3d 20 74 6f 70   end + sz <= top
20de0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 64   );.    }.    id
20df0 78 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63  x = allocateSpac
20e00 65 28 70 50 61 67 65 2c 20 73 7a 29 3b 0a 20 20  e(pPage, sz);.  
20e10 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 30 20    assert( idx>0 
20e20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  );.    assert( e
20e30 6e 64 20 3c 3d 20 67 65 74 32 62 79 74 65 28 26  nd <= get2byte(&
20e40 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a  data[hdr+5]) );.
20e50 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c      pPage->nCell
20e60 2b 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e  ++;.    pPage->n
20e70 46 72 65 65 20 2d 3d 20 32 3b 0a 20 20 20 20 6d  Free -= 2;.    m
20e80 65 6d 63 70 79 28 26 64 61 74 61 5b 69 64 78 2b  emcpy(&data[idx+
20e90 6e 53 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53  nSkip], pCell+nS
20ea0 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a  kip, sz-nSkip);.
20eb0 20 20 20 20 66 6f 72 28 6a 3d 65 6e 64 2d 32 2c      for(j=end-2,
20ec0 20 70 74 72 3d 26 64 61 74 61 5b 6a 5d 3b 20 6a   ptr=&data[j]; j
20ed0 3e 69 6e 73 3b 20 6a 2d 3d 32 2c 20 70 74 72 2d  >ins; j-=2, ptr-
20ee0 3d 32 29 7b 0a 20 20 20 20 20 20 70 74 72 5b 30  =2){.      ptr[0
20ef0 5d 20 3d 20 70 74 72 5b 2d 32 5d 3b 0a 20 20 20  ] = ptr[-2];.   
20f00 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b     ptr[1] = ptr[
20f10 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  -1];.    }.    p
20f20 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e  ut2byte(&data[in
20f30 73 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75  s], idx);.    pu
20f40 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
20f50 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c  +3], pPage->nCel
20f60 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69  l);.    pPage->i
20f70 64 78 53 68 69 66 74 20 3d 20 31 3b 0a 23 69 66  dxShift = 1;.#if
20f80 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
20f90 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
20fa0 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  if( pPage->pBt->
20fb0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
20fc0 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
20fd0 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f  may contain a po
20fe0 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72  inter to an over
20ff0 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 73 6f  flow page. If so
21000 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a  , write.      **
21010 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74   the entry for t
21020 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
21030 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
21040 72 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a  r map..      */.
21050 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69        CellInfo i
21060 6e 66 6f 3b 0a 20 20 20 20 20 20 70 61 72 73 65  nfo;.      parse
21070 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
21080 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
21090 20 20 20 20 69 66 28 20 28 69 6e 66 6f 2e 6e 44      if( (info.nD
210a0 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b  ata+(pPage->intK
210b0 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29  ey?0:info.nKey))
210c0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
210d0 20 20 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e          Pgno pgn
210e0 6f 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65  oOvfl = get4byte
210f0 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
21100 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20  erflow]);.      
21110 20 20 69 6e 74 20 72 63 20 3d 20 70 74 72 6d 61    int rc = ptrma
21120 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c  pPut(pPage->pBt,
21130 20 70 67 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d 41   pgnoOvfl, PTRMA
21140 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61  P_OVERFLOW1, pPa
21150 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  ge->pgno);.     
21160 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
21170 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
21180 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
21190 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 72 65  #endif.  }..  re
211a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
211b0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c  }../*.** Add a l
211c0 69 73 74 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20  ist of cells to 
211d0 61 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67  a page.  The pag
211e0 65 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74  e should be init
211f0 69 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20  ially empty..** 
21200 54 68 65 20 63 65 6c 6c 73 20 61 72 65 20 67 75  The cells are gu
21210 61 72 61 6e 74 65 65 64 20 74 6f 20 66 69 74 20  aranteed to fit 
21220 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  on the page..*/.
21230 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
21240 6d 62 6c 65 50 61 67 65 28 0a 20 20 4d 65 6d 50  mblePage(.  MemP
21250 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a  age *pPage,   /*
21260 20 54 68 65 20 70 61 67 65 20 74 6f 20 62 65 20   The page to be 
21270 61 73 73 65 6d 62 6c 69 65 64 20 2a 2f 0a 20 20  assemblied */.  
21280 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20  int nCell,      
21290 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
212a0 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20  of cells to add 
212b0 74 6f 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  to this page */.
212c0 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20    u8 **apCell,  
212d0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20      /* Pointers 
212e0 74 6f 20 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a  to cell bodies *
212f0 2f 0a 20 20 69 6e 74 20 2a 61 53 69 7a 65 20 20  /.  int *aSize  
21300 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f        /* Sizes o
21310 66 20 74 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29  f the cells */.)
21320 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
21330 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
21340 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74  unter */.  int t
21350 6f 74 61 6c 53 69 7a 65 3b 20 20 20 20 2f 2a 20  otalSize;    /* 
21360 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c  Total size of al
21370 6c 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 69 6e 74  l cells */.  int
21380 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 2f   hdr;          /
21390 2a 20 49 6e 64 65 78 20 6f 66 20 70 61 67 65 20  * Index of page 
213a0 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
213b0 63 65 6c 6c 70 74 72 3b 20 20 20 20 20 20 2f 2a  cellptr;      /*
213c0 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74   Address of next
213d0 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
213e0 0a 20 20 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b  .  int cellbody;
213f0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
21400 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64  of next cell bod
21410 79 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  y */.  u8 *data;
21420 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
21430 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a 2f   for the page */
21440 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
21450 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
21460 29 3b 0a 20 20 74 6f 74 61 6c 53 69 7a 65 20 3d  );.  totalSize =
21470 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
21480 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
21490 20 20 74 6f 74 61 6c 53 69 7a 65 20 2b 3d 20 61    totalSize += a
214a0 53 69 7a 65 5b 69 5d 3b 0a 20 20 7d 0a 20 20 61  Size[i];.  }.  a
214b0 73 73 65 72 74 28 20 74 6f 74 61 6c 53 69 7a 65  ssert( totalSize
214c0 2b 32 2a 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d  +2*nCell<=pPage-
214d0 3e 6e 46 72 65 65 20 29 3b 0a 20 20 61 73 73 65  >nFree );.  asse
214e0 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  rt( pPage->nCell
214f0 3d 3d 30 20 29 3b 0a 20 20 63 65 6c 6c 70 74 72  ==0 );.  cellptr
21500 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
21510 66 73 65 74 3b 0a 20 20 64 61 74 61 20 3d 20 70  fset;.  data = p
21520 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68  Page->aData;.  h
21530 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
21540 66 66 73 65 74 3b 0a 20 20 70 75 74 32 62 79 74  ffset;.  put2byt
21550 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20  e(&data[hdr+3], 
21560 6e 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20 6e 43  nCell);.  if( nC
21570 65 6c 6c 20 29 7b 0a 20 20 20 20 63 65 6c 6c 62  ell ){.    cellb
21580 6f 64 79 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70  ody = allocateSp
21590 61 63 65 28 70 50 61 67 65 2c 20 74 6f 74 61 6c  ace(pPage, total
215a0 53 69 7a 65 29 3b 0a 20 20 20 20 61 73 73 65 72  Size);.    asser
215b0 74 28 20 63 65 6c 6c 62 6f 64 79 3e 30 20 29 3b  t( cellbody>0 );
215c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
215d0 67 65 2d 3e 6e 46 72 65 65 20 3e 3d 20 32 2a 6e  ge->nFree >= 2*n
215e0 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 50 61 67  Cell );.    pPag
215f0 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 32 2a 6e 43  e->nFree -= 2*nC
21600 65 6c 6c 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ell;.    for(i=0
21610 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
21620 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28  .      put2byte(
21630 26 64 61 74 61 5b 63 65 6c 6c 70 74 72 5d 2c 20  &data[cellptr], 
21640 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 20 20 20  cellbody);.     
21650 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 65   memcpy(&data[ce
21660 6c 6c 62 6f 64 79 5d 2c 20 61 70 43 65 6c 6c 5b  llbody], apCell[
21670 69 5d 2c 20 61 53 69 7a 65 5b 69 5d 29 3b 0a 20  i], aSize[i]);. 
21680 20 20 20 20 20 63 65 6c 6c 70 74 72 20 2b 3d 20       cellptr += 
21690 32 3b 0a 20 20 20 20 20 20 63 65 6c 6c 62 6f 64  2;.      cellbod
216a0 79 20 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20  y += aSize[i];. 
216b0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
216c0 20 63 65 6c 6c 62 6f 64 79 3d 3d 70 50 61 67 65   cellbody==pPage
216d0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
216e0 65 20 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  e );.  }.  pPage
216f0 2d 3e 6e 43 65 6c 6c 20 3d 20 6e 43 65 6c 6c 3b  ->nCell = nCell;
21700 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
21710 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65 74 65  llowing paramete
21720 72 73 20 64 65 74 65 72 6d 69 6e 65 20 68 6f 77  rs determine how
21730 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74 20 70   many adjacent p
21740 61 67 65 73 20 67 65 74 20 69 6e 76 6f 6c 76 65  ages get involve
21750 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61 6e 63  d.** in a balanc
21760 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ing operation.  
21770 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  NN is the number
21780 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e   of neighbors on
21790 20 65 69 74 68 65 72 20 73 69 64 65 0a 2a 2a 20   either side.** 
217a0 6f 66 20 74 68 65 20 70 61 67 65 20 74 68 61 74  of the page that
217b0 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20   participate in 
217c0 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70  the balancing op
217d0 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69 73 20  eration.  NB is 
217e0 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d  the.** total num
217f0 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61  ber of pages tha
21800 74 20 70 61 72 74 69 63 69 70 61 74 65 2c 20 69  t participate, i
21810 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 61 72  ncluding the tar
21820 67 65 74 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20  get page and.** 
21830 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20  NN neighbors on 
21840 65 69 74 68 65 72 20 73 69 64 65 2e 0a 2a 2a 0a  either side..**.
21850 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 76  ** The minimum v
21860 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20 31 20  alue of NN is 1 
21870 28 6f 66 20 63 6f 75 72 73 65 29 2e 20 20 49 6e  (of course).  In
21880 63 72 65 61 73 69 6e 67 20 4e 4e 20 61 62 6f 76  creasing NN abov
21890 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f 72 20  e 1.** (to 2 or 
218a0 33 29 20 67 69 76 65 73 20 61 20 6d 6f 64 65 73  3) gives a modes
218b0 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 69 6e  t improvement in
218c0 20 53 45 4c 45 43 54 20 61 6e 64 20 44 45 4c 45   SELECT and DELE
218d0 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a  TE performance.*
218e0 2a 20 69 6e 20 65 78 63 68 61 6e 67 65 20 66 6f  * in exchange fo
218f0 72 20 61 20 6c 61 72 67 65 72 20 64 65 67 72 61  r a larger degra
21900 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45 52 54  dation in INSERT
21910 20 61 6e 64 20 55 50 44 41 54 45 20 70 65 72 66   and UPDATE perf
21920 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20  ormance..** The 
21930 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70 70 65  value of NN appe
21940 61 72 73 20 74 6f 20 67 69 76 65 20 74 68 65 20  ars to give the 
21950 62 65 73 74 20 72 65 73 75 6c 74 73 20 6f 76 65  best results ove
21960 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  rall..*/.#define
21970 20 4e 4e 20 31 20 20 20 20 20 20 20 20 20 20 20   NN 1           
21980 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e    /* Number of n
21990 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68  eighbors on eith
219a0 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67 65  er side of pPage
219b0 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42 20 28   */.#define NB (
219c0 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f 2a 20  NN*2+1)      /* 
219d0 54 6f 74 61 6c 20 70 61 67 65 73 20 69 6e 76 6f  Total pages invo
219e0 6c 76 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61  lved in the bala
219f0 6e 63 65 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61  nce */../* Forwa
21a00 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
21a10 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
21a20 63 65 28 4d 65 6d 50 61 67 65 2a 2c 20 69 6e 74  ce(MemPage*, int
21a30 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
21a40 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c  TE_OMIT_QUICKBAL
21a50 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ANCE./*.** This 
21a60 76 65 72 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e  version of balan
21a70 63 65 28 29 20 68 61 6e 64 6c 65 73 20 74 68 65  ce() handles the
21a80 20 63 6f 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20   common special 
21a90 63 61 73 65 20 77 68 65 72 65 0a 2a 2a 20 61 20  case where.** a 
21aa0 6e 65 77 20 65 6e 74 72 79 20 69 73 20 62 65 69  new entry is bei
21ab0 6e 67 20 69 6e 73 65 72 74 65 64 20 6f 6e 20 74  ng inserted on t
21ac0 68 65 20 65 78 74 72 65 6d 65 20 72 69 67 68 74  he extreme right
21ad0 2d 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74  -end of the.** t
21ae0 72 65 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f  ree, in other wo
21af0 72 64 73 2c 20 77 68 65 6e 20 74 68 65 20 6e 65  rds, when the ne
21b00 77 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 63  w entry will bec
21b10 6f 6d 65 20 74 68 65 20 6c 61 72 67 65 73 74 0a  ome the largest.
21b20 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  ** entry in the 
21b30 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74  tree..**.** Inst
21b40 65 61 64 20 6f 66 20 74 72 79 69 6e 67 20 62 61  ead of trying ba
21b50 6c 61 6e 63 65 20 74 68 65 20 33 20 72 69 67 68  lance the 3 righ
21b60 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61 67 65  t-most leaf page
21b70 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61  s, just add.** a
21b80 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65   new page to the
21b90 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
21ba0 20 61 6e 64 20 70 75 74 20 74 68 65 20 6f 6e 65   and put the one
21bb0 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a   new entry in.**
21bc0 20 74 68 61 74 20 70 61 67 65 2e 20 20 54 68 69   that page.  Thi
21bd0 73 20 6c 65 61 76 65 73 20 74 68 65 20 72 69 67  s leaves the rig
21be0 68 74 20 73 69 64 65 20 6f 66 20 74 68 65 20 74  ht side of the t
21bf0 72 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20  ree somewhat.** 
21c00 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42 75 74  unbalanced.  But
21c10 20 6f 64 64 73 20 61 72 65 20 74 68 61 74 20 77   odds are that w
21c20 65 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74  e will be insert
21c30 69 6e 67 20 6e 65 77 20 65 6e 74 72 69 65 73 0a  ing new entries.
21c40 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 73 6f  ** at the end so
21c50 6f 6e 20 61 66 74 65 72 77 61 72 64 73 20 73 6f  on afterwards so
21c60 20 74 68 65 20 6e 65 61 72 6c 79 20 65 6d 70 74   the nearly empt
21c70 79 20 70 61 67 65 20 77 69 6c 6c 20 71 75 69 63  y page will quic
21c80 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20  kly.** fill up. 
21c90 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a   On average..**.
21ca0 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68 65 20  ** pPage is the 
21cb0 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20  leaf page which 
21cc0 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  is the right-mos
21cd0 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 74 72  t page in the tr
21ce0 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69  ee..** pParent i
21cf0 73 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20 70  s its parent.  p
21d00 50 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61  Page must have a
21d10 20 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77   single overflow
21d20 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68 20   entry.** which 
21d30 69 73 20 61 6c 73 6f 20 74 68 65 20 72 69 67 68  is also the righ
21d40 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20  t-most entry on 
21d50 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  the page..*/.sta
21d60 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  tic int balance_
21d70 71 75 69 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70  quick(MemPage *p
21d80 50 61 67 65 2c 20 4d 65 6d 50 61 67 65 20 2a 70  Page, MemPage *p
21d90 50 61 72 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72  Parent){.  int r
21da0 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  c;.  MemPage *pN
21db0 65 77 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e  ew;.  Pgno pgnoN
21dc0 65 77 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 3b  ew;.  u8 *pCell;
21dd0 0a 20 20 69 6e 74 20 73 7a 43 65 6c 6c 3b 0a 20  .  int szCell;. 
21de0 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
21df0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
21e00 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
21e10 69 6e 74 20 70 61 72 65 6e 74 49 64 78 20 3d 20  int parentIdx = 
21e20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 20  pParent->nCell; 
21e30 20 20 2f 2a 20 70 50 61 72 65 6e 74 20 6e 65 77    /* pParent new
21e40 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e   divider cell in
21e50 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72  dex */.  int par
21e60 65 6e 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20  entSize;        
21e70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
21e80 7a 65 20 6f 66 20 6e 65 77 20 64 69 76 69 64 65  ze of new divide
21e90 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 70  r cell */.  u8 p
21ea0 61 72 65 6e 74 43 65 6c 6c 5b 36 34 5d 3b 20 20  arentCell[64];  
21eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21ec0 20 53 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e   Space for the n
21ed0 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  ew divider cell 
21ee0 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
21ef0 65 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49 6e  e a new page. In
21f00 73 65 72 74 20 74 68 65 20 6f 76 65 72 66 6c 6f  sert the overflo
21f10 77 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67  w cell from pPag
21f20 65 0a 20 20 2a 2a 20 69 6e 74 6f 20 69 74 2e 20  e.  ** into it. 
21f30 54 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 20  Then remove the 
21f40 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 66 72  overflow cell fr
21f50 6f 6d 20 70 50 61 67 65 2e 0a 20 20 2a 2f 0a 20  om pPage..  */. 
21f60 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 50 61   rc = allocatePa
21f70 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26  ge(pBt, &pNew, &
21f80 70 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b 0a  pgnoNew, 0, 0);.
21f90 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
21fa0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
21fb0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 65 6c  n rc;.  }.  pCel
21fc0 6c 20 3d 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c  l = pPage->aOvfl
21fd0 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 73 7a 43  [0].pCell;.  szC
21fe0 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ell = cellSizePt
21ff0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b  r(pPage, pCell);
22000 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77  .  zeroPage(pNew
22010 2c 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30  , pPage->aData[0
22020 5d 29 3b 0a 20 20 61 73 73 65 6d 62 6c 65 50 61  ]);.  assemblePa
22030 67 65 28 70 4e 65 77 2c 20 31 2c 20 26 70 43 65  ge(pNew, 1, &pCe
22040 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 20 20  ll, &szCell);.  
22050 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
22060 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20   = 0;..  /* Set 
22070 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 74 68  the parent of th
22080 65 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65  e newly allocate
22090 64 20 70 61 67 65 20 74 6f 20 70 50 61 72 65 6e  d page to pParen
220a0 74 2e 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e 70 50  t. */.  pNew->pP
220b0 61 72 65 6e 74 20 3d 20 70 50 61 72 65 6e 74 3b  arent = pParent;
220c0 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  .  sqlite3pager_
220d0 72 65 66 28 70 50 61 72 65 6e 74 2d 3e 61 44 61  ref(pParent->aDa
220e0 74 61 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65  ta);..  /* pPage
220f0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 74 68   is currently th
22100 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66  e right-child of
22110 20 70 50 61 72 65 6e 74 2e 20 43 68 61 6e 67 65   pParent. Change
22120 20 74 68 69 73 0a 20 20 2a 2a 20 73 6f 20 74 68   this.  ** so th
22130 61 74 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  at the right-chi
22140 6c 64 20 69 73 20 74 68 65 20 6e 65 77 20 70 61  ld is the new pa
22150 67 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 62 6f  ge allocated abo
22160 76 65 20 61 6e 64 0a 20 20 2a 2a 20 70 50 61 67  ve and.  ** pPag
22170 65 20 69 73 20 74 68 65 20 6e 65 78 74 2d 74 6f  e is the next-to
22180 2d 72 69 67 68 74 20 63 68 69 6c 64 2e 20 0a 20  -right child. . 
22190 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
221a0 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a  age->nCell>0 );.
221b0 20 20 70 61 72 73 65 43 65 6c 6c 50 74 72 28 70    parseCellPtr(p
221c0 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70  Page, findCell(p
221d0 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e 43 65  Page, pPage->nCe
221e0 6c 6c 2d 31 29 2c 20 26 69 6e 66 6f 29 3b 0a 20  ll-1), &info);. 
221f0 20 72 63 20 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c   rc = fillInCell
22200 28 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74  (pParent, parent
22210 43 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b  Cell, 0, info.nK
22220 65 79 2c 20 30 2c 20 30 2c 20 26 70 61 72 65 6e  ey, 0, 0, &paren
22230 74 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  tSize);.  if( rc
22240 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
22250 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
22260 7d 0a 20 20 61 73 73 65 72 74 28 20 70 61 72 65  }.  assert( pare
22270 6e 74 53 69 7a 65 3c 36 34 20 29 3b 0a 20 20 72  ntSize<64 );.  r
22280 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70  c = insertCell(p
22290 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 49 64  Parent, parentId
222a0 78 2c 20 70 61 72 65 6e 74 43 65 6c 6c 2c 20 70  x, parentCell, p
222b0 61 72 65 6e 74 53 69 7a 65 2c 20 30 2c 20 34 29  arentSize, 0, 4)
222c0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
222d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
222e0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 75  urn rc;.  }.  pu
222f0 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66  t4byte(findOverf
22300 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  lowCell(pParent,
22310 70 61 72 65 6e 74 49 64 78 29 2c 20 70 50 61 67  parentIdx), pPag
22320 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 70 75 74 34  e->pgno);.  put4
22330 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
22340 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
22350 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f  rOffset+8], pgno
22360 4e 65 77 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  New);..#ifndef S
22370 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
22380 41 43 55 55 4d 0a 20 20 2f 2a 20 49 66 20 74 68  ACUUM.  /* If th
22390 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  is is an auto-va
223a0 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75  cuum database, u
223b0 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65  pdate the pointe
223c0 72 20 6d 61 70 0a 20 20 2a 2a 20 77 69 74 68 20  r map.  ** with 
223d0 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20  entries for the 
223e0 6e 65 77 20 70 61 67 65 2c 20 61 6e 64 20 61 6e  new page, and an
223f0 79 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74  y pointer from t
22400 68 65 20 0a 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e  he .  ** cell on
22410 20 74 68 65 20 70 61 67 65 20 74 6f 20 61 6e 20   the page to an 
22420 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20  overflow page.. 
22430 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61   */.  if( pBt->a
22440 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
22450 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
22460 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20 50 54  pBt, pgnoNew, PT
22470 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72  RMAP_BTREE, pPar
22480 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  ent->pgno);.    
22490 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
224a0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
224b0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
224c0 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76  rc = ptrmapPutOv
224d0 66 6c 28 70 4e 65 77 2c 20 30 29 3b 0a 20 20 20  fl(pNew, 0);.   
224e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
224f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
22500 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
22510 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65  .#endif..  /* Re
22520 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65  lease the refere
22530 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 77 20 70  nce to the new p
22540 61 67 65 20 61 6e 64 20 62 61 6c 61 6e 63 65 20  age and balance 
22550 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2c  the parent page,
22560 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68  .  ** in case th
22570 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69  e divider cell i
22580 6e 73 65 72 74 65 64 20 63 61 75 73 65 64 20 69  nserted caused i
22590 74 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76 65 72  t to become over
225a0 66 75 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c  full..  */.  rel
225b0 65 61 73 65 50 61 67 65 28 70 4e 65 77 29 3b 0a  easePage(pNew);.
225c0 20 20 72 65 74 75 72 6e 20 62 61 6c 61 6e 63 65    return balance
225d0 28 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a 7d 0a  (pParent, 0);.}.
225e0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
225f0 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e  _OMIT_QUICKBALAN
22600 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  CE */../*.** The
22610 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 6d 61   ISAUTOVACUUM ma
22620 63 72 6f 20 69 73 20 75 73 65 64 20 77 69 74 68  cro is used with
22630 69 6e 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f  in balance_nonro
22640 6f 74 28 29 20 74 6f 20 64 65 74 65 72 6d 69 6e  ot() to determin
22650 65 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61  e.** if the data
22660 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
22670 74 6f 2d 76 61 63 75 75 6d 20 6f 72 20 6e 6f 74  to-vacuum or not
22680 2e 20 42 65 63 61 75 73 65 20 69 74 20 69 73 20  . Because it is 
22690 75 73 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 61  used.** within a
226a0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  n expression tha
226b0 74 20 69 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  t is an argument
226c0 20 74 6f 20 61 6e 6f 74 68 65 72 20 6d 61 63 72   to another macr
226d0 6f 20 0a 2a 2a 20 28 73 71 6c 69 74 65 4d 61 6c  o .** (sqliteMal
226e0 6c 6f 63 52 61 77 29 2c 20 69 74 20 69 73 20 6e  locRaw), it is n
226f0 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75  ot possible to u
22700 73 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 63  se conditional c
22710 6f 6d 70 69 6c 61 74 69 6f 6e 2e 0a 2a 2a 20 53  ompilation..** S
22720 6f 2c 20 74 68 69 73 20 6d 61 63 72 6f 20 69 73  o, this macro is
22730 20 64 65 66 69 6e 65 64 20 69 6e 73 74 65 61 64   defined instead
22740 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
22750 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
22760 55 55 4d 0a 23 64 65 66 69 6e 65 20 49 53 41 55  UUM.#define ISAU
22770 54 4f 56 41 43 55 55 4d 20 28 70 42 74 2d 3e 61  TOVACUUM (pBt->a
22780 75 74 6f 56 61 63 75 75 6d 29 0a 23 65 6c 73 65  utoVacuum).#else
22790 0a 23 64 65 66 69 6e 65 20 49 53 41 55 54 4f 56  .#define ISAUTOV
227a0 41 43 55 55 4d 20 30 0a 23 65 6e 64 69 66 0a 0a  ACUUM 0.#endif..
227b0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
227c0 6e 65 20 72 65 64 69 73 74 72 69 62 75 74 65 73  ne redistributes
227d0 20 43 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 20   Cells on pPage 
227e0 61 6e 64 20 75 70 20 74 6f 20 4e 4e 2a 32 20 73  and up to NN*2 s
227f0 69 62 6c 69 6e 67 73 0a 2a 2a 20 6f 66 20 70 50  iblings.** of pP
22800 61 67 65 20 73 6f 20 74 68 61 74 20 61 6c 6c 20  age so that all 
22810 70 61 67 65 73 20 68 61 76 65 20 61 62 6f 75 74  pages have about
22820 20 74 68 65 20 73 61 6d 65 20 61 6d 6f 75 6e 74   the same amount
22830 20 6f 66 20 66 72 65 65 20 73 70 61 63 65 2e 0a   of free space..
22840 2a 2a 20 55 73 75 61 6c 6c 79 20 4e 4e 20 73 69  ** Usually NN si
22850 62 6c 69 6e 67 73 20 6f 6e 20 65 69 74 68 65 72  blings on either
22860 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 20 69   side of pPage i
22870 73 20 75 73 65 64 20 69 6e 20 74 68 65 20 62 61  s used in the ba
22880 6c 61 6e 63 69 6e 67 2c 0a 2a 2a 20 74 68 6f 75  lancing,.** thou
22890 67 68 20 6d 6f 72 65 20 73 69 62 6c 69 6e 67 73  gh more siblings
228a0 20 6d 69 67 68 74 20 63 6f 6d 65 20 66 72 6f 6d   might come from
228b0 20 6f 6e 65 20 73 69 64 65 20 69 66 20 70 50 61   one side if pPa
228c0 67 65 20 69 73 20 74 68 65 20 66 69 72 73 74 0a  ge is the first.
228d0 2a 2a 20 6f 72 20 6c 61 73 74 20 63 68 69 6c 64  ** or last child
228e0 20 6f 66 20 69 74 73 20 70 61 72 65 6e 74 2e 20   of its parent. 
228f0 20 49 66 20 70 50 61 67 65 20 68 61 73 20 66 65   If pPage has fe
22900 77 65 72 20 74 68 61 6e 20 32 2a 4e 4e 20 73 69  wer than 2*NN si
22910 62 6c 69 6e 67 73 0a 2a 2a 20 28 73 6f 6d 65 74  blings.** (somet
22920 68 69 6e 67 20 77 68 69 63 68 20 63 61 6e 20 6f  hing which can o
22930 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 70 50  nly happen if pP
22940 61 67 65 20 69 73 20 74 68 65 20 72 6f 6f 74 20  age is the root 
22950 70 61 67 65 20 6f 72 20 61 20 0a 2a 2a 20 63 68  page or a .** ch
22960 69 6c 64 20 6f 66 20 72 6f 6f 74 29 20 74 68 65  ild of root) the
22970 6e 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20  n all available 
22980 73 69 62 6c 69 6e 67 73 20 70 61 72 74 69 63 69  siblings partici
22990 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61  pate in the bala
229a0 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ncing..**.** The
229b0 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69   number of sibli
229c0 6e 67 73 20 6f 66 20 70 50 61 67 65 20 6d 69 67  ngs of pPage mig
229d0 68 74 20 62 65 20 69 6e 63 72 65 61 73 65 64 20  ht be increased 
229e0 6f 72 20 64 65 63 72 65 61 73 65 64 20 62 79 20  or decreased by 
229f0 6f 6e 65 20 6f 72 0a 2a 2a 20 74 77 6f 20 69 6e  one or.** two in
22a00 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 6b 65   an effort to ke
22a10 65 70 20 70 61 67 65 73 20 6e 65 61 72 6c 79 20  ep pages nearly 
22a20 66 75 6c 6c 20 62 75 74 20 6e 6f 74 20 6f 76 65  full but not ove
22a30 72 20 66 75 6c 6c 2e 20 54 68 65 20 72 6f 6f 74  r full. The root
22a40 20 70 61 67 65 0a 2a 2a 20 69 73 20 73 70 65 63   page.** is spec
22a50 69 61 6c 20 61 6e 64 20 69 73 20 61 6c 6c 6f 77  ial and is allow
22a60 65 64 20 74 6f 20 62 65 20 6e 65 61 72 6c 79 20  ed to be nearly 
22a70 65 6d 70 74 79 2e 20 49 66 20 70 50 61 67 65 20  empty. If pPage 
22a80 69 73 20 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20  is .** the root 
22a90 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 64  page, then the d
22aa0 65 70 74 68 20 6f 66 20 74 68 65 20 74 72 65 65  epth of the tree
22ab0 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65 61   might be increa
22ac0 73 65 64 0a 2a 2a 20 6f 72 20 64 65 63 72 65 61  sed.** or decrea
22ad0 73 65 64 20 62 79 20 6f 6e 65 2c 20 61 73 20 6e  sed by one, as n
22ae0 65 63 65 73 73 61 72 79 2c 20 74 6f 20 6b 65 65  ecessary, to kee
22af0 70 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  p the root page 
22b00 66 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20 6f 76  from being.** ov
22b10 65 72 66 75 6c 6c 20 6f 72 20 63 6f 6d 70 6c 65  erfull or comple
22b20 74 65 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a  tely empty..**.*
22b30 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 68 65 6e  * Note that when
22b40 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
22b50 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65 20 6f 66   called, some of
22b60 20 74 68 65 20 43 65 6c 6c 73 20 6f 6e 20 70 50   the Cells on pP
22b70 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f 74  age.** might not
22b80 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73 74 6f   actually be sto
22b90 72 65 64 20 69 6e 20 70 50 61 67 65 2d 3e 61 44  red in pPage->aD
22ba0 61 74 61 5b 5d 2e 20 20 54 68 69 73 20 63 61 6e  ata[].  This can
22bb0 20 68 61 70 70 65 6e 0a 2a 2a 20 69 66 20 74 68   happen.** if th
22bc0 65 20 70 61 67 65 20 69 73 20 6f 76 65 72 66 75  e page is overfu
22bd0 6c 6c 2e 20 20 50 61 72 74 20 6f 66 20 74 68 65  ll.  Part of the
22be0 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75   job of this rou
22bf0 74 69 6e 65 20 69 73 20 74 6f 0a 2a 2a 20 6d 61  tine is to.** ma
22c00 6b 65 20 73 75 72 65 20 61 6c 6c 20 43 65 6c 6c  ke sure all Cell
22c10 73 20 66 6f 72 20 70 50 61 67 65 20 6f 6e 63 65  s for pPage once
22c20 20 61 67 61 69 6e 20 66 69 74 20 69 6e 20 70 50   again fit in pP
22c30 61 67 65 2d 3e 61 44 61 74 61 5b 5d 2e 0a 2a 2a  age->aData[]..**
22c40 0a 2a 2a 20 49 6e 20 74 68 65 20 63 6f 75 72 73  .** In the cours
22c50 65 20 6f 66 20 62 61 6c 61 6e 63 69 6e 67 20 74  e of balancing t
22c60 68 65 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 70  he siblings of p
22c70 50 61 67 65 2c 20 74 68 65 20 70 61 72 65 6e 74  Page, the parent
22c80 20 6f 66 20 70 50 61 67 65 0a 2a 2a 20 6d 69 67   of pPage.** mig
22c90 68 74 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75  ht become overfu
22ca0 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e  ll or underfull.
22cb0 20 20 49 66 20 74 68 61 74 20 68 61 70 70 65 6e    If that happen
22cc0 73 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  s, then this rou
22cd0 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tine.** is calle
22ce0 64 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e  d recursively on
22cf0 20 74 68 65 20 70 61 72 65 6e 74 2e 0a 2a 2a 0a   the parent..**.
22d00 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69  ** If this routi
22d10 6e 65 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79  ne fails for any
22d20 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d 69 67 68   reason, it migh
22d30 74 20 6c 65 61 76 65 20 74 68 65 20 64 61 74 61  t leave the data
22d40 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20 63 6f 72  base.** in a cor
22d50 72 75 70 74 65 64 20 73 74 61 74 65 2e 20 20 53  rupted state.  S
22d60 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  o if this routin
22d70 65 20 66 61 69 6c 73 2c 20 74 68 65 20 64 61 74  e fails, the dat
22d80 61 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a 2a 20  abase should.** 
22d90 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  be rolled back..
22da0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
22db0 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 4d 65  lance_nonroot(Me
22dc0 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
22dd0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
22de0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
22df0 20 54 68 65 20 70 61 72 65 6e 74 20 6f 66 20 70   The parent of p
22e00 50 61 67 65 20 2a 2f 0a 20 20 42 74 53 68 61 72  Page */.  BtShar
22e10 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20  ed *pBt;        
22e20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
22e30 20 77 68 6f 6c 65 20 64 61 74 61 62 61 73 65 20   whole database 
22e40 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d  */.  int nCell =
22e50 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
22e60 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
22e70 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
22e80 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 43 65   */.  int nMaxCe
22e90 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  lls = 0;        
22ea0 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20     /* Allocated 
22eb0 73 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c 2c 20  size of apCell, 
22ec0 73 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a  szCell, aFrom. *
22ed0 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 20 20 20  /.  int nOld;   
22ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ef0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
22f00 67 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a  ges in apOld[] *
22f10 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 3b 20 20 20  /.  int nNew;   
22f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f30 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
22f40 67 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a  ges in apNew[] *
22f50 2f 0a 20 20 69 6e 74 20 6e 44 69 76 3b 20 20 20  /.  int nDiv;   
22f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f70 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
22f80 6c 6c 73 20 69 6e 20 61 70 44 69 76 5b 5d 20 2a  lls in apDiv[] *
22f90 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b  /.  int i, j, k;
22fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fb0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
22fc0 73 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 3b 20  s */.  int idx; 
22fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fe0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
22ff0 70 50 61 67 65 20 69 6e 20 70 50 61 72 65 6e 74  pPage in pParent
23000 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69  ->aCell[] */.  i
23010 6e 74 20 6e 78 44 69 76 3b 20 20 20 20 20 20 20  nt nxDiv;       
23020 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
23030 65 78 74 20 64 69 76 69 64 65 72 20 73 6c 6f 74  ext divider slot
23040 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65   in pParent->aCe
23050 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ll[] */.  int rc
23060 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23070 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
23080 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
23090 6e 74 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  nt leafCorrectio
230a0 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34  n;          /* 4
230b0 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c   if pPage is a l
230c0 65 61 66 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a  eaf.  0 if not *
230d0 2f 0a 20 20 69 6e 74 20 6c 65 61 66 44 61 74 61  /.  int leafData
230e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
230f0 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 67   /* True if pPag
23100 65 20 69 73 20 61 20 6c 65 61 66 20 6f 66 20 61  e is a leaf of a
23110 20 4c 45 41 46 44 41 54 41 20 74 72 65 65 20 2a   LEAFDATA tree *
23120 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 70  /.  int usableSp
23130 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
23140 20 2f 2a 20 42 79 74 65 73 20 69 6e 20 70 50 61   /* Bytes in pPa
23150 67 65 20 62 65 79 6f 6e 64 20 74 68 65 20 68 65  ge beyond the he
23160 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61  ader */.  int pa
23170 67 65 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  geFlags;        
23180 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
23190 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  of pPage->aData[
231a0 30 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74  0] */.  int subt
231b0 6f 74 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  otal;           
231c0 20 20 20 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c       /* Subtotal
231d0 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63 65 6c   of bytes in cel
231e0 6c 73 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a  ls on one page *
231f0 2f 0a 20 20 69 6e 74 20 69 53 70 61 63 65 20 3d  /.  int iSpace =
23200 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
23210 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64   /* First unused
23220 20 62 79 74 65 20 6f 66 20 61 53 70 61 63 65 5b   byte of aSpace[
23230 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ] */.  MemPage *
23240 61 70 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20  apOld[NB];      
23250 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64      /* pPage and
23260 20 75 70 20 74 6f 20 74 77 6f 20 73 69 62 6c 69   up to two sibli
23270 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ngs */.  Pgno pg
23280 6e 6f 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20  noOld[NB];      
23290 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
232a0 6d 62 65 72 73 20 66 6f 72 20 65 61 63 68 20 70  mbers for each p
232b0 61 67 65 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a  age in apOld[] *
232c0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 43  /.  MemPage *apC
232d0 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  opy[NB];        
232e0 20 2f 2a 20 50 72 69 76 61 74 65 20 63 6f 70 69   /* Private copi
232f0 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61  es of apOld[] pa
23300 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ges */.  MemPage
23310 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20   *apNew[NB+2];  
23320 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61        /* pPage a
23330 6e 64 20 75 70 20 74 6f 20 4e 42 20 73 69 62 6c  nd up to NB sibl
23340 69 6e 67 73 20 61 66 74 65 72 20 62 61 6c 61 6e  ings after balan
23350 63 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  cing */.  Pgno p
23360 67 6e 6f 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20  gnoNew[NB+2];   
23370 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
23380 75 6d 62 65 72 73 20 66 6f 72 20 65 61 63 68 20  umbers for each 
23390 70 61 67 65 20 69 6e 20 61 70 4e 65 77 5b 5d 20  page in apNew[] 
233a0 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69 76 5b 4e  */.  u8 *apDiv[N
233b0 42 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  B];             
233c0 20 20 2f 2a 20 44 69 76 69 64 65 72 20 63 65 6c    /* Divider cel
233d0 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f  ls in pParent */
233e0 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42  .  int cntNew[NB
233f0 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  +2];            
23400 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 43 65 6c  /* Index in aCel
23410 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61 66 74 65  l[] of cell afte
23420 72 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20  r i-th page */. 
23430 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d   int szNew[NB+2]
23440 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
23450 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f   Combined size o
23460 66 20 63 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e  f cells place on
23470 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20   i-th page */.  
23480 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b  u8 **apCell = 0;
23490 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
234a0 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e 20  All cells begin 
234b0 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e  balanced */.  in
234c0 74 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20  t *szCell;      
234d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
234e0 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20  cal size of all 
234f0 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
23500 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 43 6f 70 79  ] */.  u8 *aCopy
23510 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 20  [NB];           
23520 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72      /* Space for
23530 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 6f 66   holding data of
23540 20 61 70 43 6f 70 79 5b 5d 20 2a 2f 0a 20 20 75   apCopy[] */.  u
23550 38 20 2a 61 53 70 61 63 65 3b 20 20 20 20 20 20  8 *aSpace;      
23560 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
23570 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 63 6f 70  pace to hold cop
23580 69 65 73 20 6f 66 20 64 69 76 69 64 65 72 73 20  ies of dividers 
23590 63 65 6c 6c 73 20 2a 2f 0a 23 69 66 6e 64 65 66  cells */.#ifndef
235a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
235b0 4f 56 41 43 55 55 4d 0a 20 20 75 38 20 2a 61 46  OVACUUM.  u8 *aF
235c0 72 6f 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  rom = 0;.#endif.
235d0 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 46 69 6e 64  .  /* .  ** Find
235e0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
235f0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
23600 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
23610 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
23620 74 65 33 70 61 67 65 72 5f 69 73 77 72 69 74 65  te3pager_iswrite
23630 61 62 6c 65 28 70 50 61 67 65 2d 3e 61 44 61 74  able(pPage->aDat
23640 61 29 20 29 3b 0a 20 20 70 42 74 20 3d 20 70 50  a) );.  pBt = pP
23650 61 67 65 2d 3e 70 42 74 3b 0a 20 20 70 50 61 72  age->pBt;.  pPar
23660 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70 50 61  ent = pPage->pPa
23670 72 65 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20  rent;.  assert( 
23680 70 50 61 72 65 6e 74 20 29 3b 0a 20 20 69 66 28  pParent );.  if(
23690 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
236a0 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77  = sqlite3pager_w
236b0 72 69 74 65 28 70 50 61 72 65 6e 74 2d 3e 61 44  rite(pParent->aD
236c0 61 74 61 29 29 20 29 7b 0a 20 20 20 20 72 65 74  ata)) ){.    ret
236d0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 54 52  urn rc;.  }.  TR
236e0 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 62  ACE(("BALANCE: b
236f0 65 67 69 6e 20 70 61 67 65 20 25 64 20 63 68 69  egin page %d chi
23700 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61  ld of %d\n", pPa
23710 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e  ge->pgno, pParen
23720 74 2d 3e 70 67 6e 6f 29 29 3b 0a 0a 23 69 66 6e  t->pgno));..#ifn
23730 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
23740 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 20 20 2f  QUICKBALANCE.  /
23750 2a 0a 20 20 2a 2a 20 41 20 73 70 65 63 69 61 6c  *.  ** A special
23760 20 63 61 73 65 3a 20 20 49 66 20 61 20 6e 65 77   case:  If a new
23770 20 65 6e 74 72 79 20 68 61 73 20 6a 75 73 74 20   entry has just 
23780 62 65 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e  been inserted in
23790 74 6f 20 61 0a 20 20 2a 2a 20 74 61 62 6c 65 20  to a.  ** table 
237a0 28 74 68 61 74 20 69 73 2c 20 61 20 62 74 72 65  (that is, a btre
237b0 65 20 77 69 74 68 20 69 6e 74 65 67 65 72 20 6b  e with integer k
237c0 65 79 73 20 61 6e 64 20 61 6c 6c 20 64 61 74 61  eys and all data
237d0 20 61 74 20 74 68 65 20 6c 65 61 76 65 73 29 0a   at the leaves).
237e0 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65 77    ** and the new
237f0 20 65 6e 74 72 79 20 69 73 20 74 68 65 20 72 69   entry is the ri
23800 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69  ght-most entry i
23810 6e 20 74 68 65 20 74 72 65 65 20 28 69 74 20 68  n the tree (it h
23820 61 73 20 74 68 65 0a 20 20 2a 2a 20 6c 61 72 67  as the.  ** larg
23830 65 73 74 20 6b 65 79 29 20 74 68 65 6e 20 75 73  est key) then us
23840 65 20 74 68 65 20 73 70 65 63 69 61 6c 20 62 61  e the special ba
23850 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 72 6f  lance_quick() ro
23860 75 74 69 6e 65 20 66 6f 72 0a 20 20 2a 2a 20 62  utine for.  ** b
23870 61 6c 61 6e 63 69 6e 67 2e 20 20 62 61 6c 61 6e  alancing.  balan
23880 63 65 5f 71 75 69 63 6b 28 29 20 69 73 20 6d 75  ce_quick() is mu
23890 63 68 20 66 61 73 74 65 72 20 61 6e 64 20 72 65  ch faster and re
238a0 73 75 6c 74 73 20 69 6e 20 61 20 74 69 67 68 74  sults in a tight
238b0 65 72 0a 20 20 2a 2a 20 70 61 63 6b 69 6e 67 20  er.  ** packing 
238c0 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65 20 63  of data in the c
238d0 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20 20 2a 2f  ommon case..  */
238e0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65  .  if( pPage->le
238f0 61 66 20 26 26 0a 20 20 20 20 20 20 70 50 61 67  af &&.      pPag
23900 65 2d 3e 69 6e 74 4b 65 79 20 26 26 0a 20 20 20  e->intKey &&.   
23910 20 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61     pPage->leafDa
23920 74 61 20 26 26 0a 20 20 20 20 20 20 70 50 61 67  ta &&.      pPag
23930 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20  e->nOverflow==1 
23940 26 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  &&.      pPage->
23950 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 50  aOvfl[0].idx==pP
23960 61 67 65 2d 3e 6e 43 65 6c 6c 20 26 26 0a 20 20  age->nCell &&.  
23970 20 20 20 20 70 50 61 67 65 2d 3e 70 50 61 72 65      pPage->pPare
23980 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20 26 26 0a 20  nt->pgno!=1 &&. 
23990 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70       get4byte(&p
239a0 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
239b0 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
239c0 2b 38 5d 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e  +8])==pPage->pgn
239d0 6f 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  o.  ){.    /*.  
239e0 20 20 2a 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b    ** TODO: Check
239f0 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 74 6f   the siblings to
23a00 20 74 68 65 20 6c 65 66 74 20 6f 66 20 70 50 61   the left of pPa
23a10 67 65 2e 20 49 74 20 6d 61 79 20 62 65 20 74 68  ge. It may be th
23a20 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 79 20 61  at.    ** they a
23a30 72 65 20 6e 6f 74 20 66 75 6c 6c 20 61 6e 64 20  re not full and 
23a40 6e 6f 20 6e 65 77 20 70 61 67 65 20 69 73 20 72  no new page is r
23a50 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  equired..    */.
23a60 20 20 20 20 72 65 74 75 72 6e 20 62 61 6c 61 6e      return balan
23a70 63 65 5f 71 75 69 63 6b 28 70 50 61 67 65 2c 20  ce_quick(pPage, 
23a80 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 23 65  pParent);.  }.#e
23a90 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  ndif..  /*.  ** 
23aa0 46 69 6e 64 20 74 68 65 20 63 65 6c 6c 20 69 6e  Find the cell in
23ab0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
23ac0 20 77 68 6f 73 65 20 6c 65 66 74 20 63 68 69 6c   whose left chil
23ad0 64 20 70 6f 69 6e 74 73 20 62 61 63 6b 0a 20 20  d points back.  
23ae0 2a 2a 20 74 6f 20 70 50 61 67 65 2e 20 20 54 68  ** to pPage.  Th
23af0 65 20 22 69 64 78 22 20 76 61 72 69 61 62 6c 65  e "idx" variable
23b00 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
23b10 20 74 68 61 74 20 63 65 6c 6c 2e 20 20 49 66 20   that cell.  If 
23b20 70 50 61 67 65 0a 20 20 2a 2a 20 69 73 20 74 68  pPage.  ** is th
23b30 65 20 72 69 67 68 74 6d 6f 73 74 20 63 68 69 6c  e rightmost chil
23b40 64 20 6f 66 20 70 50 61 72 65 6e 74 20 74 68 65  d of pParent the
23b50 6e 20 73 65 74 20 69 64 78 20 74 6f 20 70 50 61  n set idx to pPa
23b60 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 0a 20 20 2a  rent->nCell .  *
23b70 2f 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 2d  /.  if( pParent-
23b80 3e 69 64 78 53 68 69 66 74 20 29 7b 0a 20 20 20  >idxShift ){.   
23b90 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20   Pgno pgno;.    
23ba0 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67  pgno = pPage->pg
23bb0 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  no;.    assert( 
23bc0 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 70 61 67  pgno==sqlite3pag
23bd0 65 72 5f 70 61 67 65 6e 75 6d 62 65 72 28 70 50  er_pagenumber(pP
23be0 61 67 65 2d 3e 61 44 61 74 61 29 20 29 3b 0a 20  age->aData) );. 
23bf0 20 20 20 66 6f 72 28 69 64 78 3d 30 3b 20 69 64     for(idx=0; id
23c00 78 3c 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  x<pParent->nCell
23c10 3b 20 69 64 78 2b 2b 29 7b 0a 20 20 20 20 20 20  ; idx++){.      
23c20 69 66 28 20 67 65 74 34 62 79 74 65 28 66 69 6e  if( get4byte(fin
23c30 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69  dCell(pParent, i
23c40 64 78 29 29 3d 3d 70 67 6e 6f 20 29 7b 0a 20 20  dx))==pgno ){.  
23c50 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
23c60 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
23c70 73 73 65 72 74 28 20 69 64 78 3c 70 50 61 72 65  ssert( idx<pPare
23c80 6e 74 2d 3e 6e 43 65 6c 6c 0a 20 20 20 20 20 20  nt->nCell.      
23c90 20 20 20 20 20 20 20 7c 7c 20 67 65 74 34 62 79         || get4by
23ca0 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
23cb0 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
23cc0 66 66 73 65 74 2b 38 5d 29 3d 3d 70 67 6e 6f 20  ffset+8])==pgno 
23cd0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
23ce0 69 64 78 20 3d 20 70 50 61 67 65 2d 3e 69 64 78  idx = pPage->idx
23cf0 50 61 72 65 6e 74 3b 0a 20 20 7d 0a 0a 20 20 2f  Parent;.  }..  /
23d00 2a 0a 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  *.  ** Initializ
23d10 65 20 76 61 72 69 61 62 6c 65 73 20 73 6f 20 74  e variables so t
23d20 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20 73  hat it will be s
23d30 61 66 65 20 74 6f 20 6a 75 6d 70 0a 20 20 2a 2a  afe to jump.  **
23d40 20 64 69 72 65 63 74 6c 79 20 74 6f 20 62 61 6c   directly to bal
23d50 61 6e 63 65 5f 63 6c 65 61 6e 75 70 20 61 74 20  ance_cleanup at 
23d60 61 6e 79 20 6d 6f 6d 65 6e 74 2e 0a 20 20 2a 2f  any moment..  */
23d70 0a 20 20 6e 4f 6c 64 20 3d 20 6e 4e 65 77 20 3d  .  nOld = nNew =
23d80 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67   0;.  sqlite3pag
23d90 65 72 5f 72 65 66 28 70 50 61 72 65 6e 74 2d 3e  er_ref(pParent->
23da0 61 44 61 74 61 29 3b 0a 0a 20 20 2f 2a 0a 20 20  aData);..  /*.  
23db0 2a 2a 20 46 69 6e 64 20 73 69 62 6c 69 6e 67 20  ** Find sibling 
23dc0 70 61 67 65 73 20 74 6f 20 70 50 61 67 65 20 61  pages to pPage a
23dd0 6e 64 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20  nd the cells in 
23de0 70 50 61 72 65 6e 74 20 74 68 61 74 20 64 69 76  pParent that div
23df0 69 64 65 0a 20 20 2a 2a 20 74 68 65 20 73 69 62  ide.  ** the sib
23e00 6c 69 6e 67 73 2e 20 20 41 6e 20 61 74 74 65 6d  lings.  An attem
23e10 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 66 69  pt is made to fi
23e20 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f  nd NN siblings o
23e30 6e 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 73 69  n either.  ** si
23e40 64 65 20 6f 66 20 70 50 61 67 65 2e 20 20 4d 6f  de of pPage.  Mo
23e50 72 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  re siblings are 
23e60 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73  taken from one s
23e70 69 64 65 2c 20 68 6f 77 65 76 65 72 2c 20 69 66  ide, however, if
23e80 0a 20 20 2a 2a 20 70 50 61 67 65 20 74 68 65 72  .  ** pPage ther
23e90 65 20 61 72 65 20 66 65 77 65 72 20 74 68 61 6e  e are fewer than
23ea0 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20   NN siblings on 
23eb0 74 68 65 20 6f 74 68 65 72 20 73 69 64 65 2e 20  the other side. 
23ec0 20 49 66 20 70 50 61 72 65 6e 74 0a 20 20 2a 2a   If pParent.  **
23ed0 20 68 61 73 20 4e 42 20 6f 72 20 66 65 77 65 72   has NB or fewer
23ee0 20 63 68 69 6c 64 72 65 6e 20 74 68 65 6e 20 61   children then a
23ef0 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70  ll children of p
23f00 50 61 72 65 6e 74 20 61 72 65 20 74 61 6b 65 6e  Parent are taken
23f10 2e 0a 20 20 2a 2f 0a 20 20 6e 78 44 69 76 20 3d  ..  */.  nxDiv =
23f20 20 69 64 78 20 2d 20 4e 4e 3b 0a 20 20 69 66 28   idx - NN;.  if(
23f30 20 6e 78 44 69 76 20 2b 20 4e 42 20 3e 20 70 50   nxDiv + NB > pP
23f40 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  arent->nCell ){.
23f50 20 20 20 20 6e 78 44 69 76 20 3d 20 70 50 61 72      nxDiv = pPar
23f60 65 6e 74 2d 3e 6e 43 65 6c 6c 20 2d 20 4e 42 20  ent->nCell - NB 
23f70 2b 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  + 1;.  }.  if( n
23f80 78 44 69 76 3c 30 20 29 7b 0a 20 20 20 20 6e 78  xDiv<0 ){.    nx
23f90 44 69 76 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e  Div = 0;.  }.  n
23fa0 44 69 76 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  Div = 0;.  for(i
23fb0 3d 30 2c 20 6b 3d 6e 78 44 69 76 3b 20 69 3c 4e  =0, k=nxDiv; i<N
23fc0 42 3b 20 69 2b 2b 2c 20 6b 2b 2b 29 7b 0a 20 20  B; i++, k++){.  
23fd0 20 20 69 66 28 20 6b 3c 70 50 61 72 65 6e 74 2d    if( k<pParent-
23fe0 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  >nCell ){.      
23ff0 61 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43  apDiv[i] = findC
24000 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6b 29 3b  ell(pParent, k);
24010 0a 20 20 20 20 20 20 6e 44 69 76 2b 2b 3b 0a 20  .      nDiv++;. 
24020 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
24030 61 72 65 6e 74 2d 3e 6c 65 61 66 20 29 3b 0a 20  arent->leaf );. 
24040 20 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20       pgnoOld[i] 
24050 3d 20 67 65 74 34 62 79 74 65 28 61 70 44 69 76  = get4byte(apDiv
24060 5b 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  [i]);.    }else 
24070 69 66 28 20 6b 3d 3d 70 50 61 72 65 6e 74 2d 3e  if( k==pParent->
24080 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  nCell ){.      p
24090 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65 74 34  gnoOld[i] = get4
240a0 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
240b0 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
240c0 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
240d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 72   }else{.      br
240e0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  eak;.    }.    r
240f0 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
24100 67 65 28 70 42 74 2c 20 70 67 6e 6f 4f 6c 64 5b  ge(pBt, pgnoOld[
24110 69 5d 2c 20 26 61 70 4f 6c 64 5b 69 5d 2c 20 70  i], &apOld[i], p
24120 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 69 66 28  Parent);.    if(
24130 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
24140 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
24150 61 70 4f 6c 64 5b 69 5d 2d 3e 69 64 78 50 61 72  apOld[i]->idxPar
24160 65 6e 74 20 3d 20 6b 3b 0a 20 20 20 20 61 70 43  ent = k;.    apC
24170 6f 70 79 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  opy[i] = 0;.    
24180 61 73 73 65 72 74 28 20 69 3d 3d 6e 4f 6c 64 20  assert( i==nOld 
24190 29 3b 0a 20 20 20 20 6e 4f 6c 64 2b 2b 3b 0a 20  );.    nOld++;. 
241a0 20 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20     nMaxCells += 
241b0 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c  1+apOld[i]->nCel
241c0 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65  l+apOld[i]->nOve
241d0 72 66 6c 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rflow;.  }..  /*
241e0 20 4d 61 6b 65 20 6e 4d 61 78 43 65 6c 6c 73 20   Make nMaxCells 
241f0 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 32 20  a multiple of 2 
24200 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 73  in order to pres
24210 65 72 76 65 20 38 2d 62 79 74 65 0a 20 20 2a 2a  erve 8-byte.  **
24220 20 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20   alignment */.  
24230 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 28 6e 4d 61  nMaxCells = (nMa
24240 78 43 65 6c 6c 73 20 2b 20 31 29 26 7e 31 3b 0a  xCells + 1)&~1;.
24250 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63  .  /*.  ** Alloc
24260 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65  ate space for me
24270 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 0a  mory structures.
24280 20 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20 3d 20    */.  apCell = 
24290 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
242a0 20 0a 20 20 20 20 20 20 20 6e 4d 61 78 43 65 6c   .       nMaxCel
242b0 6c 73 2a 73 69 7a 65 6f 66 28 75 38 2a 29 20 20  ls*sizeof(u8*)  
242c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
242d0 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70 43 65           /* apCe
242e0 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d 61  ll */.     + nMa
242f0 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 69 6e  xCells*sizeof(in
24300 74 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t)              
24310 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24320 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b  szCell */.     +
24330 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d   ROUND8(sizeof(M
24340 65 6d 50 61 67 65 29 29 2a 4e 42 20 20 20 20 20  emPage))*NB     
24350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24360 20 2f 2a 20 61 43 6f 70 79 20 2a 2f 0a 20 20 20   /* aCopy */.   
24370 20 20 2b 20 70 42 74 2d 3e 70 61 67 65 53 69 7a    + pBt->pageSiz
24380 65 2a 28 35 2b 4e 42 29 20 20 20 20 20 20 20 20  e*(5+NB)        
24390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
243a0 20 20 20 20 2f 2a 20 61 53 70 61 63 65 20 2a 2f      /* aSpace */
243b0 0a 20 20 20 20 20 2b 20 28 49 53 41 55 54 4f 56  .     + (ISAUTOV
243c0 41 43 55 55 4d 20 3f 20 6e 4d 61 78 43 65 6c 6c  ACUUM ? nMaxCell
243d0 73 20 3a 20 30 29 20 20 20 20 20 20 20 20 20 20  s : 0)          
243e0 20 20 20 20 20 20 20 20 2f 2a 20 61 46 72 6f 6d          /* aFrom
243f0 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20 61   */.  );.  if( a
24400 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  pCell==0 ){.    
24410 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
24420 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61  M;.    goto bala
24430 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  nce_cleanup;.  }
24440 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28 69 6e 74  .  szCell = (int
24450 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d 61 78 43 65  *)&apCell[nMaxCe
24460 6c 6c 73 5d 3b 0a 20 20 61 43 6f 70 79 5b 30 5d  lls];.  aCopy[0]
24470 20 3d 20 28 75 38 2a 29 26 73 7a 43 65 6c 6c 5b   = (u8*)&szCell[
24480 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 73  nMaxCells];.  as
24490 73 65 72 74 28 20 28 28 61 43 6f 70 79 5b 30 5d  sert( ((aCopy[0]
244a0 20 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c 29 20   - (u8*)apCell) 
244b0 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d  & 7)==0 ); /* 8-
244c0 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72  byte alignment r
244d0 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 66 6f 72  equired */.  for
244e0 28 69 3d 31 3b 20 69 3c 4e 42 3b 20 69 2b 2b 29  (i=1; i<NB; i++)
244f0 7b 0a 20 20 20 20 61 43 6f 70 79 5b 69 5d 20 3d  {.    aCopy[i] =
24500 20 26 61 43 6f 70 79 5b 69 2d 31 5d 5b 70 42 74   &aCopy[i-1][pBt
24510 2d 3e 70 61 67 65 53 69 7a 65 2b 52 4f 55 4e 44  ->pageSize+ROUND
24520 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65  8(sizeof(MemPage
24530 29 29 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ))];.    assert(
24540 20 28 28 61 43 6f 70 79 5b 69 5d 20 2d 20 28 75   ((aCopy[i] - (u
24550 38 2a 29 61 70 43 65 6c 6c 29 20 26 20 37 29 3d  8*)apCell) & 7)=
24560 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20  =0 ); /* 8-byte 
24570 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72  alignment requir
24580 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 61 53 70 61  ed */.  }.  aSpa
24590 63 65 20 3d 20 26 61 43 6f 70 79 5b 4e 42 2d 31  ce = &aCopy[NB-1
245a0 5d 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2b  ][pBt->pageSize+
245b0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65  ROUND8(sizeof(Me
245c0 6d 50 61 67 65 29 29 5d 3b 0a 20 20 61 73 73 65  mPage))];.  asse
245d0 72 74 28 20 28 28 61 53 70 61 63 65 20 2d 20 28  rt( ((aSpace - (
245e0 75 38 2a 29 61 70 43 65 6c 6c 29 20 26 20 37 29  u8*)apCell) & 7)
245f0 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74 65  ==0 ); /* 8-byte
24600 20 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75 69   alignment requi
24610 72 65 64 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  red */.#ifndef S
24620 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
24630 41 43 55 55 4d 0a 20 20 69 66 28 20 70 42 74 2d  ACUUM.  if( pBt-
24640 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
24650 20 20 20 61 46 72 6f 6d 20 3d 20 26 61 53 70 61     aFrom = &aSpa
24660 63 65 5b 35 2a 70 42 74 2d 3e 70 61 67 65 53 69  ce[5*pBt->pageSi
24670 7a 65 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ze];.  }.#endif.
24680 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4d 61 6b    .  /*.  ** Mak
24690 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20  e copies of the 
246a0 63 6f 6e 74 65 6e 74 20 6f 66 20 70 50 61 67 65  content of pPage
246b0 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e 67   and its sibling
246c0 73 20 69 6e 74 6f 20 61 4f 6c 64 5b 5d 2e 0a 20  s into aOld[].. 
246d0 20 2a 2a 20 54 68 65 20 72 65 73 74 20 6f 66 20   ** The rest of 
246e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
246f0 6c 6c 20 75 73 65 20 64 61 74 61 20 66 72 6f 6d  ll use data from
24700 20 74 68 65 20 63 6f 70 69 65 73 20 72 61 74 68   the copies rath
24710 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  er.  ** that the
24720 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
24730 73 69 6e 63 65 20 74 68 65 20 6f 72 69 67 69 6e  since the origin
24740 61 6c 20 70 61 67 65 73 20 77 69 6c 6c 20 62 65  al pages will be
24750 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 70 72 6f   in the.  ** pro
24760 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20 6f 76  cess of being ov
24770 65 72 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a  erwritten..  */.
24780 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c    for(i=0; i<nOl
24790 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d  d; i++){.    Mem
247a0 50 61 67 65 20 2a 70 20 3d 20 61 70 43 6f 70 79  Page *p = apCopy
247b0 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29  [i] = (MemPage*)
247c0 26 61 43 6f 70 79 5b 69 5d 5b 70 42 74 2d 3e 70  &aCopy[i][pBt->p
247d0 61 67 65 53 69 7a 65 5d 3b 0a 20 20 20 20 70 2d  ageSize];.    p-
247e0 3e 61 44 61 74 61 20 3d 20 26 28 28 75 38 2a 29  >aData = &((u8*)
247f0 70 29 5b 2d 70 42 74 2d 3e 70 61 67 65 53 69 7a  p)[-pBt->pageSiz
24800 65 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  e];.    memcpy(p
24810 2d 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69  ->aData, apOld[i
24820 5d 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 70  ]->aData, pBt->p
24830 61 67 65 53 69 7a 65 20 2b 20 73 69 7a 65 6f 66  ageSize + sizeof
24840 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 20 20  (MemPage));.    
24850 2f 2a 20 54 68 65 20 6d 65 6d 63 70 79 28 29 20  /* The memcpy() 
24860 61 62 6f 76 65 20 63 68 61 6e 67 65 73 20 74 68  above changes th
24870 65 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 61 44  e value of p->aD
24880 61 74 61 20 73 6f 20 77 65 20 68 61 76 65 20 74  ata so we have t
24890 6f 0a 20 20 20 20 2a 2a 20 73 65 74 20 69 74 20  o.    ** set it 
248a0 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 70 2d  again. */.    p-
248b0 3e 61 44 61 74 61 20 3d 20 26 28 28 75 38 2a 29  >aData = &((u8*)
248c0 70 29 5b 2d 70 42 74 2d 3e 70 61 67 65 53 69 7a  p)[-pBt->pageSiz
248d0 65 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  e];.  }..  /*.  
248e0 2a 2a 20 4c 6f 61 64 20 70 6f 69 6e 74 65 72 73  ** Load pointers
248f0 20 74 6f 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e   to all cells on
24900 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61   sibling pages a
24910 6e 64 20 74 68 65 20 64 69 76 69 64 65 72 20 63  nd the divider c
24920 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 74  ells.  ** into t
24930 68 65 20 6c 6f 63 61 6c 20 61 70 43 65 6c 6c 5b  he local apCell[
24940 5d 20 61 72 72 61 79 2e 20 20 4d 61 6b 65 20 63  ] array.  Make c
24950 6f 70 69 65 73 20 6f 66 20 74 68 65 20 64 69 76  opies of the div
24960 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20  ider cells.  ** 
24970 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69  into space obtai
24980 6e 65 64 20 66 6f 72 6d 20 61 53 70 61 63 65 5b  ned form aSpace[
24990 5d 20 61 6e 64 20 72 65 6d 6f 76 65 20 74 68 65  ] and remove the
249a0 20 74 68 65 20 64 69 76 69 64 65 72 20 43 65 6c   the divider Cel
249b0 6c 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 70 50 61  ls.  ** from pPa
249c0 72 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rent..  **.  ** 
249d0 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  If the siblings 
249e0 61 72 65 20 6f 6e 20 6c 65 61 66 20 70 61 67 65  are on leaf page
249f0 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c  s, then the chil
24a00 64 20 70 6f 69 6e 74 65 72 73 20 6f 66 20 74 68  d pointers of th
24a10 65 0a 20 20 2a 2a 20 64 69 76 69 64 65 72 20 63  e.  ** divider c
24a20 65 6c 6c 73 20 61 72 65 20 73 74 72 69 70 70 65  ells are strippe
24a30 64 20 66 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73  d from the cells
24a40 20 62 65 66 6f 72 65 20 74 68 65 79 20 61 72 65   before they are
24a50 20 63 6f 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74   copied.  ** int
24a60 6f 20 61 53 70 61 63 65 5b 5d 2e 20 20 49 6e 20  o aSpace[].  In 
24a70 74 68 69 73 20 77 61 79 2c 20 61 6c 6c 20 63 65  this way, all ce
24a80 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
24a90 61 72 65 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a  are without.  **
24aa0 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e   child pointers.
24ab0 20 20 49 66 20 73 69 62 6c 69 6e 67 73 20 61 72    If siblings ar
24ac0 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68  e not leaves, th
24ad0 65 6e 20 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20  en all cell in. 
24ae0 20 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63   ** apCell[] inc
24af0 6c 75 64 65 20 63 68 69 6c 64 20 70 6f 69 6e 74  lude child point
24b00 65 72 73 2e 20 20 45 69 74 68 65 72 20 77 61 79  ers.  Either way
24b10 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61  , all cells in a
24b20 70 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65  pCell[].  ** are
24b30 20 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a   alike..  **.  *
24b40 2a 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  * leafCorrection
24b50 3a 20 20 34 20 69 66 20 70 50 61 67 65 20 69 73  :  4 if pPage is
24b60 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20 70   a leaf.  0 if p
24b70 50 61 67 65 20 69 73 20 6e 6f 74 20 61 20 6c 65  Page is not a le
24b80 61 66 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c  af..  **       l
24b90 65 61 66 44 61 74 61 3a 20 20 31 20 69 66 20 70  eafData:  1 if p
24ba0 50 61 67 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64  Page holds key+d
24bb0 61 74 61 20 61 6e 64 20 70 50 61 72 65 6e 74 20  ata and pParent 
24bc0 68 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e  holds only keys.
24bd0 0a 20 20 2a 2f 0a 20 20 6e 43 65 6c 6c 20 3d 20  .  */.  nCell = 
24be0 30 3b 0a 20 20 6c 65 61 66 43 6f 72 72 65 63 74  0;.  leafCorrect
24bf0 69 6f 6e 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61  ion = pPage->lea
24c00 66 2a 34 3b 0a 20 20 6c 65 61 66 44 61 74 61 20  f*4;.  leafData 
24c10 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74  = pPage->leafDat
24c20 61 20 26 26 20 70 50 61 67 65 2d 3e 6c 65 61 66  a && pPage->leaf
24c30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
24c40 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d  Old; i++){.    M
24c50 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61  emPage *pOld = a
24c60 70 43 6f 70 79 5b 69 5d 3b 0a 20 20 20 20 69 6e  pCopy[i];.    in
24c70 74 20 6c 69 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e  t limit = pOld->
24c80 6e 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65  nCell+pOld->nOve
24c90 72 66 6c 6f 77 3b 0a 20 20 20 20 66 6f 72 28 6a  rflow;.    for(j
24ca0 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b  =0; j<limit; j++
24cb0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
24cc0 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73   nCell<nMaxCells
24cd0 20 29 3b 0a 20 20 20 20 20 20 61 70 43 65 6c 6c   );.      apCell
24ce0 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76  [nCell] = findOv
24cf0 65 72 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c  erflowCell(pOld,
24d00 20 6a 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c   j);.      szCel
24d10 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53  l[nCell] = cellS
24d20 69 7a 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43  izePtr(pOld, apC
24d30 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 23 69 66  ell[nCell]);.#if
24d40 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
24d50 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
24d60 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
24d70 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20  acuum ){.       
24d80 20 69 6e 74 20 61 3b 0a 20 20 20 20 20 20 20 20   int a;.        
24d90 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 69  aFrom[nCell] = i
24da0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 61 3d  ;.        for(a=
24db0 30 3b 20 61 3c 70 4f 6c 64 2d 3e 6e 4f 76 65 72  0; a<pOld->nOver
24dc0 66 6c 6f 77 3b 20 61 2b 2b 29 7b 0a 20 20 20 20  flow; a++){.    
24dd0 20 20 20 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e        if( pOld->
24de0 61 4f 76 66 6c 5b 61 5d 2e 70 43 65 6c 6c 3d 3d  aOvfl[a].pCell==
24df0 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 29 7b  apCell[nCell] ){
24e00 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 46 72  .            aFr
24e10 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78 46 46  om[nCell] = 0xFF
24e20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
24e30 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
24e40 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
24e50 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
24e60 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20  nCell++;.    }. 
24e70 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31 20     if( i<nOld-1 
24e80 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20  ){.      int sz 
24e90 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
24ea0 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29  arent, apDiv[i])
24eb0 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61 66  ;.      if( leaf
24ec0 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
24ed0 2f 2a 20 57 69 74 68 20 74 68 65 20 4c 45 41 46  /* With the LEAF
24ee0 44 41 54 41 20 66 6c 61 67 2c 20 70 50 61 72 65  DATA flag, pPare
24ef0 6e 74 20 63 65 6c 6c 73 20 68 6f 6c 64 20 6f 6e  nt cells hold on
24f00 6c 79 20 49 4e 54 4b 45 59 73 20 74 68 61 74 0a  ly INTKEYs that.
24f10 20 20 20 20 20 20 20 20 2a 2a 20 61 72 65 20 64          ** are d
24f20 75 70 6c 69 63 61 74 65 73 20 6f 66 20 6b 65 79  uplicates of key
24f30 73 20 6f 6e 20 74 68 65 20 63 68 69 6c 64 20 70  s on the child p
24f40 61 67 65 73 2e 20 20 57 65 20 6e 65 65 64 20 74  ages.  We need t
24f50 6f 20 72 65 6d 6f 76 65 0a 20 20 20 20 20 20 20  o remove.       
24f60 20 2a 2a 20 74 68 65 20 64 69 76 69 64 65 72 20   ** the divider 
24f70 63 65 6c 6c 73 20 66 72 6f 6d 20 70 50 61 72 65  cells from pPare
24f80 6e 74 2c 20 62 75 74 20 74 68 65 20 64 69 76 69  nt, but the divi
24f90 64 65 72 73 20 63 65 6c 6c 73 20 61 72 65 20 6e  ders cells are n
24fa0 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64  ot.        ** ad
24fb0 64 65 64 20 74 6f 20 61 70 43 65 6c 6c 5b 5d 20  ded to apCell[] 
24fc0 62 65 63 61 75 73 65 20 74 68 65 79 20 61 72 65  because they are
24fd0 20 64 75 70 6c 69 63 61 74 65 73 20 6f 66 20 63   duplicates of c
24fe0 68 69 6c 64 20 63 65 6c 6c 73 2e 0a 20 20 20 20  hild cells..    
24ff0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 64      */.        d
25000 72 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  ropCell(pParent,
25010 20 6e 78 44 69 76 2c 20 73 7a 29 3b 0a 20 20 20   nxDiv, sz);.   
25020 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25030 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20    u8 *pTemp;.   
25040 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65       assert( nCe
25050 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a  ll<nMaxCells );.
25060 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e          szCell[n
25070 43 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20  Cell] = sz;.    
25080 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61 53 70      pTemp = &aSp
25090 61 63 65 5b 69 53 70 61 63 65 5d 3b 0a 20 20 20  ace[iSpace];.   
250a0 20 20 20 20 20 69 53 70 61 63 65 20 2b 3d 20 73       iSpace += s
250b0 7a 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  z;.        asser
250c0 74 28 20 69 53 70 61 63 65 3c 3d 70 42 74 2d 3e  t( iSpace<=pBt->
250d0 70 61 67 65 53 69 7a 65 2a 35 20 29 3b 0a 20 20  pageSize*5 );.  
250e0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65        memcpy(pTe
250f0 6d 70 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a  mp, apDiv[i], sz
25100 29 3b 0a 20 20 20 20 20 20 20 20 61 70 43 65 6c  );.        apCel
25110 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70 54 65 6d 70  l[nCell] = pTemp
25120 2b 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b  +leafCorrection;
25130 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
25140 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
25150 20 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d          if( pBt-
25160 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
25170 20 20 20 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e           aFrom[n
25180 43 65 6c 6c 5d 20 3d 20 30 78 46 46 3b 0a 20 20  Cell] = 0xFF;.  
25190 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
251a0 20 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28         dropCell(
251b0 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20  pParent, nxDiv, 
251c0 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43  sz);.        szC
251d0 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d 3d 20 6c 65  ell[nCell] -= le
251e0 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20  afCorrection;.  
251f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 67 65        assert( ge
25200 74 34 62 79 74 65 28 70 54 65 6d 70 29 3d 3d 70  t4byte(pTemp)==p
25210 67 6e 6f 4f 6c 64 5b 69 5d 20 29 3b 0a 20 20 20  gnoOld[i] );.   
25220 20 20 20 20 20 69 66 28 20 21 70 4f 6c 64 2d 3e       if( !pOld->
25230 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
25240 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f    assert( leafCo
25250 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20  rrection==0 );. 
25260 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
25270 72 69 67 68 74 20 70 6f 69 6e 74 65 72 20 6f 66  right pointer of
25280 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
25290 70 4f 6c 64 20 62 65 63 6f 6d 65 73 20 74 68 65  pOld becomes the
252a0 20 6c 65 66 74 0a 20 20 20 20 20 20 20 20 20 20   left.          
252b0 2a 2a 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68  ** pointer of th
252c0 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a  e divider cell *
252d0 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  /.          memc
252e0 70 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  py(apCell[nCell]
252f0 2c 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61 5b 70  , &pOld->aData[p
25300 4f 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  Old->hdrOffset+8
25310 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d  ], 4);.        }
25320 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
25330 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72  assert( leafCorr
25340 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20  ection==4 );.   
25350 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e       }.        n
25360 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  Cell++;.      }.
25370 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a      }.  }..  /*.
25380 20 20 2a 2a 20 46 69 67 75 72 65 20 6f 75 74 20    ** Figure out 
25390 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
253a0 67 65 73 20 6e 65 65 64 65 64 20 74 6f 20 68 6f  ges needed to ho
253b0 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c  ld all nCell cel
253c0 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f 72 65 20 74  ls..  ** Store t
253d0 68 69 73 20 6e 75 6d 62 65 72 20 69 6e 20 22 6b  his number in "k
253e0 22 2e 20 20 41 6c 73 6f 20 63 6f 6d 70 75 74 65  ".  Also compute
253f0 20 73 7a 4e 65 77 5b 5d 20 77 68 69 63 68 20 69   szNew[] which i
25400 73 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 2a 2a  s the total.  **
25410 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c   size of all cel
25420 6c 73 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 70  ls on the i-th p
25430 61 67 65 20 61 6e 64 20 63 6e 74 4e 65 77 5b 5d  age and cntNew[]
25440 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e   which is the in
25450 64 65 78 0a 20 20 2a 2a 20 69 6e 20 61 70 43 65  dex.  ** in apCe
25460 6c 6c 5b 5d 20 6f 66 20 74 68 65 20 63 65 6c 6c  ll[] of the cell
25470 20 74 68 61 74 20 64 69 76 69 64 65 73 20 70 61   that divides pa
25480 67 65 20 69 20 66 72 6f 6d 20 70 61 67 65 20 69  ge i from page i
25490 2b 31 2e 20 20 0a 20 20 2a 2a 20 63 6e 74 4e 65  +1.  .  ** cntNe
254a0 77 5b 6b 5d 20 73 68 6f 75 6c 64 20 65 71 75 61  w[k] should equa
254b0 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20  l nCell..  **.  
254c0 2a 2a 20 56 61 6c 75 65 73 20 63 6f 6d 70 75 74  ** Values comput
254d0 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b  ed by this block
254e0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
254f0 20 20 20 20 20 20 6b 3a 20 54 68 65 20 74 6f 74        k: The tot
25500 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62  al number of sib
25510 6c 69 6e 67 20 70 61 67 65 73 0a 20 20 2a 2a 20  ling pages.  ** 
25520 20 20 20 73 7a 4e 65 77 5b 69 5d 3a 20 53 70 61     szNew[i]: Spa
25530 63 65 64 20 75 73 65 64 20 6f 6e 20 74 68 65 20  ced used on the 
25540 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67  i-th sibling pag
25550 65 2e 0a 20 20 2a 2a 20 20 20 63 6e 74 4e 65 77  e..  **   cntNew
25560 5b 69 5d 3a 20 49 6e 64 65 78 20 69 6e 20 61 70  [i]: Index in ap
25570 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c  Cell[] and szCel
25580 6c 5b 5d 20 66 6f 72 20 74 68 65 20 66 69 72 73  l[] for the firs
25590 74 20 63 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20  t cell to.  **  
255a0 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
255b0 72 69 67 68 74 20 6f 66 20 74 68 65 20 69 2d 74  right of the i-t
255c0 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a  h sibling page..
255d0 20 20 2a 2a 20 75 73 61 62 6c 65 53 70 61 63 65    ** usableSpace
255e0 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  : Number of byte
255f0 73 20 6f 66 20 73 70 61 63 65 20 61 76 61 69 6c  s of space avail
25600 61 62 6c 65 20 6f 6e 20 65 61 63 68 20 73 69 62  able on each sib
25610 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f  ling..  ** .  */
25620 0a 20 20 75 73 61 62 6c 65 53 70 61 63 65 20 3d  .  usableSpace =
25630 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
25640 20 2d 20 31 32 20 2b 20 6c 65 61 66 43 6f 72 72   - 12 + leafCorr
25650 65 63 74 69 6f 6e 3b 0a 20 20 66 6f 72 28 73 75  ection;.  for(su
25660 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c  btotal=k=i=0; i<
25670 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
25680 20 61 73 73 65 72 74 28 20 69 3c 6e 4d 61 78 43   assert( i<nMaxC
25690 65 6c 6c 73 20 29 3b 0a 20 20 20 20 73 75 62 74  ells );.    subt
256a0 6f 74 61 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69  otal += szCell[i
256b0 5d 20 2b 20 32 3b 0a 20 20 20 20 69 66 28 20 73  ] + 2;.    if( s
256c0 75 62 74 6f 74 61 6c 20 3e 20 75 73 61 62 6c 65  ubtotal > usable
256d0 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 73  Space ){.      s
256e0 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74  zNew[k] = subtot
256f0 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a  al - szCell[i];.
25700 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 6b 5d 20        cntNew[k] 
25710 3d 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6c  = i;.      if( l
25720 65 61 66 44 61 74 61 20 29 7b 20 69 2d 2d 3b 20  eafData ){ i--; 
25730 7d 0a 20 20 20 20 20 20 73 75 62 74 6f 74 61 6c  }.      subtotal
25740 20 3d 20 30 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b   = 0;.      k++;
25750 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e  .    }.  }.  szN
25760 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c  ew[k] = subtotal
25770 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20  ;.  cntNew[k] = 
25780 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20  nCell;.  k++;.. 
25790 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61 63   /*.  ** The pac
257a0 6b 69 6e 67 20 63 6f 6d 70 75 74 65 64 20 62 79  king computed by
257b0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 62 6c   the previous bl
257c0 6f 63 6b 20 69 73 20 62 69 61 73 65 64 20 74 6f  ock is biased to
257d0 77 61 72 64 20 74 68 65 20 73 69 62 6c 69 6e 67  ward the sibling
257e0 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 65  s.  ** on the le
257f0 66 74 20 73 69 64 65 2e 20 20 54 68 65 20 6c 65  ft side.  The le
25800 66 74 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  ft siblings are 
25810 61 6c 77 61 79 73 20 6e 65 61 72 6c 79 20 66 75  always nearly fu
25820 6c 6c 2c 20 77 68 69 6c 65 20 74 68 65 0a 20 20  ll, while the.  
25830 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69  ** right-most si
25840 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20 6e  bling might be n
25850 65 61 72 6c 79 20 65 6d 70 74 79 2e 20 20 54 68  early empty.  Th
25860 69 73 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65  is block of code
25870 20 61 74 74 65 6d 70 74 73 0a 20 20 2a 2a 20 74   attempts.  ** t
25880 6f 20 61 64 6a 75 73 74 20 74 68 65 20 70 61 63  o adjust the pac
25890 6b 69 6e 67 20 6f 66 20 73 69 62 6c 69 6e 67 73  king of siblings
258a0 20 74 6f 20 67 65 74 20 61 20 62 65 74 74 65 72   to get a better
258b0 20 62 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20   balance..  **. 
258c0 20 2a 2a 20 54 68 69 73 20 61 64 6a 75 73 74 6d   ** This adjustm
258d0 65 6e 74 20 69 73 20 6d 6f 72 65 20 74 68 61 6e  ent is more than
258e0 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
258f0 2e 20 20 54 68 65 20 70 61 63 6b 69 6e 67 20 61  .  The packing a
25900 62 6f 76 65 20 6d 69 67 68 74 0a 20 20 2a 2a 20  bove might.  ** 
25910 62 65 20 73 6f 20 6f 75 74 20 6f 66 20 62 61 6c  be so out of bal
25920 61 6e 63 65 20 61 73 20 74 6f 20 62 65 20 69 6c  ance as to be il
25930 6c 65 67 61 6c 2e 20 20 46 6f 72 20 65 78 61 6d  legal.  For exam
25940 70 6c 65 2c 20 74 68 65 20 72 69 67 68 74 2d 6d  ple, the right-m
25950 6f 73 74 0a 20 20 2a 2a 20 73 69 62 6c 69 6e 67  ost.  ** sibling
25960 20 6d 69 67 68 74 20 62 65 20 63 6f 6d 70 6c 65   might be comple
25970 74 65 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69  tely empty.  Thi
25980 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20  s adjustment is 
25990 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20  not optional..  
259a0 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d 31 3b 20  */.  for(i=k-1; 
259b0 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69  i>0; i--){.    i
259c0 6e 74 20 73 7a 52 69 67 68 74 20 3d 20 73 7a 4e  nt szRight = szN
259d0 65 77 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a 65 20  ew[i];  /* Size 
259e0 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68  of sibling on th
259f0 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 69  e right */.    i
25a00 6e 74 20 73 7a 4c 65 66 74 20 3d 20 73 7a 4e 65  nt szLeft = szNe
25a10 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65 20  w[i-1]; /* Size 
25a20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68  of sibling on th
25a30 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 69 6e  e left */.    in
25a40 74 20 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  t r;            
25a50 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 69    /* Index of ri
25a60 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 69 6e  ght-most cell in
25a70 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 20 2a 2f   left sibling */
25a80 0a 20 20 20 20 69 6e 74 20 64 3b 20 20 20 20 20  .    int d;     
25a90 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
25aa0 78 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20  x of first cell 
25ab0 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 72  to the left of r
25ac0 69 67 68 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a  ight sibling */.
25ad0 0a 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b  .    r = cntNew[
25ae0 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 64 20  i-1] - 1;.    d 
25af0 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61  = r + 1 - leafDa
25b00 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ta;.    assert( 
25b10 64 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  d<nMaxCells );. 
25b20 20 20 20 61 73 73 65 72 74 28 20 72 3c 6e 4d 61     assert( r<nMa
25b30 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 77 68  xCells );.    wh
25b40 69 6c 65 28 20 73 7a 52 69 67 68 74 3d 3d 30 20  ile( szRight==0 
25b50 7c 7c 20 73 7a 52 69 67 68 74 2b 73 7a 43 65 6c  || szRight+szCel
25b60 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28  l[d]+2<=szLeft-(
25b70 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29 20 29 7b 0a  szCell[r]+2) ){.
25b80 20 20 20 20 20 20 73 7a 52 69 67 68 74 20 2b 3d        szRight +=
25b90 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a   szCell[d] + 2;.
25ba0 20 20 20 20 20 20 73 7a 4c 65 66 74 20 2d 3d 20        szLeft -= 
25bb0 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20  szCell[r] + 2;. 
25bc0 20 20 20 20 20 63 6e 74 4e 65 77 5b 69 2d 31 5d       cntNew[i-1]
25bd0 2d 2d 3b 0a 20 20 20 20 20 20 72 20 3d 20 63 6e  --;.      r = cn
25be0 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20  tNew[i-1] - 1;. 
25bf0 20 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d       d = r + 1 -
25c00 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20 7d   leafData;.    }
25c10 0a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20  .    szNew[i] = 
25c20 73 7a 52 69 67 68 74 3b 0a 20 20 20 20 73 7a 4e  szRight;.    szN
25c30 65 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65 66 74  ew[i-1] = szLeft
25c40 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68  ;.  }..  /* Eith
25c50 65 72 20 77 65 20 66 6f 75 6e 64 20 6f 6e 65 20  er we found one 
25c60 6f 72 20 6d 6f 72 65 20 63 65 6c 6c 73 20 28 63  or more cells (c
25c70 6e 74 6e 65 77 5b 30 5d 29 3e 30 29 20 6f 72 20  ntnew[0])>0) or 
25c80 77 65 20 61 72 65 20 74 68 65 0a 20 20 2a 2a 20  we are the.  ** 
25c90 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  a virtual root p
25ca0 61 67 65 2e 20 20 41 20 76 69 72 74 75 61 6c 20  age.  A virtual 
25cb0 72 6f 6f 74 20 70 61 67 65 20 69 73 20 77 68 65  root page is whe
25cc0 6e 20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74 0a  n the real root.
25cd0 20 20 2a 2a 20 70 61 67 65 20 69 73 20 70 61 67    ** page is pag
25ce0 65 20 31 20 61 6e 64 20 77 65 20 61 72 65 20 74  e 1 and we are t
25cf0 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 6f 66  he only child of
25d00 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 2a 2f   that page..  */
25d10 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 4e 65  .  assert( cntNe
25d20 77 5b 30 5d 3e 30 20 7c 7c 20 28 70 50 61 72 65  w[0]>0 || (pPare
25d30 6e 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26 20 70  nt->pgno==1 && p
25d40 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30  Parent->nCell==0
25d50 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  ) );..  /*.  ** 
25d60 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77 20 70  Allocate k new p
25d70 61 67 65 73 2e 20 20 52 65 75 73 65 20 6f 6c 64  ages.  Reuse old
25d80 20 70 61 67 65 73 20 77 68 65 72 65 20 70 6f 73   pages where pos
25d90 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  sible..  */.  as
25da0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e  sert( pPage->pgn
25db0 6f 3e 31 20 29 3b 0a 20 20 70 61 67 65 46 6c 61  o>1 );.  pageFla
25dc0 67 73 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  gs = pPage->aDat
25dd0 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  a[0];.  for(i=0;
25de0 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<k; i++){.    
25df0 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20  MemPage *pNew;. 
25e00 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20 29 7b     if( i<nOld ){
25e10 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61 70  .      pNew = ap
25e20 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b 69  New[i] = apOld[i
25e30 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65 77  ];.      pgnoNew
25e40 5b 69 5d 20 3d 20 70 67 6e 6f 4f 6c 64 5b 69 5d  [i] = pgnoOld[i]
25e50 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64 5b 69 5d  ;.      apOld[i]
25e60 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
25e70 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
25e80 69 74 65 28 70 4e 65 77 2d 3e 61 44 61 74 61 29  ite(pNew->aData)
25e90 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
25ea0 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
25eb0 65 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c 73 65  eanup;.    }else
25ec0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
25ed0 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20  i>0 );.      rc 
25ee0 3d 20 61 6c 6c 6f 63 61 74 65 50 61 67 65 28 70  = allocatePage(p
25ef0 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f  Bt, &pNew, &pgno
25f00 4e 65 77 5b 69 5d 2c 20 70 67 6e 6f 4e 65 77 5b  New[i], pgnoNew[
25f10 69 2d 31 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  i-1], 0);.      
25f20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
25f30 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
25f40 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20       apNew[i] = 
25f50 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pNew;.    }.    
25f60 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 7a 65 72 6f  nNew++;.    zero
25f70 50 61 67 65 28 70 4e 65 77 2c 20 70 61 67 65 46  Page(pNew, pageF
25f80 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  lags);.  }..  /*
25f90 20 46 72 65 65 20 61 6e 79 20 6f 6c 64 20 70 61   Free any old pa
25fa0 67 65 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f  ges that were no
25fb0 74 20 72 65 75 73 65 64 20 61 73 20 6e 65 77 20  t reused as new 
25fc0 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68  pages..  */.  wh
25fd0 69 6c 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20  ile( i<nOld ){. 
25fe0 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
25ff0 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20  (apOld[i]);.    
26000 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
26010 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
26020 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61     releasePage(a
26030 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70  pOld[i]);.    ap
26040 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  Old[i] = 0;.    
26050 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  i++;.  }..  /*. 
26060 20 2a 2a 20 50 75 74 20 74 68 65 20 6e 65 77 20   ** Put the new 
26070 70 61 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69  pages in accendi
26080 6e 67 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20  ng order.  This 
26090 68 65 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65  helps to.  ** ke
260a0 65 70 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ep entries in th
260b0 65 20 64 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f  e disk file in o
260c0 72 64 65 72 20 73 6f 20 74 68 61 74 20 61 20 73  rder so that a s
260d0 63 61 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  can.  ** of the 
260e0 74 61 62 6c 65 20 69 73 20 61 20 6c 69 6e 65 61  table is a linea
260f0 72 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74  r scan through t
26100 68 65 20 66 69 6c 65 2e 20 20 54 68 61 74 0a 20  he file.  That. 
26110 20 2a 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c 70   ** in turn help
26120 73 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  s the operating 
26130 73 79 73 74 65 6d 20 74 6f 20 64 65 6c 69 76 65  system to delive
26140 72 20 70 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f  r pages.  ** fro
26150 6d 20 74 68 65 20 64 69 73 6b 20 6d 6f 72 65 20  m the disk more 
26160 72 61 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20  rapidly..  **.  
26170 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29 20 69 6e 73  ** An O(n^2) ins
26180 65 72 74 69 6f 6e 20 73 6f 72 74 20 61 6c 67 6f  ertion sort algo
26190 72 69 74 68 6d 20 69 73 20 75 73 65 64 2c 20 62  rithm is used, b
261a0 75 74 20 73 69 6e 63 65 0a 20 20 2a 2a 20 6e 20  ut since.  ** n 
261b0 69 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 74 68  is never more th
261c0 61 6e 20 4e 42 20 28 61 20 73 6d 61 6c 6c 20 63  an NB (a small c
261d0 6f 6e 73 74 61 6e 74 29 2c 20 74 68 61 74 20 73  onstant), that s
261e0 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20 62  hould.  ** not b
261f0 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a  e a problem..  *
26200 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d  *.  ** When NB==
26210 33 2c 20 74 68 69 73 20 6f 6e 65 20 6f 70 74 69  3, this one opti
26220 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b 65 73 20 74  mization makes t
26230 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  he database.  **
26240 20 61 62 6f 75 74 20 32 35 25 20 66 61 73 74 65   about 25% faste
26250 72 20 66 6f 72 20 6c 61 72 67 65 20 69 6e 73 65  r for large inse
26260 72 74 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74  rtions and delet
26270 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ions..  */.  for
26280 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b  (i=0; i<k-1; i++
26290 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 56 20  ){.    int minV 
262a0 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20  = pgnoNew[i];.  
262b0 20 20 69 6e 74 20 6d 69 6e 49 20 3d 20 69 3b 0a    int minI = i;.
262c0 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a      for(j=i+1; j
262d0 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <k; j++){.      
262e0 69 66 28 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3c 28  if( pgnoNew[j]<(
262f0 75 6e 73 69 67 6e 65 64 29 6d 69 6e 56 20 29 7b  unsigned)minV ){
26300 0a 20 20 20 20 20 20 20 20 6d 69 6e 49 20 3d 20  .        minI = 
26310 6a 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e 56 20  j;.        minV 
26320 3d 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3b 0a 20 20  = pgnoNew[j];.  
26330 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
26340 69 66 28 20 6d 69 6e 49 3e 69 20 29 7b 0a 20 20  if( minI>i ){.  
26350 20 20 20 20 69 6e 74 20 74 3b 0a 20 20 20 20 20      int t;.     
26360 20 4d 65 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20   MemPage *pT;.  
26370 20 20 20 20 74 20 3d 20 70 67 6e 6f 4e 65 77 5b      t = pgnoNew[
26380 69 5d 3b 0a 20 20 20 20 20 20 70 54 20 3d 20 61  i];.      pT = a
26390 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 70  pNew[i];.      p
263a0 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70 67 6e 6f  gnoNew[i] = pgno
263b0 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20  New[minI];.     
263c0 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4e 65   apNew[i] = apNe
263d0 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 70  w[minI];.      p
263e0 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 74  gnoNew[minI] = t
263f0 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 6d 69  ;.      apNew[mi
26400 6e 49 5d 20 3d 20 70 54 3b 0a 20 20 20 20 7d 0a  nI] = pT;.    }.
26410 20 20 7d 0a 20 20 54 52 41 43 45 28 28 22 42 41    }.  TRACE(("BA
26420 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20 25  LANCE: old: %d %
26430 64 20 25 64 20 20 6e 65 77 3a 20 25 64 28 25 64  d %d  new: %d(%d
26440 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20  ) %d(%d) %d(%d) 
26450 25 64 28 25 64 29 20 25 64 28 25 64 29 5c 6e 22  %d(%d) %d(%d)\n"
26460 2c 0a 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 30 5d  ,.    pgnoOld[0]
26470 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f  , .    nOld>=2 ?
26480 20 70 67 6e 6f 4f 6c 64 5b 31 5d 20 3a 20 30 2c   pgnoOld[1] : 0,
26490 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 70  .    nOld>=3 ? p
264a0 67 6e 6f 4f 6c 64 5b 32 5d 20 3a 20 30 2c 0a 20  gnoOld[2] : 0,. 
264b0 20 20 20 70 67 6e 6f 4e 65 77 5b 30 5d 2c 20 73     pgnoNew[0], s
264c0 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65  zNew[0],.    nNe
264d0 77 3e 3d 32 20 3f 20 70 67 6e 6f 4e 65 77 5b 31  w>=2 ? pgnoNew[1
264e0 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f  ] : 0, nNew>=2 ?
264f0 20 73 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a 20   szNew[1] : 0,. 
26500 20 20 20 6e 4e 65 77 3e 3d 33 20 3f 20 70 67 6e     nNew>=3 ? pgn
26510 6f 4e 65 77 5b 32 5d 20 3a 20 30 2c 20 6e 4e 65  oNew[2] : 0, nNe
26520 77 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b 32 5d 20  w>=3 ? szNew[2] 
26530 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 34  : 0,.    nNew>=4
26540 20 3f 20 70 67 6e 6f 4e 65 77 5b 33 5d 20 3a 20   ? pgnoNew[3] : 
26550 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e  0, nNew>=4 ? szN
26560 65 77 5b 33 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ew[3] : 0,.    n
26570 4e 65 77 3e 3d 35 20 3f 20 70 67 6e 6f 4e 65 77  New>=5 ? pgnoNew
26580 5b 34 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35  [4] : 0, nNew>=5
26590 20 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a 20 30 29   ? szNew[4] : 0)
265a0 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 76  );..  /*.  ** Ev
265b0 65 6e 6c 79 20 64 69 73 74 72 69 62 75 74 65 20  enly distribute 
265c0 74 68 65 20 64 61 74 61 20 69 6e 20 61 70 43 65  the data in apCe
265d0 6c 6c 5b 5d 20 61 63 72 6f 73 73 20 74 68 65 20  ll[] across the 
265e0 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20  new pages..  ** 
265f0 49 6e 73 65 72 74 20 64 69 76 69 64 65 72 20 63  Insert divider c
26600 65 6c 6c 73 20 69 6e 74 6f 20 70 50 61 72 65 6e  ells into pParen
26610 74 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a  t as necessary..
26620 20 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20 20    */.  j = 0;.  
26630 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b  for(i=0; i<nNew;
26640 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 41 73   i++){.    /* As
26650 73 65 6d 62 6c 65 20 74 68 65 20 6e 65 77 20 73  semble the new s
26660 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a  ibling page. */.
26670 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65      MemPage *pNe
26680 77 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20  w = apNew[i];.  
26690 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78    assert( j<nMax
266a0 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73  Cells );.    ass
266b0 65 72 74 28 20 70 4e 65 77 2d 3e 70 67 6e 6f 3d  ert( pNew->pgno=
266c0 3d 70 67 6e 6f 4e 65 77 5b 69 5d 20 29 3b 0a 20  =pgnoNew[i] );. 
266d0 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28     assemblePage(
266e0 70 4e 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d  pNew, cntNew[i]-
266f0 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26  j, &apCell[j], &
26700 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20  szCell[j]);.    
26710 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 43  assert( pNew->nC
26720 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d  ell>0 || (nNew==
26730 31 20 26 26 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d  1 && cntNew[0]==
26740 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  0) );.    assert
26750 28 20 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f  ( pNew->nOverflo
26760 77 3d 3d 30 20 29 3b 0a 0a 23 69 66 6e 64 65 66  w==0 );..#ifndef
26770 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
26780 4f 56 41 43 55 55 4d 0a 20 20 20 20 2f 2a 20 49  OVACUUM.    /* I
26790 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74  f this is an aut
267a0 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
267b0 65 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f  e, update the po
267c0 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65  inter map entrie
267d0 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 70 6f  s.    ** that po
267e0 69 6e 74 20 74 6f 20 74 68 65 20 73 69 62 6c 69  int to the sibli
267f0 6e 67 73 20 74 68 61 74 20 77 65 72 65 20 72 65  ngs that were re
26800 61 72 72 61 6e 67 65 64 2e 20 54 68 65 73 65 20  arranged. These 
26810 63 61 6e 20 62 65 3a 20 6c 65 66 74 0a 20 20 20  can be: left.   
26820 20 2a 2a 20 63 68 69 6c 64 72 65 6e 20 6f 66 20   ** children of 
26830 63 65 6c 6c 73 2c 20 74 68 65 20 72 69 67 68 74  cells, the right
26840 2d 63 68 69 6c 64 20 6f 66 20 74 68 65 20 70 61  -child of the pa
26850 67 65 2c 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20  ge, or overflow 
26860 70 61 67 65 73 0a 20 20 20 20 2a 2a 20 70 6f 69  pages.    ** poi
26870 6e 74 65 64 20 74 6f 20 62 79 20 63 65 6c 6c 73  nted to by cells
26880 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
26890 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
268a0 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d   ){.      for(k=
268b0 6a 3b 20 6b 3c 63 6e 74 4e 65 77 5b 69 5d 3b 20  j; k<cntNew[i]; 
268c0 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73  k++){.        as
268d0 73 65 72 74 28 20 6b 3c 6e 4d 61 78 43 65 6c 6c  sert( k<nMaxCell
268e0 73 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  s );.        if(
268f0 20 61 46 72 6f 6d 5b 6b 5d 3d 3d 30 78 46 46 20   aFrom[k]==0xFF 
26900 7c 7c 20 61 70 43 6f 70 79 5b 61 46 72 6f 6d 5b  || apCopy[aFrom[
26910 6b 5d 5d 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d  k]]->pgno!=pNew-
26920 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20  >pgno ){.       
26930 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
26940 74 4f 76 66 6c 28 70 4e 65 77 2c 20 6b 2d 6a 29  tOvfl(pNew, k-j)
26950 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
26960 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
26970 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
26980 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
26990 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  p;.          }. 
269a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
269b0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
269c0 20 20 20 6a 20 3d 20 63 6e 74 4e 65 77 5b 69 5d     j = cntNew[i]
269d0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
269e0 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 61 73   sibling page as
269f0 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 77 61  sembled above wa
26a00 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 2d  s not the right-
26a10 6d 6f 73 74 20 73 69 62 6c 69 6e 67 2c 0a 20 20  most sibling,.  
26a20 20 20 2a 2a 20 69 6e 73 65 72 74 20 61 20 64 69    ** insert a di
26a30 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20  vider cell into 
26a40 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
26a50 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
26a60 69 3c 6e 4e 65 77 2d 31 20 26 26 20 6a 3c 6e 43  i<nNew-1 && j<nC
26a70 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 75 38 20  ell ){.      u8 
26a80 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 75 38  *pCell;.      u8
26a90 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 69   *pTemp;.      i
26aa0 6e 74 20 73 7a 3b 0a 0a 20 20 20 20 20 20 61 73  nt sz;..      as
26ab0 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c  sert( j<nMaxCell
26ac0 73 20 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c  s );.      pCell
26ad0 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20   = apCell[j];.  
26ae0 20 20 20 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b      sz = szCell[
26af0 6a 5d 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74  j] + leafCorrect
26b00 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ion;.      if( !
26b10 70 4e 65 77 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  pNew->leaf ){.  
26b20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e        memcpy(&pN
26b30 65 77 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 70 43  ew->aData[8], pC
26b40 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  ell, 4);.       
26b50 20 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20   pTemp = 0;.    
26b60 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 65 61 66    }else if( leaf
26b70 44 61 74 61 20 29 7b 0a 09 2f 2a 20 49 66 20 74  Data ){../* If t
26b80 68 65 20 74 72 65 65 20 69 73 20 61 20 6c 65 61  he tree is a lea
26b90 66 2d 64 61 74 61 20 74 72 65 65 2c 20 61 6e 64  f-data tree, and
26ba0 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72   the siblings ar
26bb0 65 20 6c 65 61 76 65 73 2c 20 0a 20 20 20 20 20  e leaves, .     
26bc0 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65     ** then there
26bd0 20 69 73 20 6e 6f 20 64 69 76 69 64 65 72 20 63   is no divider c
26be0 65 6c 6c 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e  ell in apCell[].
26bf0 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 64 69   Instead, the di
26c00 76 69 64 65 72 20 0a 20 20 20 20 20 20 20 20 2a  vider .        *
26c10 2a 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20  * cell consists 
26c20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b  of the integer k
26c30 65 79 20 66 6f 72 20 74 68 65 20 72 69 67 68 74  ey for the right
26c40 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f 66 20 0a 20  -most cell of . 
26c50 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 69         ** the si
26c60 62 6c 69 6e 67 2d 70 61 67 65 20 61 73 73 65 6d  bling-page assem
26c70 62 6c 65 64 20 61 62 6f 76 65 20 6f 6e 6c 79 2e  bled above only.
26c80 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
26c90 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
26ca0 6f 3b 0a 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a  o;.        j--;.
26cb0 20 20 20 20 20 20 20 20 70 61 72 73 65 43 65 6c          parseCel
26cc0 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43 65 6c  lPtr(pNew, apCel
26cd0 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  l[j], &info);.  
26ce0 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 26 61        pCell = &a
26cf0 53 70 61 63 65 5b 69 53 70 61 63 65 5d 3b 0a 20  Space[iSpace];. 
26d00 20 20 20 20 20 20 20 66 69 6c 6c 49 6e 43 65 6c         fillInCel
26d10 6c 28 70 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c  l(pParent, pCell
26d20 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20  , 0, info.nKey, 
26d30 30 2c 20 30 2c 20 26 73 7a 29 3b 0a 20 20 20 20  0, 0, &sz);.    
26d40 20 20 20 20 69 53 70 61 63 65 20 2b 3d 20 73 7a      iSpace += sz
26d50 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
26d60 28 20 69 53 70 61 63 65 3c 3d 70 42 74 2d 3e 70  ( iSpace<=pBt->p
26d70 61 67 65 53 69 7a 65 2a 35 20 29 3b 0a 20 20 20  ageSize*5 );.   
26d80 20 20 20 20 20 70 54 65 6d 70 20 3d 20 30 3b 0a       pTemp = 0;.
26d90 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
26da0 20 20 20 20 20 70 43 65 6c 6c 20 2d 3d 20 34 3b       pCell -= 4;
26db0 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d  .        pTemp =
26dc0 20 26 61 53 70 61 63 65 5b 69 53 70 61 63 65 5d   &aSpace[iSpace]
26dd0 3b 0a 20 20 20 20 20 20 20 20 69 53 70 61 63 65  ;.        iSpace
26de0 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20   += sz;.        
26df0 61 73 73 65 72 74 28 20 69 53 70 61 63 65 3c 3d  assert( iSpace<=
26e00 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 35 20  pBt->pageSize*5 
26e10 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
26e20 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c   rc = insertCell
26e30 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c  (pParent, nxDiv,
26e40 20 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54 65 6d   pCell, sz, pTem
26e50 70 2c 20 34 29 3b 0a 20 20 20 20 20 20 69 66 28  p, 4);.      if(
26e60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
26e70 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
26e80 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 70 75 74  eanup;.      put
26e90 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c  4byte(findOverfl
26ea0 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 6e  owCell(pParent,n
26eb0 78 44 69 76 29 2c 20 70 4e 65 77 2d 3e 70 67 6e  xDiv), pNew->pgn
26ec0 6f 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  o);.#ifndef SQLI
26ed0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
26ee0 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  UM.      /* If t
26ef0 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76  his is an auto-v
26f00 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20  acuum database, 
26f10 61 6e 64 20 6e 6f 74 20 61 20 6c 65 61 66 2d 64  and not a leaf-d
26f20 61 74 61 20 74 72 65 65 2c 0a 20 20 20 20 20 20  ata tree,.      
26f30 2a 2a 20 74 68 65 6e 20 75 70 64 61 74 65 20 74  ** then update t
26f40 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 77  he pointer map w
26f50 69 74 68 20 61 6e 20 65 6e 74 72 79 20 66 6f 72  ith an entry for
26f60 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
26f70 67 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  ge.      ** that
26f80 20 74 68 65 20 63 65 6c 6c 20 6a 75 73 74 20 69   the cell just i
26f90 6e 73 65 72 74 65 64 20 70 6f 69 6e 74 73 20 74  nserted points t
26fa0 6f 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20  o (if any)..    
26fb0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
26fc0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26  Bt->autoVacuum &
26fd0 26 20 21 6c 65 61 66 44 61 74 61 20 29 7b 0a 20  & !leafData ){. 
26fe0 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d         rc = ptrm
26ff0 61 70 50 75 74 4f 76 66 6c 28 70 50 61 72 65 6e  apPutOvfl(pParen
27000 74 2c 20 6e 78 44 69 76 29 3b 0a 20 20 20 20 20  t, nxDiv);.     
27010 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
27020 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
27030 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
27040 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20  leanup;.        
27050 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  }.      }.#endif
27060 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20  .      j++;.    
27070 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20 20 20 7d    nxDiv++;.    }
27080 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6a  .  }.  assert( j
27090 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ==nCell );.  ass
270a0 65 72 74 28 20 6e 4f 6c 64 3e 30 20 29 3b 0a 20  ert( nOld>0 );. 
270b0 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 30 20   assert( nNew>0 
270c0 29 3b 0a 20 20 69 66 28 20 28 70 61 67 65 46 6c  );.  if( (pageFl
270d0 61 67 73 20 26 20 50 54 46 5f 4c 45 41 46 29 3d  ags & PTF_LEAF)=
270e0 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  =0 ){.    memcpy
270f0 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d  (&apNew[nNew-1]-
27100 3e 61 44 61 74 61 5b 38 5d 2c 20 26 61 70 43 6f  >aData[8], &apCo
27110 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74  py[nOld-1]->aDat
27120 61 5b 38 5d 2c 20 34 29 3b 0a 20 20 7d 0a 20 20  a[8], 4);.  }.  
27130 69 66 28 20 6e 78 44 69 76 3d 3d 70 50 61 72 65  if( nxDiv==pPare
27140 6e 74 2d 3e 6e 43 65 6c 6c 2b 70 50 61 72 65 6e  nt->nCell+pParen
27150 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  t->nOverflow ){.
27160 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 6d 6f 73      /* Right-mos
27170 74 20 73 69 62 6c 69 6e 67 20 69 73 20 74 68 65  t sibling is the
27180 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c   right-most chil
27190 64 20 6f 66 20 70 50 61 72 65 6e 74 20 2a 2f 0a  d of pParent */.
271a0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
271b0 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61  arent->aData[pPa
271c0 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  rent->hdrOffset+
271d0 38 5d 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e 65 77  8], pgnoNew[nNew
271e0 2d 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  -1]);.  }else{. 
271f0 20 20 20 2f 2a 20 52 69 67 68 74 2d 6d 6f 73 74     /* Right-most
27200 20 73 69 62 6c 69 6e 67 20 69 73 20 74 68 65 20   sibling is the 
27210 6c 65 66 74 20 63 68 69 6c 64 20 6f 66 20 74 68  left child of th
27220 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
27230 20 70 50 61 72 65 6e 74 0a 20 20 20 20 2a 2a 20   pParent.    ** 
27240 70 61 73 74 20 74 68 65 20 72 69 67 68 74 2d 6d  past the right-m
27250 6f 73 74 20 64 69 76 69 64 65 72 20 65 6e 74 72  ost divider entr
27260 79 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74  y */.    put4byt
27270 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65  e(findOverflowCe
27280 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69  ll(pParent, nxDi
27290 76 29 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e 65 77  v), pgnoNew[nNew
272a0 2d 31 5d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  -1]);.  }..  /*.
272b0 20 20 2a 2a 20 52 65 70 61 72 65 6e 74 20 63 68    ** Reparent ch
272c0 69 6c 64 72 65 6e 20 6f 66 20 61 6c 6c 20 63 65  ildren of all ce
272d0 6c 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  lls..  */.  for(
272e0 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b  i=0; i<nNew; i++
272f0 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 70 61  ){.    rc = repa
27300 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73 28 61  rentChildPages(a
27310 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 69 66  pNew[i]);.    if
27320 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
27330 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
27340 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 72 63  leanup;.  }.  rc
27350 20 3d 20 72 65 70 61 72 65 6e 74 43 68 69 6c 64   = reparentChild
27360 50 61 67 65 73 28 70 50 61 72 65 6e 74 29 3b 0a  Pages(pParent);.
27370 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
27380 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e  _OK ) goto balan
27390 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 0a 20 20 2f  ce_cleanup;..  /
273a0 2a 0a 20 20 2a 2a 20 42 61 6c 61 6e 63 65 20 74  *.  ** Balance t
273b0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20  he parent page. 
273c0 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63   Note that the c
273d0 75 72 72 65 6e 74 20 70 61 67 65 20 28 70 50 61  urrent page (pPa
273e0 67 65 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20 68  ge) might.  ** h
273f0 61 76 65 20 62 65 65 6e 20 61 64 64 65 64 20 74  ave been added t
27400 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 73  o the freelist s
27410 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f 20 6c 6f  o it might no lo
27420 6e 67 65 72 20 62 65 20 69 6e 69 74 69 61 6c 69  nger be initiali
27430 7a 65 64 2e 0a 20 20 2a 2a 20 42 75 74 20 74 68  zed..  ** But th
27440 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 77 69  e parent page wi
27450 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 69 6e 69  ll always be ini
27460 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20  tialized..  */. 
27470 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
27480 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 72 63  ->isInit );.  rc
27490 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61 72 65   = balance(pPare
274a0 6e 74 2c 20 30 29 3b 0a 20 20 0a 20 20 2f 2a 0a  nt, 0);.  .  /*.
274b0 20 20 2a 2a 20 43 6c 65 61 6e 75 70 20 62 65 66    ** Cleanup bef
274c0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 20  ore returning.. 
274d0 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f 63 6c 65 61   */.balance_clea
274e0 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 46 72 65  nup:.  sqliteFre
274f0 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 66 6f 72  e(apCell);.  for
27500 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b  (i=0; i<nOld; i+
27510 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  +){.    releaseP
27520 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20  age(apOld[i]);. 
27530 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
27540 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nNew; i++){.    
27550 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4e 65  releasePage(apNe
27560 77 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 6c  w[i]);.  }.  rel
27570 65 61 73 65 50 61 67 65 28 70 50 61 72 65 6e 74  easePage(pParent
27580 29 3b 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c  );.  TRACE(("BAL
27590 41 4e 43 45 3a 20 66 69 6e 69 73 68 65 64 20 77  ANCE: finished w
275a0 69 74 68 20 25 64 3a 20 6f 6c 64 3d 25 64 20 6e  ith %d: old=%d n
275b0 65 77 3d 25 64 20 63 65 6c 6c 73 3d 25 64 5c 6e  ew=%d cells=%d\n
275c0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  ",.          pPa
275d0 67 65 2d 3e 70 67 6e 6f 2c 20 6e 4f 6c 64 2c 20  ge->pgno, nOld, 
275e0 6e 4e 65 77 2c 20 6e 43 65 6c 6c 29 29 3b 0a 20  nNew, nCell));. 
275f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
27600 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
27610 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20  e is called for 
27620 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
27630 20 61 20 62 74 72 65 65 20 77 68 65 6e 20 74 68   a btree when th
27640 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 63  e root.** page c
27650 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73  ontains no cells
27660 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70  .  This is an op
27670 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 6d 61 6b  portunity to mak
27680 65 20 74 68 65 20 74 72 65 65 0a 2a 2a 20 73 68  e the tree.** sh
27690 61 6c 6c 6f 77 65 72 20 62 79 20 6f 6e 65 20 6c  allower by one l
276a0 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  evel..*/.static 
276b0 69 6e 74 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c  int balance_shal
276c0 6c 6f 77 65 72 28 4d 65 6d 50 61 67 65 20 2a 70  lower(MemPage *p
276d0 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65  Page){.  MemPage
276e0 20 2a 70 43 68 69 6c 64 3b 20 20 20 20 20 20 20   *pChild;       
276f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c        /* The onl
27700 79 20 63 68 69 6c 64 20 70 61 67 65 20 6f 66 20  y child page of 
27710 70 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  pPage */.  Pgno 
27720 70 67 6e 6f 43 68 69 6c 64 3b 20 20 20 20 20 20  pgnoChild;      
27730 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
27740 6e 75 6d 62 65 72 20 66 6f 72 20 70 43 68 69 6c  number for pChil
27750 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  d */.  int rc = 
27760 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
27770 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
27780 64 65 20 66 72 6f 6d 20 73 75 62 70 72 6f 63 65  de from subproce
27790 64 75 72 65 73 20 2a 2f 0a 20 20 42 74 53 68 61  dures */.  BtSha
277a0 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20  red *pBt;       
277b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
277c0 65 20 6d 61 69 6e 20 42 54 72 65 65 20 73 74 72  e main BTree str
277d0 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20  ucture */.  int 
277e0 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 3b 20 20  mxCellPerPage;  
277f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
27800 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 65  mum number of ce
27810 6c 6c 73 20 70 65 72 20 70 61 67 65 20 2a 2f 0a  lls per page */.
27820 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 3b 20 20    u8 **apCell;  
27830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27840 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 66 72 6f 6d  * All cells from
27850 20 70 61 67 65 73 20 62 65 69 6e 67 20 62 61 6c   pages being bal
27860 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  anced */.  int *
27870 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20  szCell;         
27880 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c          /* Local
27890 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c   size of all cel
278a0 6c 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ls */..  assert(
278b0 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d   pPage->pParent=
278c0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
278d0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pPage->nCell==0 
278e0 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65  );.  pBt = pPage
278f0 2d 3e 70 42 74 3b 0a 20 20 6d 78 43 65 6c 6c 50  ->pBt;.  mxCellP
27900 65 72 50 61 67 65 20 3d 20 4d 58 5f 43 45 4c 4c  erPage = MX_CELL
27910 28 70 42 74 29 3b 0a 20 20 61 70 43 65 6c 6c 20  (pBt);.  apCell 
27920 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
27930 77 28 20 6d 78 43 65 6c 6c 50 65 72 50 61 67 65  w( mxCellPerPage
27940 2a 28 73 69 7a 65 6f 66 28 75 38 2a 29 2b 73 69  *(sizeof(u8*)+si
27950 7a 65 6f 66 28 69 6e 74 29 29 20 29 3b 0a 20 20  zeof(int)) );.  
27960 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29 20  if( apCell==0 ) 
27970 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
27980 4d 45 4d 3b 0a 20 20 73 7a 43 65 6c 6c 20 3d 20  MEM;.  szCell = 
27990 28 69 6e 74 2a 29 26 61 70 43 65 6c 6c 5b 6d 78  (int*)&apCell[mx
279a0 43 65 6c 6c 50 65 72 50 61 67 65 5d 3b 0a 20 20  CellPerPage];.  
279b0 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
279c0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 61  ){.    /* The ta
279d0 62 6c 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c  ble is completel
279e0 79 20 65 6d 70 74 79 20 2a 2f 0a 20 20 20 20 54  y empty */.    T
279f0 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
27a00 65 6d 70 74 79 20 74 61 62 6c 65 20 25 64 5c 6e  empty table %d\n
27a10 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29  ", pPage->pgno))
27a20 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
27a30 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
27a40 69 73 20 65 6d 70 74 79 20 62 75 74 20 68 61 73  is empty but has
27a50 20 6f 6e 65 20 63 68 69 6c 64 2e 20 20 54 72 61   one child.  Tra
27a60 6e 73 66 65 72 20 74 68 65 0a 20 20 20 20 2a 2a  nsfer the.    **
27a70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
27a80 6d 20 74 68 61 74 20 6f 6e 65 20 63 68 69 6c 64  m that one child
27a90 20 69 6e 74 6f 20 74 68 65 20 72 6f 6f 74 20 70   into the root p
27aa0 61 67 65 20 69 66 20 69 74 20 0a 20 20 20 20 2a  age if it .    *
27ab0 2a 20 77 69 6c 6c 20 66 69 74 2e 20 20 54 68 69  * will fit.  Thi
27ac0 73 20 72 65 64 75 63 65 73 20 74 68 65 20 64 65  s reduces the de
27ad0 70 74 68 20 6f 66 20 74 68 65 20 74 72 65 65 20  pth of the tree 
27ae0 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20  by one..    **. 
27af0 20 20 20 2a 2a 20 49 66 20 74 68 65 20 72 6f 6f     ** If the roo
27b00 74 20 70 61 67 65 20 69 73 20 70 61 67 65 20 31  t page is page 1
27b10 2c 20 69 74 20 68 61 73 20 6c 65 73 73 20 73 70  , it has less sp
27b20 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 74 68  ace available th
27b30 61 6e 0a 20 20 20 20 2a 2a 20 69 74 73 20 63 68  an.    ** its ch
27b40 69 6c 64 20 28 64 75 65 20 74 6f 20 74 68 65 20  ild (due to the 
27b50 31 30 30 20 62 79 74 65 20 68 65 61 64 65 72 20  100 byte header 
27b60 74 68 61 74 20 6f 63 63 75 72 73 20 61 74 20 74  that occurs at t
27b70 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20  he beginning.   
27b80 20 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62   ** of the datab
27b90 61 73 65 20 66 6c 65 29 2c 20 73 6f 20 69 74 20  ase fle), so it 
27ba0 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61 62 6c  might not be abl
27bb0 65 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6f 66  e to hold all of
27bc0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 69 6e 66   the .    ** inf
27bd0 6f 72 6d 61 74 69 6f 6e 20 63 75 72 72 65 6e 74  ormation current
27be0 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ly contained in 
27bf0 74 68 65 20 63 68 69 6c 64 2e 20 20 49 66 20 74  the child.  If t
27c00 68 69 73 20 69 73 20 74 68 65 20 0a 20 20 20 20  his is the .    
27c10 2a 2a 20 63 61 73 65 2c 20 74 68 65 6e 20 64 6f  ** case, then do
27c20 20 6e 6f 74 20 64 6f 20 74 68 65 20 74 72 61 6e   not do the tran
27c30 73 66 65 72 2e 20 20 4c 65 61 76 65 20 70 61 67  sfer.  Leave pag
27c40 65 20 31 20 65 6d 70 74 79 20 65 78 63 65 70 74  e 1 empty except
27c50 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  .    ** for the 
27c60 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 20 74 6f  right-pointer to
27c70 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 2e   the child page.
27c80 20 20 54 68 65 20 63 68 69 6c 64 20 70 61 67 65    The child page
27c90 20 62 65 63 6f 6d 65 73 0a 20 20 20 20 2a 2a 20   becomes.    ** 
27ca0 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  the virtual root
27cb0 20 6f 66 20 74 68 65 20 74 72 65 65 2e 0a 20 20   of the tree..  
27cc0 20 20 2a 2f 0a 20 20 20 20 70 67 6e 6f 43 68 69    */.    pgnoChi
27cd0 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ld = get4byte(&p
27ce0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
27cf0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
27d00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67  ;.    assert( pg
27d10 6e 6f 43 68 69 6c 64 3e 30 20 29 3b 0a 20 20 20  noChild>0 );.   
27d20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 43 68 69   assert( pgnoChi
27d30 6c 64 3c 3d 73 71 6c 69 74 65 33 70 61 67 65 72  ld<=sqlite3pager
27d40 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  _pagecount(pPage
27d50 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29  ->pBt->pPager) )
27d60 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 50 61  ;.    rc = getPa
27d70 67 65 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70  ge(pPage->pBt, p
27d80 67 6e 6f 43 68 69 6c 64 2c 20 26 70 43 68 69 6c  gnoChild, &pChil
27d90 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  d);.    if( rc )
27da0 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f   goto end_shallo
27db0 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20 69  w_balance;.    i
27dc0 66 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  f( pPage->pgno==
27dd0 31 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  1 ){.      rc = 
27de0 69 6e 69 74 50 61 67 65 28 70 43 68 69 6c 64 2c  initPage(pChild,
27df0 20 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69   pPage);.      i
27e00 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64  f( rc ) goto end
27e10 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65  _shallow_balance
27e20 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
27e30 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  pChild->nOverflo
27e40 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  w==0 );.      if
27e50 28 20 70 43 68 69 6c 64 2d 3e 6e 46 72 65 65 3e  ( pChild->nFree>
27e60 3d 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20  =100 ){.        
27e70 2f 2a 20 54 68 65 20 63 68 69 6c 64 20 69 6e 66  /* The child inf
27e80 6f 72 6d 61 74 69 6f 6e 20 77 69 6c 6c 20 66 69  ormation will fi
27e90 74 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 70 61  t on the root pa
27ea0 67 65 2c 20 73 6f 20 64 6f 20 74 68 65 0a 20 20  ge, so do the.  
27eb0 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 2a 2f        ** copy */
27ec0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
27ed0 20 20 20 20 20 20 20 20 7a 65 72 6f 50 61 67 65          zeroPage
27ee0 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e  (pPage, pChild->
27ef0 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20  aData[0]);.     
27f00 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43     for(i=0; i<pC
27f10 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  hild->nCell; i++
27f20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 43  ){.          apC
27f30 65 6c 6c 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c  ell[i] = findCel
27f40 6c 28 70 43 68 69 6c 64 2c 69 29 3b 0a 20 20 20  l(pChild,i);.   
27f50 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 69 5d         szCell[i]
27f60 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
27f70 43 68 69 6c 64 2c 20 61 70 43 65 6c 6c 5b 69 5d  Child, apCell[i]
27f80 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
27f90 20 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67       assemblePag
27fa0 65 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d  e(pPage, pChild-
27fb0 3e 6e 43 65 6c 6c 2c 20 61 70 43 65 6c 6c 2c 20  >nCell, apCell, 
27fc0 73 7a 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20  szCell);.       
27fd0 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 72 69 67   /* Copy the rig
27fe0 68 74 2d 70 6f 69 6e 74 65 72 20 6f 66 20 74 68  ht-pointer of th
27ff0 65 20 63 68 69 6c 64 20 74 6f 20 74 68 65 20 70  e child to the p
28000 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20  arent. */.      
28010 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
28020 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
28030 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 0a 20  hdrOffset+8], . 
28040 20 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62             get4b
28050 79 74 65 28 26 70 43 68 69 6c 64 2d 3e 61 44 61  yte(&pChild->aDa
28060 74 61 5b 70 43 68 69 6c 64 2d 3e 68 64 72 4f 66  ta[pChild->hdrOf
28070 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20  fset+8]));.     
28080 20 20 20 66 72 65 65 50 61 67 65 28 70 43 68 69     freePage(pChi
28090 6c 64 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41  ld);.        TRA
280a0 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 68  CE(("BALANCE: ch
280b0 69 6c 64 20 25 64 20 74 72 61 6e 73 66 65 72 20  ild %d transfer 
280c0 74 6f 20 70 61 67 65 20 31 5c 6e 22 2c 20 70 43  to page 1\n", pC
280d0 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  hild->pgno));.  
280e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
280f0 20 20 20 2f 2a 20 54 68 65 20 63 68 69 6c 64 20     /* The child 
28100 68 61 73 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61  has more informa
28110 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 66  tion that will f
28120 69 74 20 6f 6e 20 74 68 65 20 72 6f 6f 74 2e 0a  it on the root..
28130 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 74          ** The t
28140 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 62  ree is already b
28150 61 6c 61 6e 63 65 64 2e 20 20 44 6f 20 6e 6f 74  alanced.  Do not
28160 68 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 20  hing. */.       
28170 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
28180 3a 20 63 68 69 6c 64 20 25 64 20 77 69 6c 6c 20  : child %d will 
28190 6e 6f 74 20 66 69 74 20 6f 6e 20 70 61 67 65 20  not fit on page 
281a0 31 5c 6e 22 2c 20 70 43 68 69 6c 64 2d 3e 70 67  1\n", pChild->pg
281b0 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  no));.      }.  
281c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d    }else{.      m
281d0 65 6d 63 70 79 28 70 50 61 67 65 2d 3e 61 44 61  emcpy(pPage->aDa
281e0 74 61 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74  ta, pChild->aDat
281f0 61 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  a, pPage->pBt->u
28200 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20  sableSize);.    
28210 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
28220 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
28230 2d 3e 70 50 61 72 65 6e 74 20 3d 20 30 3b 0a 20  ->pParent = 0;. 
28240 20 20 20 20 20 72 63 20 3d 20 69 6e 69 74 50 61       rc = initPa
28250 67 65 28 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  ge(pPage, 0);.  
28260 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
28270 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
28280 20 20 20 66 72 65 65 50 61 67 65 28 70 43 68 69     freePage(pChi
28290 6c 64 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45  ld);.      TRACE
282a0 28 28 22 42 41 4c 41 4e 43 45 3a 20 74 72 61 6e  (("BALANCE: tran
282b0 73 66 65 72 20 63 68 69 6c 64 20 25 64 20 69 6e  sfer child %d in
282c0 74 6f 20 72 6f 6f 74 20 25 64 5c 6e 22 2c 0a 20  to root %d\n",. 
282d0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 68               pCh
282e0 69 6c 64 2d 3e 70 67 6e 6f 2c 20 70 50 61 67 65  ild->pgno, pPage
282f0 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a  ->pgno));.    }.
28300 20 20 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e      rc = reparen
28310 74 43 68 69 6c 64 50 61 67 65 73 28 70 50 61 67  tChildPages(pPag
28320 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
28330 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
28340 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53  ==0 );.#ifndef S
28350 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
28360 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
28370 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
28380 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
28390 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
283a0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  Page->nCell; i++
283b0 29 7b 20 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ){ .        rc =
283c0 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70   ptrmapPutOvfl(p
283d0 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20  Page, i);.      
283e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
283f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
28400 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f   goto end_shallo
28410 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20 20  w_balance;.     
28420 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
28430 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66   }.#endif.    if
28440 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
28450 29 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c  ) goto end_shall
28460 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20  ow_balance;.    
28470 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 68 69  releasePage(pChi
28480 6c 64 29 3b 0a 20 20 7d 0a 65 6e 64 5f 73 68 61  ld);.  }.end_sha
28490 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3a 0a 20 20  llow_balance:.  
284a0 73 71 6c 69 74 65 46 72 65 65 28 61 70 43 65 6c  sqliteFree(apCel
284b0 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  l);.  return rc;
284c0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72  .}.../*.** The r
284d0 6f 6f 74 20 70 61 67 65 20 69 73 20 6f 76 65 72  oot page is over
284e0 66 75 6c 6c 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  full.**.** When 
284f0 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20 43 72  this happens, Cr
28500 65 61 74 65 20 61 20 6e 65 77 20 63 68 69 6c 64  eate a new child
28510 20 70 61 67 65 20 61 6e 64 20 63 6f 70 79 20 74   page and copy t
28520 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  he.** contents o
28530 66 20 74 68 65 20 72 6f 6f 74 20 69 6e 74 6f 20  f the root into 
28540 74 68 65 20 63 68 69 6c 64 2e 20 20 54 68 65 6e  the child.  Then
28550 20 6d 61 6b 65 20 74 68 65 20 72 6f 6f 74 0a 2a   make the root.*
28560 2a 20 70 61 67 65 20 61 6e 20 65 6d 70 74 79 20  * page an empty 
28570 70 61 67 65 20 77 69 74 68 20 72 69 67 68 74 43  page with rightC
28580 68 69 6c 64 20 70 6f 69 6e 74 69 6e 67 20 74 6f  hild pointing to
28590 20 74 68 65 20 6e 65 77 0a 2a 2a 20 63 68 69 6c   the new.** chil
285a0 64 2e 20 20 20 46 69 6e 61 6c 6c 79 2c 20 63 61  d.   Finally, ca
285b0 6c 6c 20 62 61 6c 61 6e 63 65 5f 69 6e 74 65 72  ll balance_inter
285c0 6e 61 6c 28 29 20 6f 6e 20 74 68 65 20 6e 65 77  nal() on the new
285d0 20 63 68 69 6c 64 0a 2a 2a 20 74 6f 20 63 61 75   child.** to cau
285e0 73 65 20 69 74 20 74 6f 20 73 70 6c 69 74 2e 0a  se it to split..
285f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
28600 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 4d 65 6d  lance_deeper(Mem
28610 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
28620 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
28630 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61      /* Return va
28640 6c 75 65 20 66 72 6f 6d 20 73 75 62 70 72 6f 63  lue from subproc
28650 65 64 75 72 65 73 20 2a 2f 0a 20 20 4d 65 6d 50  edures */.  MemP
28660 61 67 65 20 2a 70 43 68 69 6c 64 3b 20 20 20 20  age *pChild;    
28670 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20  /* Pointer to a 
28680 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a  new child page *
28690 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69  /.  Pgno pgnoChi
286a0 6c 64 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20  ld;     /* Page 
286b0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
286c0 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a  w child page */.
286d0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
286e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
286f0 42 54 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75  BTree */.  int u
28700 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f  sableSize;     /
28710 2a 20 54 6f 74 61 6c 20 75 73 61 62 6c 65 20 73  * Total usable s
28720 69 7a 65 20 6f 66 20 61 20 70 61 67 65 20 2a 2f  ize of a page */
28730 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20  .  u8 *data;    
28740 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e         /* Conten
28750 74 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  t of the parent 
28760 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 63 64  page */.  u8 *cd
28770 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ata;          /*
28780 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   Content of the 
28790 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20  child page */.  
287a0 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20  int hdr;        
287b0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
287c0 20 70 61 67 65 20 68 65 61 64 65 72 20 69 6e 20   page header in 
287d0 70 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  parent */.  int 
287e0 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  brk;            
287f0 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 6f 6e  /* Offset to con
28800 74 65 6e 74 20 6f 66 20 66 69 72 73 74 20 63 65  tent of first ce
28810 6c 6c 20 69 6e 20 70 61 72 65 6e 74 20 2a 2f 0a  ll in parent */.
28820 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
28830 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20 29 3b 0a  ->pParent==0 );.
28840 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
28850 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 3b 0a  >nOverflow>0 );.
28860 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
28870 42 74 3b 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63  Bt;.  rc = alloc
28880 61 74 65 50 61 67 65 28 70 42 74 2c 20 26 70 43  atePage(pBt, &pC
28890 68 69 6c 64 2c 20 26 70 67 6e 6f 43 68 69 6c 64  hild, &pgnoChild
288a0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 30  , pPage->pgno, 0
288b0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
288c0 74 75 72 6e 20 72 63 3b 0a 20 20 61 73 73 65 72  turn rc;.  asser
288d0 74 28 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  t( sqlite3pager_
288e0 69 73 77 72 69 74 65 61 62 6c 65 28 70 43 68 69  iswriteable(pChi
288f0 6c 64 2d 3e 61 44 61 74 61 29 20 29 3b 0a 20 20  ld->aData) );.  
28900 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
28910 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
28920 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
28930 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  ata;.  hdr = pPa
28940 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
28950 20 62 72 6b 20 3d 20 67 65 74 32 62 79 74 65 28   brk = get2byte(
28960 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
28970 20 63 64 61 74 61 20 3d 20 70 43 68 69 6c 64 2d   cdata = pChild-
28980 3e 61 44 61 74 61 3b 0a 20 20 6d 65 6d 63 70 79  >aData;.  memcpy
28990 28 63 64 61 74 61 2c 20 26 64 61 74 61 5b 68 64  (cdata, &data[hd
289a0 72 5d 2c 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  r], pPage->cellO
289b0 66 66 73 65 74 2b 32 2a 70 50 61 67 65 2d 3e 6e  ffset+2*pPage->n
289c0 43 65 6c 6c 2d 68 64 72 29 3b 0a 20 20 6d 65 6d  Cell-hdr);.  mem
289d0 63 70 79 28 26 63 64 61 74 61 5b 62 72 6b 5d 2c  cpy(&cdata[brk],
289e0 20 26 64 61 74 61 5b 62 72 6b 5d 2c 20 75 73 61   &data[brk], usa
289f0 62 6c 65 53 69 7a 65 2d 62 72 6b 29 3b 0a 20 20  bleSize-brk);.  
28a00 61 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e  assert( pChild->
28a10 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a 20 20 72  isInit==0 );.  r
28a20 63 20 3d 20 69 6e 69 74 50 61 67 65 28 70 43 68  c = initPage(pCh
28a30 69 6c 64 2c 20 70 50 61 67 65 29 3b 0a 20 20 69  ild, pPage);.  i
28a40 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c  f( rc ) goto bal
28a50 61 6e 63 65 64 65 65 70 65 72 5f 6f 75 74 3b 0a  ancedeeper_out;.
28a60 20 20 6d 65 6d 63 70 79 28 70 43 68 69 6c 64 2d    memcpy(pChild-
28a70 3e 61 4f 76 66 6c 2c 20 70 50 61 67 65 2d 3e 61  >aOvfl, pPage->a
28a80 4f 76 66 6c 2c 20 70 50 61 67 65 2d 3e 6e 4f 76  Ovfl, pPage->nOv
28a90 65 72 66 6c 6f 77 2a 73 69 7a 65 6f 66 28 70 50  erflow*sizeof(pP
28aa0 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 3b  age->aOvfl[0]));
28ab0 0a 20 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72  .  pChild->nOver
28ac0 66 6c 6f 77 20 3d 20 70 50 61 67 65 2d 3e 6e 4f  flow = pPage->nO
28ad0 76 65 72 66 6c 6f 77 3b 0a 20 20 69 66 28 20 70  verflow;.  if( p
28ae0 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77  Child->nOverflow
28af0 20 29 7b 0a 20 20 20 20 70 43 68 69 6c 64 2d 3e   ){.    pChild->
28b00 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  nFree = 0;.  }. 
28b10 20 61 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d   assert( pChild-
28b20 3e 6e 43 65 6c 6c 3d 3d 70 50 61 67 65 2d 3e 6e  >nCell==pPage->n
28b30 43 65 6c 6c 20 29 3b 0a 20 20 7a 65 72 6f 50 61  Cell );.  zeroPa
28b40 67 65 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64  ge(pPage, pChild
28b50 2d 3e 61 44 61 74 61 5b 30 5d 20 26 20 7e 50 54  ->aData[0] & ~PT
28b60 46 5f 4c 45 41 46 29 3b 0a 20 20 70 75 74 34 62  F_LEAF);.  put4b
28b70 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
28b80 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
28b90 65 74 2b 38 5d 2c 20 70 67 6e 6f 43 68 69 6c 64  et+8], pgnoChild
28ba0 29 3b 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c  );.  TRACE(("BAL
28bb0 41 4e 43 45 3a 20 63 6f 70 79 20 72 6f 6f 74 20  ANCE: copy root 
28bc0 25 64 20 69 6e 74 6f 20 25 64 5c 6e 22 2c 20 70  %d into %d\n", p
28bd0 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 43 68 69  Page->pgno, pChi
28be0 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 23 69 66 6e  ld->pgno));.#ifn
28bf0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
28c00 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28  AUTOVACUUM.  if(
28c10 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
28c20 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
28c30 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
28c40 74 28 70 42 74 2c 20 70 43 68 69 6c 64 2d 3e 70  t(pBt, pChild->p
28c50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
28c60 45 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  E, pPage->pgno);
28c70 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
28c80 74 6f 20 62 61 6c 61 6e 63 65 64 65 65 70 65 72  to balancedeeper
28c90 5f 6f 75 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d  _out;.    for(i=
28ca0 30 3b 20 69 3c 70 43 68 69 6c 64 2d 3e 6e 43 65  0; i<pChild->nCe
28cb0 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
28cc0 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76  rc = ptrmapPutOv
28cd0 66 6c 28 70 43 68 69 6c 64 2c 20 69 29 3b 0a 20  fl(pChild, i);. 
28ce0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
28cf0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
28d00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
28d10 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
28d20 65 6e 64 69 66 0a 20 20 72 63 20 3d 20 62 61 6c  endif.  rc = bal
28d30 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 43 68  ance_nonroot(pCh
28d40 69 6c 64 29 3b 0a 0a 62 61 6c 61 6e 63 65 64 65  ild);..balancede
28d50 65 70 65 72 5f 6f 75 74 3a 0a 20 20 72 65 6c 65  eper_out:.  rele
28d60 61 73 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b  asePage(pChild);
28d70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
28d80 0a 2f 2a 0a 2a 2a 20 44 65 63 69 64 65 20 69 66  ./*.** Decide if
28d90 20 74 68 65 20 70 61 67 65 20 70 50 61 67 65 20   the page pPage 
28da0 6e 65 65 64 73 20 74 6f 20 62 65 20 62 61 6c 61  needs to be bala
28db0 6e 63 65 64 2e 20 20 49 66 20 62 61 6c 61 6e 63  nced.  If balanc
28dc0 69 6e 67 20 69 73 0a 2a 2a 20 72 65 71 75 69 72  ing is.** requir
28dd0 65 64 2c 20 63 61 6c 6c 20 74 68 65 20 61 70 70  ed, call the app
28de0 72 6f 70 72 69 61 74 65 20 62 61 6c 61 6e 63 69  ropriate balanci
28df0 6e 67 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73  ng routine..*/.s
28e00 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
28e10 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
28e20 2c 20 69 6e 74 20 69 6e 73 65 72 74 29 7b 0a 20  , int insert){. 
28e30 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
28e40 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65  _OK;.  if( pPage
28e50 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20 29 7b 0a  ->pParent==0 ){.
28e60 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e      if( pPage->n
28e70 4f 76 65 72 66 6c 6f 77 3e 30 20 29 7b 0a 20 20  Overflow>0 ){.  
28e80 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
28e90 5f 64 65 65 70 65 72 28 70 50 61 67 65 29 3b 0a  _deeper(pPage);.
28ea0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
28eb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
28ec0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Page->nCell==0 )
28ed0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c  {.      rc = bal
28ee0 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 70  ance_shallower(p
28ef0 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Page);.    }.  }
28f00 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 50  else{.    if( pP
28f10 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30  age->nOverflow>0
28f20 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 28 21 69   || .        (!i
28f30 6e 73 65 72 74 20 26 26 20 70 50 61 67 65 2d 3e  nsert && pPage->
28f40 6e 46 72 65 65 3e 70 50 61 67 65 2d 3e 70 42 74  nFree>pPage->pBt
28f50 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33  ->usableSize*2/3
28f60 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
28f70 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
28f80 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
28f90 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
28fa0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
28fb0 74 69 6e 65 20 63 68 65 63 6b 73 20 61 6c 6c 20  tine checks all 
28fc0 63 75 72 73 6f 72 73 20 74 68 61 74 20 70 6f 69  cursors that poi
28fd0 6e 74 20 74 6f 20 74 61 62 6c 65 20 70 67 6e 6f  nt to table pgno
28fe0 52 6f 6f 74 2e 0a 2a 2a 20 49 66 20 61 6e 79 20  Root..** If any 
28ff0 6f 66 20 74 68 6f 73 65 20 63 75 72 73 6f 72 73  of those cursors
29000 20 77 65 72 65 20 6f 70 65 6e 65 64 20 77 69 74   were opened wit
29010 68 20 77 72 46 6c 61 67 3d 3d 30 20 69 6e 20 61  h wrFlag==0 in a
29020 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 64 61   different.** da
29030 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
29040 6e 20 28 61 20 64 61 74 61 62 61 73 65 20 63 6f  n (a database co
29050 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74 20 73 68  nnection that sh
29060 61 72 65 73 20 74 68 65 20 70 61 67 65 72 0a 2a  ares the pager.*
29070 2a 20 63 61 63 68 65 20 77 69 74 68 20 74 68 65  * cache with the
29080 20 63 75 72 72 65 6e 74 20 63 6f 6e 6e 65 63 74   current connect
29090 69 6f 6e 29 20 61 6e 64 20 74 68 61 74 20 6f 74  ion) and that ot
290a0 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  her connection .
290b0 2a 2a 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65  ** is not in the
290c0 20 52 65 61 64 55 6e 63 6f 6d 6d 6d 69 74 74 65   ReadUncommmitte
290d0 64 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68  d state, then th
290e0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
290f0 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c 4f  ns .** SQLITE_LO
29100 43 4b 45 44 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61  CKED..**.** In a
29110 64 64 69 74 69 6f 6e 20 74 6f 20 63 68 65 63 6b  ddition to check
29120 69 6e 67 20 66 6f 72 20 72 65 61 64 2d 6c 6f 63  ing for read-loc
29130 6b 73 20 28 77 68 65 72 65 20 61 20 72 65 61 64  ks (where a read
29140 2d 6c 6f 63 6b 20 0a 2a 2a 20 6d 65 61 6e 73 20  -lock .** means 
29150 61 20 63 75 72 73 6f 72 20 6f 70 65 6e 65 64 20  a cursor opened 
29160 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 29 20  with wrFlag==0) 
29170 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73  this routine als
29180 6f 20 6d 6f 76 65 73 0a 2a 2a 20 61 6c 6c 20 63  o moves.** all c
29190 75 72 73 6f 72 73 20 77 72 69 74 65 20 63 75 72  ursors write cur
291a0 73 6f 72 73 20 73 6f 20 74 68 61 74 20 74 68 65  sors so that the
291b0 79 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 20 74  y are pointing t
291c0 6f 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20  o the .** first 
291d0 43 65 6c 6c 20 6f 6e 20 74 68 65 20 72 6f 6f 74  Cell on the root
291e0 20 70 61 67 65 2e 20 20 54 68 69 73 20 69 73 20   page.  This is 
291f0 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75 73  necessary becaus
29200 65 20 61 6e 20 69 6e 73 65 72 74 20 0a 2a 2a 20  e an insert .** 
29210 6f 72 20 64 65 6c 65 74 65 20 6d 69 67 68 74 20  or delete might 
29220 63 68 61 6e 67 65 20 74 68 65 20 6e 75 6d 62 65  change the numbe
29230 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 61 20  r of cells on a 
29240 70 61 67 65 20 6f 72 20 64 65 6c 65 74 65 0a 2a  page or delete.*
29250 2a 20 61 20 70 61 67 65 20 65 6e 74 69 72 65 6c  * a page entirel
29260 79 20 61 6e 64 20 77 65 20 64 6f 20 6e 6f 74 20  y and we do not 
29270 77 61 6e 74 20 74 6f 20 6c 65 61 76 65 20 61 6e  want to leave an
29280 79 20 63 75 72 73 6f 72 73 20 0a 2a 2a 20 70 6f  y cursors .** po
29290 69 6e 74 69 6e 67 20 74 6f 20 6e 6f 6e 2d 65 78  inting to non-ex
292a0 69 73 74 61 6e 74 20 70 61 67 65 73 20 6f 72 20  istant pages or 
292b0 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  cells..*/.static
292c0 20 69 6e 74 20 63 68 65 63 6b 52 65 61 64 4c 6f   int checkReadLo
292d0 63 6b 73 28 42 74 72 65 65 20 2a 70 42 74 72 65  cks(Btree *pBtre
292e0 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74  e, Pgno pgnoRoot
292f0 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63  , BtCursor *pExc
29300 6c 75 64 65 29 7b 0a 20 20 42 74 43 75 72 73 6f  lude){.  BtCurso
29310 72 20 2a 70 3b 0a 20 20 42 74 53 68 61 72 65 64  r *p;.  BtShared
29320 20 2a 70 42 74 20 3d 20 70 42 74 72 65 65 2d 3e   *pBt = pBtree->
29330 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pBt;.  sqlite3 *
29340 64 62 20 3d 20 70 42 74 72 65 65 2d 3e 70 53 71  db = pBtree->pSq
29350 6c 69 74 65 3b 0a 20 20 66 6f 72 28 70 3d 70 42  lite;.  for(p=pB
29360 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
29370 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
29380 69 66 28 20 70 3d 3d 70 45 78 63 6c 75 64 65 20  if( p==pExclude 
29390 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
293a0 69 66 28 20 70 2d 3e 65 53 74 61 74 65 21 3d 43  if( p->eState!=C
293b0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 20 63 6f  URSOR_VALID ) co
293c0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
293d0 70 2d 3e 70 67 6e 6f 52 6f 6f 74 21 3d 70 67 6e  p->pgnoRoot!=pgn
293e0 6f 52 6f 6f 74 20 29 20 63 6f 6e 74 69 6e 75 65  oRoot ) continue
293f0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 77 72 46  ;.    if( p->wrF
29400 6c 61 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  lag==0 ){.      
29410 73 71 6c 69 74 65 33 20 2a 64 62 4f 74 68 65 72  sqlite3 *dbOther
29420 20 3d 20 70 2d 3e 70 42 74 72 65 65 2d 3e 70 53   = p->pBtree->pS
29430 71 6c 69 74 65 3b 0a 20 20 20 20 20 20 69 66 28  qlite;.      if(
29440 20 64 62 4f 74 68 65 72 3d 3d 30 20 7c 7c 0a 20   dbOther==0 ||. 
29450 20 20 20 20 20 20 20 20 28 64 62 4f 74 68 65 72          (dbOther
29460 21 3d 64 62 20 26 26 20 28 64 62 4f 74 68 65 72  !=db && (dbOther
29470 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
29480 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64  _ReadUncommitted
29490 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  )==0) ){.       
294a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
294b0 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20  OCKED;.      }. 
294c0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
294d0 70 50 61 67 65 2d 3e 70 67 6e 6f 21 3d 70 2d 3e  pPage->pgno!=p->
294e0 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20  pgnoRoot ){.    
294f0 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 29 3b    moveToRoot(p);
29500 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
29510 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
29520 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61  ../*.** Insert a
29530 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f   new record into
29540 20 74 68 65 20 42 54 72 65 65 2e 20 20 54 68 65   the BTree.  The
29550 20 6b 65 79 20 69 73 20 67 69 76 65 6e 20 62 79   key is given by
29560 20 28 70 4b 65 79 2c 6e 4b 65 79 29 0a 2a 2a 20   (pKey,nKey).** 
29570 61 6e 64 20 74 68 65 20 64 61 74 61 20 69 73 20  and the data is 
29580 67 69 76 65 6e 20 62 79 20 28 70 44 61 74 61 2c  given by (pData,
29590 6e 44 61 74 61 29 2e 20 20 54 68 65 20 63 75 72  nData).  The cur
295a0 73 6f 72 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  sor is used only
295b0 20 74 6f 0a 2a 2a 20 64 65 66 69 6e 65 20 77 68   to.** define wh
295c0 61 74 20 74 61 62 6c 65 20 74 68 65 20 72 65 63  at table the rec
295d0 6f 72 64 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  ord should be in
295e0 73 65 72 74 65 64 20 69 6e 74 6f 2e 20 20 54 68  serted into.  Th
295f0 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c  e cursor.** is l
29600 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
29610 61 20 72 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f  a random locatio
29620 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20  n..**.** For an 
29630 49 4e 54 4b 45 59 20 74 61 62 6c 65 2c 20 6f 6e  INTKEY table, on
29640 6c 79 20 74 68 65 20 6e 4b 65 79 20 76 61 6c 75  ly the nKey valu
29650 65 20 6f 66 20 74 68 65 20 6b 65 79 20 69 73 20  e of the key is 
29660 75 73 65 64 2e 20 20 70 4b 65 79 20 69 73 0a 2a  used.  pKey is.*
29670 2a 20 69 67 6e 6f 72 65 64 2e 20 20 46 6f 72 20  * ignored.  For 
29680 61 20 5a 45 52 4f 44 41 54 41 20 74 61 62 6c 65  a ZERODATA table
29690 2c 20 74 68 65 20 70 44 61 74 61 20 61 6e 64 20  , the pData and 
296a0 6e 44 61 74 61 20 61 72 65 20 62 6f 74 68 20 69  nData are both i
296b0 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  gnored..*/.int s
296c0 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72  qlite3BtreeInser
296d0 74 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  t(.  BtCursor *p
296e0 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Cur,            
296f0 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61      /* Insert da
29700 74 61 20 69 6e 74 6f 20 74 68 65 20 74 61 62 6c  ta into the tabl
29710 65 20 6f 66 20 74 68 69 73 20 63 75 72 73 6f 72  e of this cursor
29720 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
29730 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79   *pKey, i64 nKey
29740 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20  ,    /* The key 
29750 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72  of the new recor
29760 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  d */.  const voi
29770 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44  d *pData, int nD
29780 61 74 61 20 20 20 2f 2a 20 54 68 65 20 64 61 74  ata   /* The dat
29790 61 20 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63  a of the new rec
297a0 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ord */.){.  int 
297b0 72 63 3b 0a 20 20 69 6e 74 20 6c 6f 63 3b 0a 20  rc;.  int loc;. 
297c0 20 69 6e 74 20 73 7a 4e 65 77 3b 0a 20 20 4d 65   int szNew;.  Me
297d0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
297e0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
297f0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42  pCur->pBtree->pB
29800 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  t;.  unsigned ch
29810 61 72 20 2a 6f 6c 64 43 65 6c 6c 3b 0a 20 20 75  ar *oldCell;.  u
29820 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6e 65  nsigned char *ne
29830 77 43 65 6c 6c 20 3d 20 30 3b 0a 0a 20 20 69 66  wCell = 0;..  if
29840 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
29850 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 57 52 49 54  tion!=TRANS_WRIT
29860 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73 74  E ){.    /* Must
29870 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63   start a transac
29880 74 69 6f 6e 20 62 65 66 6f 72 65 20 64 6f 69 6e  tion before doin
29890 67 20 61 6e 20 69 6e 73 65 72 74 20 2a 2f 0a 20  g an insert */. 
298a0 20 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 72     return pBt->r
298b0 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45  eadOnly ? SQLITE
298c0 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49  _READONLY : SQLI
298d0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
298e0 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65  assert( !pBt->re
298f0 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 69 66 28 20  adOnly );.  if( 
29900 21 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29 7b  !pCur->wrFlag ){
29910 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
29920 54 45 5f 50 45 52 4d 3b 20 20 20 2f 2a 20 43 75  TE_PERM;   /* Cu
29930 72 73 6f 72 20 6e 6f 74 20 6f 70 65 6e 20 66 6f  rsor not open fo
29940 72 20 77 72 69 74 69 6e 67 20 2a 2f 0a 20 20 7d  r writing */.  }
29950 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65 61 64  .  if( checkRead
29960 4c 6f 63 6b 73 28 70 43 75 72 2d 3e 70 42 74 72  Locks(pCur->pBtr
29970 65 65 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  ee, pCur->pgnoRo
29980 6f 74 2c 20 70 43 75 72 29 20 29 7b 0a 20 20 20  ot, pCur) ){.   
29990 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
299a0 4f 43 4b 45 44 3b 20 2f 2a 20 54 68 65 20 74 61  OCKED; /* The ta
299b0 62 6c 65 20 70 43 75 72 20 70 6f 69 6e 74 73 20  ble pCur points 
299c0 74 6f 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f  to has a read lo
299d0 63 6b 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ck */.  }..  /* 
299e0 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f  Save the positio
299f0 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20  ns of any other 
29a00 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
29a10 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20  this table */.  
29a20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75  restoreOrClearCu
29a30 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
29a40 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 0a 20 20  r, 0);.  if( .  
29a50 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63    SQLITE_OK!=(rc
29a60 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
29a70 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e  s(pBt, pCur->pgn
29a80 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29 20 7c 7c  oRoot, pCur)) ||
29a90 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d  .    SQLITE_OK!=
29aa0 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72  (rc = sqlite3Btr
29ab0 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70  eeMoveto(pCur, p
29ac0 4b 65 79 2c 20 6e 4b 65 79 2c 20 26 6c 6f 63 29  Key, nKey, &loc)
29ad0 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
29ae0 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 50 61  n rc;.  }..  pPa
29af0 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
29b00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
29b10 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 6e 4b 65  e->intKey || nKe
29b20 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  y>=0 );.  assert
29b30 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 7c 7c  ( pPage->leaf ||
29b40 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74   !pPage->leafDat
29b50 61 20 29 3b 0a 20 20 54 52 41 43 45 28 28 22 49  a );.  TRACE(("I
29b60 4e 53 45 52 54 3a 20 74 61 62 6c 65 3d 25 64 20  NSERT: table=%d 
29b70 6e 6b 65 79 3d 25 6c 6c 64 20 6e 64 61 74 61 3d  nkey=%lld ndata=
29b80 25 64 20 70 61 67 65 3d 25 64 20 25 73 5c 6e 22  %d page=%d %s\n"
29b90 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  ,.          pCur
29ba0 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 6e 4b 65 79  ->pgnoRoot, nKey
29bb0 2c 20 6e 44 61 74 61 2c 20 70 50 61 67 65 2d 3e  , nData, pPage->
29bc0 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  pgno,.          
29bd0 6c 6f 63 3d 3d 30 20 3f 20 22 6f 76 65 72 77 72  loc==0 ? "overwr
29be0 69 74 65 22 20 3a 20 22 6e 65 77 20 65 6e 74 72  ite" : "new entr
29bf0 79 22 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  y"));.  assert( 
29c00 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
29c10 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70  .  rc = sqlite3p
29c20 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65  ager_write(pPage
29c30 2d 3e 61 44 61 74 61 29 3b 0a 20 20 69 66 28 20  ->aData);.  if( 
29c40 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
29c50 20 20 6e 65 77 43 65 6c 6c 20 3d 20 73 71 6c 69    newCell = sqli
29c60 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 4d 58 5f  teMallocRaw( MX_
29c70 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29  CELL_SIZE(pBt) )
29c80 3b 0a 20 20 69 66 28 20 6e 65 77 43 65 6c 6c 3d  ;.  if( newCell=
29c90 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
29ca0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d  TE_NOMEM;.  rc =
29cb0 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 67   fillInCell(pPag
29cc0 65 2c 20 6e 65 77 43 65 6c 6c 2c 20 70 4b 65 79  e, newCell, pKey
29cd0 2c 20 6e 4b 65 79 2c 20 70 44 61 74 61 2c 20 6e  , nKey, pData, n
29ce0 44 61 74 61 2c 20 26 73 7a 4e 65 77 29 3b 0a 20  Data, &szNew);. 
29cf0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
29d00 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 61 73 73  nd_insert;.  ass
29d10 65 72 74 28 20 73 7a 4e 65 77 3d 3d 63 65 6c 6c  ert( szNew==cell
29d20 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 6e  SizePtr(pPage, n
29d30 65 77 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73  ewCell) );.  ass
29d40 65 72 74 28 20 73 7a 4e 65 77 3c 3d 4d 58 5f 43  ert( szNew<=MX_C
29d50 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b  ELL_SIZE(pBt) );
29d60 0a 20 20 69 66 28 20 6c 6f 63 3d 3d 30 20 26 26  .  if( loc==0 &&
29d70 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
29d80 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
29d90 20 20 20 69 6e 74 20 73 7a 4f 6c 64 3b 0a 20 20     int szOld;.  
29da0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
29db0 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  idx>=0 && pCur->
29dc0 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx<pPage->nCell
29dd0 20 29 3b 0a 20 20 20 20 6f 6c 64 43 65 6c 6c 20   );.    oldCell 
29de0 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
29df0 2c 20 70 43 75 72 2d 3e 69 64 78 29 3b 0a 20 20  , pCur->idx);.  
29e00 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
29e10 61 66 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  af ){.      memc
29e20 70 79 28 6e 65 77 43 65 6c 6c 2c 20 6f 6c 64 43  py(newCell, oldC
29e30 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 7d 0a 20  ell, 4);.    }. 
29e40 20 20 20 73 7a 4f 6c 64 20 3d 20 63 65 6c 6c 53     szOld = cellS
29e50 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 6f 6c  izePtr(pPage, ol
29e60 64 43 65 6c 6c 29 3b 0a 20 20 20 20 72 63 20 3d  dCell);.    rc =
29e70 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65   clearCell(pPage
29e80 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20  , oldCell);.    
29e90 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
29ea0 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20 64 72  d_insert;.    dr
29eb0 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  opCell(pPage, pC
29ec0 75 72 2d 3e 69 64 78 2c 20 73 7a 4f 6c 64 29 3b  ur->idx, szOld);
29ed0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63  .  }else if( loc
29ee0 3c 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 43 65  <0 && pPage->nCe
29ef0 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65  ll>0 ){.    asse
29f00 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  rt( pPage->leaf 
29f10 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 64 78  );.    pCur->idx
29f20 2b 2b 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e  ++;.    pCur->in
29f30 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
29f40 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
29f50 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  t( pPage->leaf )
29f60 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 69 6e 73  ;.  }.  rc = ins
29f70 65 72 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  ertCell(pPage, p
29f80 43 75 72 2d 3e 69 64 78 2c 20 6e 65 77 43 65 6c  Cur->idx, newCel
29f90 6c 2c 20 73 7a 4e 65 77 2c 20 30 2c 20 30 29 3b  l, szNew, 0, 0);
29fa0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
29fb0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f  E_OK ) goto end_
29fc0 69 6e 73 65 72 74 3b 0a 20 20 72 63 20 3d 20 62  insert;.  rc = b
29fd0 61 6c 61 6e 63 65 28 70 50 61 67 65 2c 20 31 29  alance(pPage, 1)
29fe0 3b 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 42 74  ;.  /* sqlite3Bt
29ff0 72 65 65 50 61 67 65 44 75 6d 70 28 70 43 75 72  reePageDump(pCur
2a000 2d 3e 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e  ->pBt, pCur->pgn
2a010 6f 52 6f 6f 74 2c 20 31 29 3b 20 2a 2f 0a 20 20  oRoot, 1); */.  
2a020 2f 2a 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74  /* fflush(stdout
2a030 29 3b 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  ); */.  if( rc==
2a040 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2a050 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
2a060 29 3b 0a 20 20 7d 0a 65 6e 64 5f 69 6e 73 65 72  );.  }.end_inser
2a070 74 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  t:.  sqliteFree(
2a080 6e 65 77 43 65 6c 6c 29 3b 0a 20 20 72 65 74 75  newCell);.  retu
2a090 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2a0a0 44 65 6c 65 74 65 20 74 68 65 20 65 6e 74 72 79  Delete the entry
2a0b0 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
2a0c0 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e   is pointing to.
2a0d0 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20    The cursor.** 
2a0e0 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
2a0f0 20 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f 63   at a random loc
2a100 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ation..*/.int sq
2a110 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65  lite3BtreeDelete
2a120 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
2a130 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
2a140 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
2a150 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
2a160 72 20 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e 74 20  r *pCell;.  int 
2a170 72 63 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43  rc;.  Pgno pgnoC
2a180 68 69 6c 64 20 3d 20 30 3b 0a 20 20 42 74 53 68  hild = 0;.  BtSh
2a190 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
2a1a0 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a 0a  ->pBtree->pBt;..
2a1b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2a1c0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28  >isInit );.  if(
2a1d0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
2a1e0 69 6f 6e 21 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion!=TRANS_WRITE
2a1f0 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20   ){.    /* Must 
2a200 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74  start a transact
2a210 69 6f 6e 20 62 65 66 6f 72 65 20 64 6f 69 6e 67  ion before doing
2a220 20 61 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 20   a delete */.   
2a230 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 72 65 61   return pBt->rea
2a240 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52  dOnly ? SQLITE_R
2a250 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45  EADONLY : SQLITE
2a260 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 73  _ERROR;.  }.  as
2a270 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64  sert( !pBt->read
2a280 4f 6e 6c 79 20 29 3b 0a 20 20 69 66 28 20 70 43  Only );.  if( pC
2a290 75 72 2d 3e 69 64 78 20 3e 3d 20 70 50 61 67 65  ur->idx >= pPage
2a2a0 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 72  ->nCell ){.    r
2a2b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
2a2c0 4f 52 3b 20 20 2f 2a 20 54 68 65 20 63 75 72 73  OR;  /* The curs
2a2d0 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69  or is not pointi
2a2e0 6e 67 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 2a  ng to anything *
2a2f0 2f 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 43 75  /.  }.  if( !pCu
2a300 72 2d 3e 77 72 46 6c 61 67 20 29 7b 0a 20 20 20  r->wrFlag ){.   
2a310 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
2a320 45 52 4d 3b 20 20 20 2f 2a 20 44 69 64 20 6e 6f  ERM;   /* Did no
2a330 74 20 6f 70 65 6e 20 74 68 69 73 20 63 75 72 73  t open this curs
2a340 6f 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20 2a  or for writing *
2a350 2f 0a 20 20 7d 0a 20 20 69 66 28 20 63 68 65 63  /.  }.  if( chec
2a360 6b 52 65 61 64 4c 6f 63 6b 73 28 70 43 75 72 2d  kReadLocks(pCur-
2a370 3e 70 42 74 72 65 65 2c 20 70 43 75 72 2d 3e 70  >pBtree, pCur->p
2a380 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 20 29  gnoRoot, pCur) )
2a390 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2a3a0 49 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54  ITE_LOCKED; /* T
2a3b0 68 65 20 74 61 62 6c 65 20 70 43 75 72 20 70 6f  he table pCur po
2a3c0 69 6e 74 73 20 74 6f 20 68 61 73 20 61 20 72 65  ints to has a re
2a3d0 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 0a  ad lock */.  }..
2a3e0 20 20 2f 2a 20 52 65 73 74 6f 72 65 20 74 68 65    /* Restore the
2a3f0 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
2a400 70 6f 73 69 74 69 6f 6e 20 28 61 20 6e 6f 2d 6f  position (a no-o
2a410 70 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  p if the cursor 
2a420 69 73 20 6e 6f 74 20 69 6e 20 0a 20 20 2a 2a 20  is not in .  ** 
2a430 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
2a440 45 4b 20 73 74 61 74 65 29 20 61 6e 64 20 73 61  EK state) and sa
2a450 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
2a460 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 63 75   of any other cu
2a470 72 73 6f 72 73 20 0a 20 20 2a 2a 20 6f 70 65 6e  rsors .  ** open
2a480 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62   on the same tab
2a490 6c 65 2e 20 54 68 65 6e 20 63 61 6c 6c 20 73 71  le. Then call sq
2a4a0 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
2a4b0 28 29 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 20  () on the page. 
2a4c0 20 2a 2a 20 74 68 61 74 20 74 68 65 20 65 6e 74   ** that the ent
2a4d0 72 79 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74  ry will be delet
2a4e0 65 64 20 66 72 6f 6d 2e 0a 20 20 2a 2f 0a 20 20  ed from..  */.  
2a4f0 69 66 28 20 0a 20 20 20 20 28 72 63 20 3d 20 72  if( .    (rc = r
2a500 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72  estoreOrClearCur
2a510 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
2a520 2c 20 31 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20  , 1))!=0 ||.    
2a530 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72  (rc = saveAllCur
2a540 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e  sors(pBt, pCur->
2a550 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29  pgnoRoot, pCur))
2a560 21 3d 30 20 7c 7c 0a 20 20 20 20 28 72 63 20 3d  !=0 ||.    (rc =
2a570 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
2a580 69 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  ite(pPage->aData
2a590 29 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72  ))!=0.  ){.    r
2a5a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
2a5b0 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 63   /* Locate the c
2a5c0 65 6c 6c 20 77 69 74 68 69 6e 20 69 74 27 73 20  ell within it's 
2a5d0 70 61 67 65 20 61 6e 64 20 6c 65 61 76 65 20 70  page and leave p
2a5e0 43 65 6c 6c 20 70 6f 69 6e 74 69 6e 67 20 74 6f  Cell pointing to
2a5f0 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 2e 20   the.  ** data. 
2a600 54 68 65 20 63 6c 65 61 72 43 65 6c 6c 28 29 20  The clearCell() 
2a610 63 61 6c 6c 20 66 72 65 65 73 20 61 6e 79 20 6f  call frees any o
2a620 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73  verflow pages as
2a630 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
2a640 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 54 68 65  e.  ** cell. The
2a650 20 63 65 6c 6c 20 69 74 73 65 6c 66 20 69 73 20   cell itself is 
2a660 73 74 69 6c 6c 20 69 6e 74 61 63 74 2e 0a 20 20  still intact..  
2a670 2a 2f 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e  */.  pCell = fin
2a680 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  dCell(pPage, pCu
2a690 72 2d 3e 69 64 78 29 3b 0a 20 20 69 66 28 20 21  r->idx);.  if( !
2a6a0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2a6b0 20 20 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 67     pgnoChild = g
2a6c0 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a  et4byte(pCell);.
2a6d0 20 20 7d 0a 20 20 72 63 20 3d 20 63 6c 65 61 72    }.  rc = clear
2a6e0 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c  Cell(pPage, pCel
2a6f0 6c 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  l);.  if( rc ) r
2a700 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28  eturn rc;..  if(
2a710 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2a720 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54  .    /*.    ** T
2a730 68 65 20 65 6e 74 72 79 20 77 65 20 61 72 65 20  he entry we are 
2a740 61 62 6f 75 74 20 74 6f 20 64 65 6c 65 74 65 20  about to delete 
2a750 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 20 73 6f  is not a leaf so
2a760 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 0a 20 20   if we do not.  
2a770 20 20 2a 2a 20 64 6f 20 73 6f 6d 65 74 68 69 6e    ** do somethin
2a780 67 20 77 65 20 77 69 6c 6c 20 6c 65 61 76 65 20  g we will leave 
2a790 61 20 68 6f 6c 65 20 6f 6e 20 61 6e 20 69 6e 74  a hole on an int
2a7a0 65 72 6e 61 6c 20 70 61 67 65 2e 0a 20 20 20 20  ernal page..    
2a7b0 2a 2a 20 57 65 20 68 61 76 65 20 74 6f 20 66 69  ** We have to fi
2a7c0 6c 6c 20 74 68 65 20 68 6f 6c 65 20 62 79 20 6d  ll the hole by m
2a7d0 6f 76 69 6e 67 20 69 6e 20 61 20 63 65 6c 6c 20  oving in a cell 
2a7e0 66 72 6f 6d 20 61 20 6c 65 61 66 2e 20 20 54 68  from a leaf.  Th
2a7f0 65 0a 20 20 20 20 2a 2a 20 6e 65 78 74 20 43 65  e.    ** next Ce
2a800 6c 6c 20 61 66 74 65 72 20 74 68 65 20 6f 6e 65  ll after the one
2a810 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 69   to be deleted i
2a820 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
2a830 65 78 69 73 74 20 61 6e 64 0a 20 20 20 20 2a 2a  exist and.    **
2a840 20 74 6f 20 62 65 20 61 20 6c 65 61 66 20 73 6f   to be a leaf so
2a850 20 77 65 20 63 61 6e 20 75 73 65 20 69 74 2e 0a   we can use it..
2a860 20 20 20 20 2a 2f 0a 20 20 20 20 42 74 43 75 72      */.    BtCur
2a870 73 6f 72 20 6c 65 61 66 43 75 72 3b 0a 20 20 20  sor leafCur;.   
2a880 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2a890 70 4e 65 78 74 3b 0a 20 20 20 20 69 6e 74 20 73  pNext;.    int s
2a8a0 7a 4e 65 78 74 3b 20 20 2f 2a 20 54 68 65 20 63  zNext;  /* The c
2a8b0 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 20  ompiler warning 
2a8c0 69 73 20 77 72 6f 6e 67 3a 20 73 7a 4e 65 78 74  is wrong: szNext
2a8d0 20 69 73 20 61 6c 77 61 79 73 20 0a 20 20 20 20   is always .    
2a8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
2a8f0 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 65 66 6f  initialized befo
2a900 72 65 20 75 73 65 2e 20 20 41 64 64 69 6e 67 20  re use.  Adding 
2a910 61 6e 20 65 78 74 72 61 20 69 6e 69 74 69 61 6c  an extra initial
2a920 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20 20 20 20  ization.        
2a930 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 73           ** to s
2a940 69 6c 65 6e 63 65 20 74 68 65 20 63 6f 6d 70 69  ilence the compi
2a950 6c 65 72 20 73 6c 6f 77 73 20 64 6f 77 6e 20 74  ler slows down t
2a960 68 65 20 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20  he code. */.    
2a970 69 6e 74 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20  int notUsed;.   
2a980 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2a990 74 65 6d 70 43 65 6c 6c 20 3d 20 30 3b 0a 20 20  tempCell = 0;.  
2a9a0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
2a9b0 2d 3e 6c 65 61 66 44 61 74 61 20 29 3b 0a 20 20  ->leafData );.  
2a9c0 20 20 67 65 74 54 65 6d 70 43 75 72 73 6f 72 28    getTempCursor(
2a9d0 70 43 75 72 2c 20 26 6c 65 61 66 43 75 72 29 3b  pCur, &leafCur);
2a9e0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2a9f0 33 42 74 72 65 65 4e 65 78 74 28 26 6c 65 61 66  3BtreeNext(&leaf
2aa00 43 75 72 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a  Cur, &notUsed);.
2aa10 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2aa20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
2aa30 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc!=SQLITE_NO
2aa40 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 72  MEM ){.        r
2aa50 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
2aa60 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20  PT_BKPT; .      
2aa70 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
2aa80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2aa90 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2aaa0 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 6c  te3pager_write(l
2aab0 65 61 66 43 75 72 2e 70 50 61 67 65 2d 3e 61 44  eafCur.pPage->aD
2aac0 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ata);.    }.    
2aad0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2aae0 4b 20 29 7b 0a 20 20 20 20 20 20 54 52 41 43 45  K ){.      TRACE
2aaf0 28 28 22 44 45 4c 45 54 45 3a 20 74 61 62 6c 65  (("DELETE: table
2ab00 3d 25 64 20 64 65 6c 65 74 65 20 69 6e 74 65 72  =%d delete inter
2ab10 6e 61 6c 20 66 72 6f 6d 20 25 64 20 72 65 70 6c  nal from %d repl
2ab20 61 63 65 20 66 72 6f 6d 20 6c 65 61 66 20 25 64  ace from leaf %d
2ab30 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 70 43  \n",.         pC
2ab40 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50  ur->pgnoRoot, pP
2ab50 61 67 65 2d 3e 70 67 6e 6f 2c 20 6c 65 61 66 43  age->pgno, leafC
2ab60 75 72 2e 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29  ur.pPage->pgno))
2ab70 3b 0a 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c  ;.      dropCell
2ab80 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64  (pPage, pCur->id
2ab90 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  x, cellSizePtr(p
2aba0 50 61 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a 20  Page, pCell));. 
2abb0 20 20 20 20 20 70 4e 65 78 74 20 3d 20 66 69 6e       pNext = fin
2abc0 64 43 65 6c 6c 28 6c 65 61 66 43 75 72 2e 70 50  dCell(leafCur.pP
2abd0 61 67 65 2c 20 6c 65 61 66 43 75 72 2e 69 64 78  age, leafCur.idx
2abe0 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65 78 74 20  );.      szNext 
2abf0 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 6c 65  = cellSizePtr(le
2ac00 61 66 43 75 72 2e 70 50 61 67 65 2c 20 70 4e 65  afCur.pPage, pNe
2ac10 78 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xt);.      asser
2ac20 74 28 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  t( MX_CELL_SIZE(
2ac30 70 42 74 29 3e 3d 73 7a 4e 65 78 74 2b 34 20 29  pBt)>=szNext+4 )
2ac40 3b 0a 20 20 20 20 20 20 74 65 6d 70 43 65 6c 6c  ;.      tempCell
2ac50 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
2ac60 61 77 28 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45  aw( MX_CELL_SIZE
2ac70 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 69  (pBt) );.      i
2ac80 66 28 20 74 65 6d 70 43 65 6c 6c 3d 3d 30 20 29  f( tempCell==0 )
2ac90 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
2aca0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2acb0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
2acc0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2acd0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69   ){.      rc = i
2ace0 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 67 65 2c  nsertCell(pPage,
2acf0 20 70 43 75 72 2d 3e 69 64 78 2c 20 70 4e 65 78   pCur->idx, pNex
2ad00 74 2d 34 2c 20 73 7a 4e 65 78 74 2b 34 2c 20 74  t-4, szNext+4, t
2ad10 65 6d 70 43 65 6c 6c 2c 20 30 29 3b 0a 20 20 20  empCell, 0);.   
2ad20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
2ad30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2ad40 20 20 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f    put4byte(findO
2ad50 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 67  verflowCell(pPag
2ad60 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 2c 20 70  e, pCur->idx), p
2ad70 67 6e 6f 43 68 69 6c 64 29 3b 0a 20 20 20 20 20  gnoChild);.     
2ad80 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 50   rc = balance(pP
2ad90 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  age, 0);.    }. 
2ada0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2adb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 64 72  E_OK ){.      dr
2adc0 6f 70 43 65 6c 6c 28 6c 65 61 66 43 75 72 2e 70  opCell(leafCur.p
2add0 50 61 67 65 2c 20 6c 65 61 66 43 75 72 2e 69 64  Page, leafCur.id
2ade0 78 2c 20 73 7a 4e 65 78 74 29 3b 0a 20 20 20 20  x, szNext);.    
2adf0 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 6c    rc = balance(l
2ae00 65 61 66 43 75 72 2e 70 50 61 67 65 2c 20 30 29  eafCur.pPage, 0)
2ae10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2ae20 74 65 46 72 65 65 28 74 65 6d 70 43 65 6c 6c 29  teFree(tempCell)
2ae30 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 54 65 6d  ;.    releaseTem
2ae40 70 43 75 72 73 6f 72 28 26 6c 65 61 66 43 75 72  pCursor(&leafCur
2ae50 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2ae60 54 52 41 43 45 28 28 22 44 45 4c 45 54 45 3a 20  TRACE(("DELETE: 
2ae70 74 61 62 6c 65 3d 25 64 20 64 65 6c 65 74 65 20  table=%d delete 
2ae80 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e 22 2c  from leaf %d\n",
2ae90 0a 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67  .       pCur->pg
2aea0 6e 6f 52 6f 6f 74 2c 20 70 50 61 67 65 2d 3e 70  noRoot, pPage->p
2aeb0 67 6e 6f 29 29 3b 0a 20 20 20 20 64 72 6f 70 43  gno));.    dropC
2aec0 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
2aed0 3e 69 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74  >idx, cellSizePt
2aee0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 29  r(pPage, pCell))
2aef0 3b 0a 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e  ;.    rc = balan
2af00 63 65 28 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  ce(pPage, 0);.  
2af10 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
2af20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f 76  TE_OK ){.    mov
2af30 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
2af40 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2af50 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
2af60 61 20 6e 65 77 20 42 54 72 65 65 20 74 61 62 6c  a new BTree tabl
2af70 65 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a  e.  Write into *
2af80 70 69 54 61 62 6c 65 20 74 68 65 20 70 61 67 65  piTable the page
2af90 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  .** number for t
2afa0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
2afb0 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a  the new table..*
2afc0 2a 0a 2a 2a 20 54 68 65 20 74 79 70 65 20 6f 66  *.** The type of
2afd0 20 74 79 70 65 20 69 73 20 64 65 74 65 72 6d 69   type is determi
2afe0 6e 65 64 20 62 79 20 74 68 65 20 66 6c 61 67 73  ned by the flags
2aff0 20 70 61 72 61 6d 65 74 65 72 2e 20 20 4f 6e 6c   parameter.  Onl
2b000 79 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  y the.** followi
2b010 6e 67 20 76 61 6c 75 65 73 20 6f 66 20 66 6c 61  ng values of fla
2b020 67 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  gs are currently
2b030 20 69 6e 20 75 73 65 2e 20 20 4f 74 68 65 72 20   in use.  Other 
2b040 76 61 6c 75 65 73 20 66 6f 72 0a 2a 2a 20 66 6c  values for.** fl
2b050 61 67 73 20 6d 69 67 68 74 20 6e 6f 74 20 77 6f  ags might not wo
2b060 72 6b 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 42 54  rk:.**.**     BT
2b070 52 45 45 5f 49 4e 54 4b 45 59 7c 42 54 52 45 45  REE_INTKEY|BTREE
2b080 5f 4c 45 41 46 44 41 54 41 20 20 20 20 20 55 73  _LEAFDATA     Us
2b090 65 64 20 66 6f 72 20 53 51 4c 20 74 61 62 6c 65  ed for SQL table
2b0a0 73 20 77 69 74 68 20 72 6f 77 69 64 20 6b 65 79  s with rowid key
2b0b0 73 0a 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 5a  s.**     BTREE_Z
2b0c0 45 52 4f 44 41 54 41 20 20 20 20 20 20 20 20 20  ERODATA         
2b0d0 20 20 20 20 20 20 20 20 20 55 73 65 64 20 66 6f           Used fo
2b0e0 72 20 53 51 4c 20 69 6e 64 69 63 65 73 0a 2a 2f  r SQL indices.*/
2b0f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2b100 65 43 72 65 61 74 65 54 61 62 6c 65 28 42 74 72  eCreateTable(Btr
2b110 65 65 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61  ee *p, int *piTa
2b120 62 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  ble, int flags){
2b130 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2b140 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d   = p->pBt;.  Mem
2b150 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 50  Page *pRoot;.  P
2b160 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20  gno pgnoRoot;.  
2b170 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 42  int rc;.  if( pB
2b180 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
2b190 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  !=TRANS_WRITE ){
2b1a0 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 73 74 61  .    /* Must sta
2b1b0 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  rt a transaction
2b1c0 20 66 69 72 73 74 20 2a 2f 0a 20 20 20 20 72 65   first */.    re
2b1d0 74 75 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e  turn pBt->readOn
2b1e0 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44  ly ? SQLITE_READ
2b1f0 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52  ONLY : SQLITE_ER
2b200 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ROR;.  }.  asser
2b210 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  t( !pBt->readOnl
2b220 79 20 29 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73  y );..  /* It is
2b230 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63 72 65 61   illegal to crea
2b240 74 65 20 61 20 74 61 62 6c 65 20 69 66 20 61 6e  te a table if an
2b250 79 20 63 75 72 73 6f 72 73 20 61 72 65 20 6f 70  y cursors are op
2b260 65 6e 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64  en on the.  ** d
2b270 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 69 73  atabase. This is
2b280 20 62 65 63 61 75 73 65 20 69 6e 20 61 75 74 6f   because in auto
2b290 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 74 68 65  -vacuum mode the
2b2a0 20 62 61 63 6b 65 6e 64 20 6d 61 79 0a 20 20 2a   backend may.  *
2b2b0 2a 20 6e 65 65 64 20 74 6f 20 6d 6f 76 65 20 61  * need to move a
2b2c0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 74   database page t
2b2d0 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20  o make room for 
2b2e0 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67  the new root-pag
2b2f0 65 2e 0a 20 20 2a 2a 20 49 66 20 61 6e 20 6f 70  e..  ** If an op
2b300 65 6e 20 63 75 72 73 6f 72 20 77 61 73 20 75 73  en cursor was us
2b310 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 20 70  ing the page a p
2b320 72 6f 62 6c 65 6d 20 77 6f 75 6c 64 20 6f 63 63  roblem would occ
2b330 75 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ur..  */.  if( p
2b340 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20  Bt->pCursor ){. 
2b350 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2b360 5f 4c 4f 43 4b 45 44 3b 0a 20 20 7d 0a 0a 23 69  _LOCKED;.  }..#i
2b370 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
2b380 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 63  _AUTOVACUUM.  rc
2b390 20 3d 20 61 6c 6c 6f 63 61 74 65 50 61 67 65 28   = allocatePage(
2b3a0 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67  pBt, &pRoot, &pg
2b3b0 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20  noRoot, 1, 0);. 
2b3c0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2b3d0 20 72 63 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28   rc;.#else.  if(
2b3e0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
2b3f0 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e   ){.    Pgno pgn
2b400 6f 4d 6f 76 65 3b 20 20 20 20 20 20 2f 2a 20 4d  oMove;      /* M
2b410 6f 76 65 20 61 20 70 61 67 65 20 68 65 72 65 20  ove a page here 
2b420 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72  to make room for
2b430 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 2a   the root-page *
2b440 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  /.    MemPage *p
2b450 50 61 67 65 4d 6f 76 65 3b 20 2f 2a 20 54 68 65  PageMove; /* The
2b460 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f   page to move to
2b470 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61  . */..    /* Rea
2b480 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d  d the value of m
2b490 65 74 61 5b 33 5d 20 66 72 6f 6d 20 74 68 65 20  eta[3] from the 
2b4a0 64 61 74 61 62 61 73 65 20 74 6f 20 64 65 74 65  database to dete
2b4b0 72 6d 69 6e 65 20 77 68 65 72 65 20 74 68 65 0a  rmine where the.
2b4c0 20 20 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65      ** root page
2b4d0 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
2b4e0 65 20 73 68 6f 75 6c 64 20 67 6f 2e 20 6d 65 74  e should go. met
2b4f0 61 5b 33 5d 20 69 73 20 74 68 65 20 6c 61 72 67  a[3] is the larg
2b500 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20  est root-page.  
2b510 20 20 2a 2a 20 63 72 65 61 74 65 64 20 73 6f 20    ** created so 
2b520 66 61 72 2c 20 73 6f 20 74 68 65 20 6e 65 77 20  far, so the new 
2b530 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 28 6d 65  root-page is (me
2b540 74 61 5b 33 5d 2b 31 29 2e 0a 20 20 20 20 2a 2f  ta[3]+1)..    */
2b550 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2b560 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 70 2c  3BtreeGetMeta(p,
2b570 20 34 2c 20 26 70 67 6e 6f 52 6f 6f 74 29 3b 0a   4, &pgnoRoot);.
2b580 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2b590 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
2b5a0 63 3b 0a 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b  c;.    pgnoRoot+
2b5b0 2b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e  +;..    /* The n
2b5c0 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 6d 61 79  ew root-page may
2b5d0 20 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74 65   not be allocate
2b5e0 64 20 6f 6e 20 61 20 70 6f 69 6e 74 65 72 2d 6d  d on a pointer-m
2b5f0 61 70 20 70 61 67 65 2c 20 6f 72 20 74 68 65 0a  ap page, or the.
2b600 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42      ** PENDING_B
2b610 59 54 45 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  YTE page..    */
2b620 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 52 6f 6f  .    if( pgnoRoo
2b630 74 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f  t==PTRMAP_PAGENO
2b640 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 29 20  (pBt, pgnoRoot) 
2b650 7c 7c 0a 20 20 20 20 20 20 20 20 70 67 6e 6f 52  ||.        pgnoR
2b660 6f 6f 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  oot==PENDING_BYT
2b670 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
2b680 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b       pgnoRoot++;
2b690 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
2b6a0 74 28 20 70 67 6e 6f 52 6f 6f 74 3e 3d 33 20 29  t( pgnoRoot>=3 )
2b6b0 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61  ;..    /* Alloca
2b6c0 74 65 20 61 20 70 61 67 65 2e 20 54 68 65 20 70  te a page. The p
2b6d0 61 67 65 20 74 68 61 74 20 63 75 72 72 65 6e 74  age that current
2b6e0 6c 79 20 72 65 73 69 64 65 73 20 61 74 20 70 67  ly resides at pg
2b6f0 6e 6f 52 6f 6f 74 20 77 69 6c 6c 0a 20 20 20 20  noRoot will.    
2b700 2a 2a 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 74  ** be moved to t
2b710 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  he allocated pag
2b720 65 20 28 75 6e 6c 65 73 73 20 74 68 65 20 61 6c  e (unless the al
2b730 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68 61 70  located page hap
2b740 70 65 6e 73 0a 20 20 20 20 2a 2a 20 74 6f 20 72  pens.    ** to r
2b750 65 73 69 64 65 20 61 74 20 70 67 6e 6f 52 6f 6f  eside at pgnoRoo
2b760 74 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  t)..    */.    r
2b770 63 20 3d 20 61 6c 6c 6f 63 61 74 65 50 61 67 65  c = allocatePage
2b780 28 70 42 74 2c 20 26 70 50 61 67 65 4d 6f 76 65  (pBt, &pPageMove
2b790 2c 20 26 70 67 6e 6f 4d 6f 76 65 2c 20 70 67 6e  , &pgnoMove, pgn
2b7a0 6f 52 6f 6f 74 2c 20 31 29 3b 0a 20 20 20 20 69  oRoot, 1);.    i
2b7b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2b7c0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2b7d0 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
2b7e0 69 66 28 20 70 67 6e 6f 4d 6f 76 65 21 3d 70 67  if( pgnoMove!=pg
2b7f0 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20  noRoot ){.      
2b800 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20  u8 eType;.      
2b810 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a  Pgno iPtrPage;..
2b820 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2b830 65 28 70 50 61 67 65 4d 6f 76 65 29 3b 0a 20 20  e(pPageMove);.  
2b840 20 20 20 20 72 63 20 3d 20 67 65 74 50 61 67 65      rc = getPage
2b850 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20  (pBt, pgnoRoot, 
2b860 26 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 69  &pRoot);.      i
2b870 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2b880 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
2b890 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
2b8a0 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
2b8b0 47 65 74 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f  Get(pBt, pgnoRoo
2b8c0 74 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74 72  t, &eType, &iPtr
2b8d0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
2b8e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
2b8f0 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
2b900 52 4f 4f 54 50 41 47 45 20 7c 7c 20 65 54 79 70  ROOTPAGE || eTyp
2b910 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e==PTRMAP_FREEPA
2b920 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  GE ){.        re
2b930 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29  leasePage(pRoot)
2b940 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2b950 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
2b960 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65     assert( eType
2b970 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  !=PTRMAP_ROOTPAG
2b980 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  E );.      asser
2b990 74 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50  t( eType!=PTRMAP
2b9a0 5f 46 52 45 45 50 41 47 45 20 29 3b 0a 20 20 20  _FREEPAGE );.   
2b9b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70     rc = sqlite3p
2b9c0 61 67 65 72 5f 77 72 69 74 65 28 70 52 6f 6f 74  ager_write(pRoot
2b9d0 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20  ->aData);.      
2b9e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2b9f0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  K ){.        rel
2ba00 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b  easePage(pRoot);
2ba10 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2ba20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
2ba30 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50    rc = relocateP
2ba40 61 67 65 28 70 42 74 2c 20 70 52 6f 6f 74 2c 20  age(pBt, pRoot, 
2ba50 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c  eType, iPtrPage,
2ba60 20 70 67 6e 6f 4d 6f 76 65 29 3b 0a 20 20 20 20   pgnoMove);.    
2ba70 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52    releasePage(pR
2ba80 6f 6f 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  oot);.      if( 
2ba90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2baa0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2bab0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
2bac0 20 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70    rc = getPage(p
2bad0 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70  Bt, pgnoRoot, &p
2bae0 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 69 66 28  Root);.      if(
2baf0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2bb00 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2bb10 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
2bb20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70     rc = sqlite3p
2bb30 61 67 65 72 5f 77 72 69 74 65 28 70 52 6f 6f 74  ager_write(pRoot
2bb40 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20  ->aData);.      
2bb50 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2bb60 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  K ){.        rel
2bb70 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b  easePage(pRoot);
2bb80 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2bb90 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
2bba0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 52 6f  }else{.      pRo
2bbb0 6f 74 20 3d 20 70 50 61 67 65 4d 6f 76 65 3b 0a  ot = pPageMove;.
2bbc0 20 20 20 20 7d 20 0a 0a 20 20 20 20 2f 2a 20 55      } ..    /* U
2bbd0 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65  pdate the pointe
2bbe0 72 2d 6d 61 70 20 61 6e 64 20 6d 65 74 61 2d 64  r-map and meta-d
2bbf0 61 74 61 20 77 69 74 68 20 74 68 65 20 6e 65 77  ata with the new
2bc00 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
2bc10 72 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70  r. */.    rc = p
2bc20 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67  trmapPut(pBt, pg
2bc30 6e 6f 52 6f 6f 74 2c 20 50 54 52 4d 41 50 5f 52  noRoot, PTRMAP_R
2bc40 4f 4f 54 50 41 47 45 2c 20 30 29 3b 0a 20 20 20  OOTPAGE, 0);.   
2bc50 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2bc60 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f   releasePage(pRo
2bc70 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ot);.      retur
2bc80 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
2bc90 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2bca0 65 55 70 64 61 74 65 4d 65 74 61 28 70 2c 20 34  eUpdateMeta(p, 4
2bcb0 2c 20 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20  , pgnoRoot);.   
2bcc0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2bcd0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f   releasePage(pRo
2bce0 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ot);.      retur
2bcf0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d  n rc;.    }..  }
2bd00 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 61  else{.    rc = a
2bd10 6c 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c  llocatePage(pBt,
2bd20 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f   &pRoot, &pgnoRo
2bd30 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69  ot, 1, 0);.    i
2bd40 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2bd50 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  c;.  }.#endif.  
2bd60 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 70  assert( sqlite3p
2bd70 61 67 65 72 5f 69 73 77 72 69 74 65 61 62 6c 65  ager_iswriteable
2bd80 28 70 52 6f 6f 74 2d 3e 61 44 61 74 61 29 20 29  (pRoot->aData) )
2bd90 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 52 6f  ;.  zeroPage(pRo
2bda0 6f 74 2c 20 66 6c 61 67 73 20 7c 20 50 54 46 5f  ot, flags | PTF_
2bdb0 4c 45 41 46 29 3b 0a 20 20 73 71 6c 69 74 65 33  LEAF);.  sqlite3
2bdc0 70 61 67 65 72 5f 75 6e 72 65 66 28 70 52 6f 6f  pager_unref(pRoo
2bdd0 74 2d 3e 61 44 61 74 61 29 3b 0a 20 20 2a 70 69  t->aData);.  *pi
2bde0 54 61 62 6c 65 20 3d 20 28 69 6e 74 29 70 67 6e  Table = (int)pgn
2bdf0 6f 52 6f 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20  oRoot;.  return 
2be00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2be10 0a 2a 2a 20 45 72 61 73 65 20 74 68 65 20 67 69  .** Erase the gi
2be20 76 65 6e 20 64 61 74 61 62 61 73 65 20 70 61 67  ven database pag
2be30 65 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 63 68  e and all its ch
2be40 69 6c 64 72 65 6e 2e 20 20 52 65 74 75 72 6e 0a  ildren.  Return.
2be50 2a 2a 20 74 68 65 20 70 61 67 65 20 74 6f 20 74  ** the page to t
2be60 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2f 0a  he freelist..*/.
2be70 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72  static int clear
2be80 44 61 74 61 62 61 73 65 50 61 67 65 28 0a 20 20  DatabasePage(.  
2be90 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
2bea0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2beb0 42 54 72 65 65 20 74 68 61 74 20 63 6f 6e 74 61  BTree that conta
2bec0 69 6e 73 20 74 68 65 20 74 61 62 6c 65 20 2a 2f  ins the table */
2bed0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
2bee0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
2bef0 20 6e 75 6d 62 65 72 20 74 6f 20 63 6c 65 61 72   number to clear
2bf00 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
2bf10 50 61 72 65 6e 74 2c 20 20 20 20 20 2f 2a 20 50  Parent,     /* P
2bf20 61 72 65 6e 74 20 70 61 67 65 2e 20 20 4e 55 4c  arent page.  NUL
2bf30 4c 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 2a  L for the root *
2bf40 2f 0a 20 20 69 6e 74 20 66 72 65 65 50 61 67 65  /.  int freePage
2bf50 46 6c 61 67 20 20 20 20 20 20 2f 2a 20 44 65 61  Flag      /* Dea
2bf60 6c 6c 6f 63 61 74 65 20 70 61 67 65 20 69 66 20  llocate page if 
2bf70 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d  true */.){.  Mem
2bf80 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
2bf90 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73  .  int rc;.  uns
2bfa0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
2bfb0 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69  l;.  int i;..  i
2bfc0 66 28 20 70 67 6e 6f 3e 73 71 6c 69 74 65 33 70  f( pgno>sqlite3p
2bfd0 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70  ager_pagecount(p
2bfe0 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20  Bt->pPager) ){. 
2bff0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2c000 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2c010 20 7d 0a 0a 20 20 72 63 20 3d 20 67 65 74 41 6e   }..  rc = getAn
2c020 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70  dInitPage(pBt, p
2c030 67 6e 6f 2c 20 26 70 50 61 67 65 2c 20 70 50 61  gno, &pPage, pPa
2c040 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 20  rent);.  if( rc 
2c050 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61  ) goto cleardata
2c060 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  basepage_out;.  
2c070 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
2c080 72 5f 77 72 69 74 65 28 70 50 61 67 65 2d 3e 61  r_write(pPage->a
2c090 44 61 74 61 29 3b 0a 20 20 69 66 28 20 72 63 20  Data);.  if( rc 
2c0a0 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61  ) goto cleardata
2c0b0 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  basepage_out;.  
2c0c0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
2c0d0 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  ->nCell; i++){. 
2c0e0 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43     pCell = findC
2c0f0 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20  ell(pPage, i);. 
2c100 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
2c110 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  eaf ){.      rc 
2c120 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50  = clearDatabaseP
2c130 61 67 65 28 70 42 74 2c 20 67 65 74 34 62 79 74  age(pBt, get4byt
2c140 65 28 70 43 65 6c 6c 29 2c 20 70 50 61 67 65 2d  e(pCell), pPage-
2c150 3e 70 50 61 72 65 6e 74 2c 20 31 29 3b 0a 20 20  >pParent, 1);.  
2c160 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
2c170 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65 70  o cleardatabasep
2c180 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
2c190 20 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c     rc = clearCel
2c1a0 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b  l(pPage, pCell);
2c1b0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
2c1c0 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65  to cleardatabase
2c1d0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  page_out;.  }.  
2c1e0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
2c1f0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 6c 65   ){.    rc = cle
2c200 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28 70  arDatabasePage(p
2c210 42 74 2c 20 67 65 74 34 62 79 74 65 28 26 70 50  Bt, get4byte(&pP
2c220 61 67 65 2d 3e 61 44 61 74 61 5b 38 5d 29 2c 20  age->aData[8]), 
2c230 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 2c 20  pPage->pParent, 
2c240 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  1);.    if( rc )
2c250 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62   goto cleardatab
2c260 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d  asepage_out;.  }
2c270 0a 20 20 69 66 28 20 66 72 65 65 50 61 67 65 46  .  if( freePageF
2c280 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  lag ){.    rc = 
2c290 66 72 65 65 50 61 67 65 28 70 50 61 67 65 29 3b  freePage(pPage);
2c2a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 65  .  }else{.    ze
2c2b0 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70 50  roPage(pPage, pP
2c2c0 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 7c 20  age->aData[0] | 
2c2d0 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 7d 0a 0a  PTF_LEAF);.  }..
2c2e0 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67  cleardatabasepag
2c2f0 65 5f 6f 75 74 3a 0a 20 20 72 65 6c 65 61 73 65  e_out:.  release
2c300 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72  Page(pPage);.  r
2c310 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2c320 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e  ** Delete all in
2c330 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61  formation from a
2c340 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e   single table in
2c350 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
2c360 69 54 61 62 6c 65 20 69 73 0a 2a 2a 20 74 68 65  iTable is.** the
2c370 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
2c380 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  the root of the 
2c390 74 61 62 6c 65 2e 20 20 41 66 74 65 72 20 74 68  table.  After th
2c3a0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
2c3b0 6e 73 2c 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20  ns,.** the root 
2c3c0 70 61 67 65 20 69 73 20 65 6d 70 74 79 2c 20 62  page is empty, b
2c3d0 75 74 20 73 74 69 6c 6c 20 65 78 69 73 74 73 2e  ut still exists.
2c3e0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2c3f0 69 6e 65 20 77 69 6c 6c 20 66 61 69 6c 20 77 69  ine will fail wi
2c400 74 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  th SQLITE_LOCKED
2c410 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
2c420 79 20 6f 70 65 6e 0a 2a 2a 20 72 65 61 64 20 63  y open.** read c
2c430 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 74 61  ursors on the ta
2c440 62 6c 65 2e 20 20 4f 70 65 6e 20 77 72 69 74 65  ble.  Open write
2c450 20 63 75 72 73 6f 72 73 20 61 72 65 20 6d 6f 76   cursors are mov
2c460 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 72 6f 6f  ed to the.** roo
2c470 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a  t of the table..
2c480 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
2c490 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 42 74  reeClearTable(Bt
2c4a0 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62  ree *p, int iTab
2c4b0 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  le){.  int rc;. 
2c4c0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
2c4d0 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 70   p->pBt;.  if( p
2c4e0 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
2c4f0 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72 65  _WRITE ){.    re
2c500 74 75 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e  turn pBt->readOn
2c510 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44  ly ? SQLITE_READ
2c520 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52  ONLY : SQLITE_ER
2c530 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ROR;.  }.  rc = 
2c540 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70  checkReadLocks(p
2c550 2c 20 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20  , iTable, 0);.  
2c560 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
2c570 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
2c580 2f 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69  /* Save the posi
2c590 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 63 75 72 73  tion of all curs
2c5a0 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73  ors open on this
2c5b0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20   table */.  if( 
2c5c0 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
2c5d0 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
2c5e0 70 42 74 2c 20 69 54 61 62 6c 65 2c 20 30 29 29  pBt, iTable, 0))
2c5f0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
2c600 63 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  c;.  }..  return
2c610 20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61   clearDatabasePa
2c620 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 54  ge(pBt, (Pgno)iT
2c630 61 62 6c 65 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a  able, 0, 0);.}..
2c640 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20  /*.** Erase all 
2c650 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 61  information in a
2c660 20 74 61 62 6c 65 20 61 6e 64 20 61 64 64 20 74   table and add t
2c670 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74  he root of the t
2c680 61 62 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 66  able to.** the f
2c690 72 65 65 6c 69 73 74 2e 20 20 45 78 63 65 70 74  reelist.  Except
2c6a0 2c 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68  , the root of th
2c6b0 65 20 70 72 69 6e 63 69 70 6c 65 20 74 61 62 6c  e principle tabl
2c6c0 65 20 28 74 68 65 20 6f 6e 65 20 6f 6e 0a 2a 2a  e (the one on.**
2c6d0 20 70 61 67 65 20 31 29 20 69 73 20 6e 65 76 65   page 1) is neve
2c6e0 72 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  r added to the f
2c6f0 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  reelist..**.** T
2c700 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
2c710 20 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54   fail with SQLIT
2c720 45 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68 65 72  E_LOCKED if ther
2c730 65 20 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a  e are any open.*
2c740 2a 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65  * cursors on the
2c750 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   table..**.** If
2c760 20 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 65   AUTOVACUUM is e
2c770 6e 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20 70  nabled and the p
2c780 61 67 65 20 61 74 20 69 54 61 62 6c 65 20 69 73  age at iTable is
2c790 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a 2a 2a   not the last.**
2c7a0 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 20 74 68   root page in th
2c7b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
2c7c0 20 74 68 65 6e 20 74 68 65 20 6c 61 73 74 20 72   then the last r
2c7d0 6f 6f 74 20 70 61 67 65 20 0a 2a 2a 20 69 6e 20  oot page .** in 
2c7e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2c7f0 65 20 69 73 20 6d 6f 76 65 64 20 69 6e 74 6f 20  e is moved into 
2c800 74 68 65 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c  the slot formerl
2c810 79 20 6f 63 63 75 70 69 65 64 20 62 79 0a 2a 2a  y occupied by.**
2c820 20 69 54 61 62 6c 65 20 61 6e 64 20 74 68 61 74   iTable and that
2c830 20 6c 61 73 74 20 73 6c 6f 74 20 66 6f 72 6d 65   last slot forme
2c840 72 6c 79 20 6f 63 63 75 70 69 65 64 20 62 79 20  rly occupied by 
2c850 74 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61  the last root pa
2c860 67 65 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74  ge.** is added t
2c870 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  o the freelist i
2c880 6e 73 74 65 61 64 20 6f 66 20 69 54 61 62 6c 65  nstead of iTable
2c890 2e 20 20 49 6e 20 74 68 69 73 20 73 61 79 2c 20  .  In this say, 
2c8a0 61 6c 6c 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  all.** root page
2c8b0 73 20 61 72 65 20 6b 65 70 74 20 61 74 20 74 68  s are kept at th
2c8c0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
2c8d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2c8e0 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 6e 65  , which.** is ne
2c8f0 63 65 73 73 61 72 79 20 66 6f 72 20 41 55 54 4f  cessary for AUTO
2c900 56 41 43 55 55 4d 20 74 6f 20 77 6f 72 6b 20 72  VACUUM to work r
2c910 69 67 68 74 2e 20 20 2a 70 69 4d 6f 76 65 64 20  ight.  *piMoved 
2c920 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 0a 2a  is set to the .*
2c930 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 68  * page number th
2c940 61 74 20 75 73 65 64 20 74 6f 20 62 65 20 74 68  at used to be th
2c950 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65  e last root page
2c960 20 69 6e 20 74 68 65 20 66 69 6c 65 20 62 65 66   in the file bef
2c970 6f 72 65 0a 2a 2a 20 74 68 65 20 6d 6f 76 65 2e  ore.** the move.
2c980 20 20 49 66 20 6e 6f 20 70 61 67 65 20 67 65 74    If no page get
2c990 73 20 6d 6f 76 65 64 2c 20 2a 70 69 4d 6f 76 65  s moved, *piMove
2c9a0 64 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a  d is set to 0..*
2c9b0 2a 20 54 68 65 20 6c 61 73 74 20 72 6f 6f 74 20  * The last root 
2c9c0 70 61 67 65 20 69 73 20 72 65 63 6f 72 64 65 64  page is recorded
2c9d0 20 69 6e 20 6d 65 74 61 5b 33 5d 20 61 6e 64 20   in meta[3] and 
2c9e0 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20  the value of.** 
2c9f0 6d 65 74 61 5b 33 5d 20 69 73 20 75 70 64 61 74  meta[3] is updat
2ca00 65 64 20 62 79 20 74 68 69 73 20 70 72 6f 63 65  ed by this proce
2ca10 64 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  dure..*/.int sql
2ca20 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62  ite3BtreeDropTab
2ca30 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  le(Btree *p, int
2ca40 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70 69   iTable, int *pi
2ca50 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63  Moved){.  int rc
2ca60 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
2ca70 67 65 20 3d 20 30 3b 0a 20 20 42 74 53 68 61 72  ge = 0;.  BtShar
2ca80 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
2ca90 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  ;..  if( p->inTr
2caa0 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans!=TRANS_WRITE
2cab0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
2cac0 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53  Bt->readOnly ? S
2cad0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a  QLITE_READONLY :
2cae0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
2caf0 20 7d 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 69   }..  /* It is i
2cb00 6c 6c 65 67 61 6c 20 74 6f 20 64 72 6f 70 20 61  llegal to drop a
2cb10 20 74 61 62 6c 65 20 69 66 20 61 6e 79 20 63 75   table if any cu
2cb20 72 73 6f 72 73 20 61 72 65 20 6f 70 65 6e 20 6f  rsors are open o
2cb30 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
2cb40 61 73 65 2e 20 54 68 69 73 20 69 73 20 62 65 63  ase. This is bec
2cb50 61 75 73 65 20 69 6e 20 61 75 74 6f 2d 76 61 63  ause in auto-vac
2cb60 75 75 6d 20 6d 6f 64 65 20 74 68 65 20 62 61 63  uum mode the bac
2cb70 6b 65 6e 64 20 6d 61 79 0a 20 20 2a 2a 20 6e 65  kend may.  ** ne
2cb80 65 64 20 74 6f 20 6d 6f 76 65 20 61 6e 6f 74 68  ed to move anoth
2cb90 65 72 20 72 6f 6f 74 2d 70 61 67 65 20 74 6f 20  er root-page to 
2cba0 66 69 6c 6c 20 61 20 67 61 70 20 6c 65 66 74 20  fill a gap left 
2cbb0 62 79 20 74 68 65 20 64 65 6c 65 74 65 64 0a 20  by the deleted. 
2cbc0 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 2e 20 49   ** root page. I
2cbd0 66 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72  f an open cursor
2cbe0 20 77 61 73 20 75 73 69 6e 67 20 74 68 69 73 20   was using this 
2cbf0 70 61 67 65 20 61 20 70 72 6f 62 6c 65 6d 20 77  page a problem w
2cc00 6f 75 6c 64 20 0a 20 20 2a 2a 20 6f 63 63 75 72  ould .  ** occur
2cc10 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
2cc20 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ->pCursor ){.   
2cc30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
2cc40 4f 43 4b 45 44 3b 0a 20 20 7d 0a 0a 20 20 72 63  OCKED;.  }..  rc
2cc50 20 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c 20   = getPage(pBt, 
2cc60 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20 26 70  (Pgno)iTable, &p
2cc70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
2cc80 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
2cc90 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2cca0 43 6c 65 61 72 54 61 62 6c 65 28 70 2c 20 69 54  ClearTable(p, iT
2ccb0 61 62 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 20  able);.  if( rc 
2ccc0 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  ){.    releasePa
2ccd0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72  ge(pPage);.    r
2cce0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
2ccf0 20 2a 70 69 4d 6f 76 65 64 20 3d 20 30 3b 0a 0a   *piMoved = 0;..
2cd00 20 20 69 66 28 20 69 54 61 62 6c 65 3e 31 20 29    if( iTable>1 )
2cd10 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
2cd20 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2cd30 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
2cd40 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65  e(pPage);.    re
2cd50 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
2cd60 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20  ;.#else.    if( 
2cd70 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
2cd80 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6d 61  ){.      Pgno ma
2cd90 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20 20  xRootPgno;.     
2cda0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2cdb0 65 65 47 65 74 4d 65 74 61 28 70 2c 20 34 2c 20  eeGetMeta(p, 4, 
2cdc0 26 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20  &maxRootPgno);. 
2cdd0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2cde0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2cdf0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
2ce00 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  age);.        re
2ce10 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
2ce20 0a 0a 20 20 20 20 20 20 69 66 28 20 69 54 61 62  ..      if( iTab
2ce30 6c 65 3d 3d 6d 61 78 52 6f 6f 74 50 67 6e 6f 20  le==maxRootPgno 
2ce40 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
2ce50 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
2ce60 20 64 72 6f 70 70 65 64 20 69 73 20 74 68 65 20   dropped is the 
2ce70 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 6c  table with the l
2ce80 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65  argest root-page
2ce90 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  .        ** numb
2cea0 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  er in the databa
2ceb0 73 65 2c 20 70 75 74 20 74 68 65 20 72 6f 6f 74  se, put the root
2cec0 20 70 61 67 65 20 6f 6e 20 74 68 65 20 66 72 65   page on the fre
2ced0 65 20 6c 69 73 74 2e 20 0a 20 20 20 20 20 20 20  e list. .       
2cee0 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
2cef0 20 66 72 65 65 50 61 67 65 28 70 50 61 67 65 29   freePage(pPage)
2cf00 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
2cf10 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
2cf20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2cf30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2cf40 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2cf50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2cf60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
2cf70 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e  * The table bein
2cf80 67 20 64 72 6f 70 70 65 64 20 64 6f 65 73 20 6e  g dropped does n
2cf90 6f 74 20 68 61 76 65 20 74 68 65 20 6c 61 72 67  ot have the larg
2cfa0 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20  est root-page.  
2cfb0 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
2cfc0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
2cfd0 20 53 6f 20 6d 6f 76 65 20 74 68 65 20 70 61 67   So move the pag
2cfe0 65 20 74 68 61 74 20 64 6f 65 73 20 69 6e 74 6f  e that does into
2cff0 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
2d000 20 67 61 70 20 6c 65 66 74 20 62 79 20 74 68 65   gap left by the
2d010 20 64 65 6c 65 74 65 64 20 72 6f 6f 74 2d 70 61   deleted root-pa
2d020 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ge..        */. 
2d030 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
2d040 70 4d 6f 76 65 3b 0a 20 20 20 20 20 20 20 20 72  pMove;.        r
2d050 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
2d060 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2d070 67 65 74 50 61 67 65 28 70 42 74 2c 20 6d 61 78  getPage(pBt, max
2d080 52 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f 76 65  RootPgno, &pMove
2d090 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2d0a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2d0b0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2d0c0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
2d0d0 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f         rc = relo
2d0e0 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4d  catePage(pBt, pM
2d0f0 6f 76 65 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54  ove, PTRMAP_ROOT
2d100 50 41 47 45 2c 20 30 2c 20 69 54 61 62 6c 65 29  PAGE, 0, iTable)
2d110 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
2d120 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20  ePage(pMove);.  
2d130 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2d140 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2d150 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2d160 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d170 20 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70    rc = getPage(p
2d180 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c  Bt, maxRootPgno,
2d190 20 26 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20   &pMove);.      
2d1a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2d1b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2d1c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2d1d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
2d1e0 20 3d 20 66 72 65 65 50 61 67 65 28 70 4d 6f 76   = freePage(pMov
2d1f0 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65  e);.        rele
2d200 61 73 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a  asePage(pMove);.
2d210 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2d220 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2d230 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2d240 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2d250 20 20 20 20 2a 70 69 4d 6f 76 65 64 20 3d 20 6d      *piMoved = m
2d260 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20  axRootPgno;.    
2d270 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65    }..      /* Se
2d280 74 20 74 68 65 20 6e 65 77 20 27 6d 61 78 2d 72  t the new 'max-r
2d290 6f 6f 74 2d 70 61 67 65 27 20 76 61 6c 75 65 20  oot-page' value 
2d2a0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
2d2b0 68 65 61 64 65 72 2e 20 54 68 69 73 0a 20 20 20  header. This.   
2d2c0 20 20 20 2a 2a 20 69 73 20 74 68 65 20 6f 6c 64     ** is the old
2d2d0 20 76 61 6c 75 65 20 6c 65 73 73 20 6f 6e 65 2c   value less one,
2d2e0 20 6c 65 73 73 20 6f 6e 65 20 6d 6f 72 65 20 69   less one more i
2d2f0 66 20 74 68 61 74 20 68 61 70 70 65 6e 73 20 74  f that happens t
2d300 6f 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 61 20  o.      ** be a 
2d310 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
2d320 2c 20 6c 65 73 73 20 6f 6e 65 20 61 67 61 69 6e  , less one again
2d330 20 69 66 20 74 68 61 74 20 69 73 20 74 68 65 0a   if that is the.
2d340 20 20 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47        ** PENDING
2d350 5f 42 59 54 45 5f 50 41 47 45 2e 0a 20 20 20 20  _BYTE_PAGE..    
2d360 20 20 2a 2f 0a 20 20 20 20 20 20 6d 61 78 52 6f    */.      maxRo
2d370 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20  otPgno--;.      
2d380 69 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d  if( maxRootPgno=
2d390 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
2d3a0 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
2d3b0 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d     maxRootPgno--
2d3c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2d3d0 69 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d  if( maxRootPgno=
2d3e0 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70  =PTRMAP_PAGENO(p
2d3f0 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29  Bt, maxRootPgno)
2d400 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 78 52   ){.        maxR
2d410 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20  ootPgno--;.     
2d420 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
2d430 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 21 3d 50 45   maxRootPgno!=PE
2d440 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
2d450 70 42 74 29 20 29 3b 0a 0a 20 20 20 20 20 20 72  pBt) );..      r
2d460 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2d470 55 70 64 61 74 65 4d 65 74 61 28 70 2c 20 34 2c  UpdateMeta(p, 4,
2d480 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20   maxRootPgno);. 
2d490 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2d4a0 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50  rc = freePage(pP
2d4b0 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 6c 65  age);.      rele
2d4c0 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
2d4d0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
2d4e0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
2d4f0 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70  sqlite3BtreeDrop
2d500 54 61 62 6c 65 20 77 61 73 20 63 61 6c 6c 65 64  Table was called
2d510 20 6f 6e 20 70 61 67 65 20 31 2e 20 2a 2f 0a 20   on page 1. */. 
2d520 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67     zeroPage(pPag
2d530 65 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  e, PTF_INTKEY|PT
2d540 46 5f 4c 45 41 46 20 29 3b 0a 20 20 20 20 72 65  F_LEAF );.    re
2d550 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
2d560 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2d570 63 3b 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52  c;  .}.../*.** R
2d580 65 61 64 20 74 68 65 20 6d 65 74 61 2d 69 6e 66  ead the meta-inf
2d590 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 6f 66 20  ormation out of 
2d5a0 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  a database file.
2d5b0 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69 73 20    Meta[0].** is 
2d5c0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  the number of fr
2d5d0 65 65 20 70 61 67 65 73 20 63 75 72 72 65 6e 74  ee pages current
2d5e0 6c 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ly in the databa
2d5f0 73 65 2e 20 20 4d 65 74 61 5b 31 5d 0a 2a 2a 20  se.  Meta[1].** 
2d600 74 68 72 6f 75 67 68 20 6d 65 74 61 5b 31 35 5d  through meta[15]
2d610 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 66   are available f
2d620 6f 72 20 75 73 65 20 62 79 20 68 69 67 68 65 72  or use by higher
2d630 20 6c 61 79 65 72 73 2e 20 20 4d 65 74 61 5b 30   layers.  Meta[0
2d640 5d 0a 2a 2a 20 69 73 20 72 65 61 64 2d 6f 6e 6c  ].** is read-onl
2d650 79 2c 20 74 68 65 20 6f 74 68 65 72 73 20 61 72  y, the others ar
2d660 65 20 72 65 61 64 2f 77 72 69 74 65 2e 0a 2a 2a  e read/write..**
2d670 20 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20   .** The schema 
2d680 6c 61 79 65 72 20 6e 75 6d 62 65 72 73 20 6d 65  layer numbers me
2d690 74 61 20 76 61 6c 75 65 73 20 64 69 66 66 65 72  ta values differ
2d6a0 65 6e 74 6c 79 2e 20 20 41 74 20 74 68 65 20 73  ently.  At the s
2d6b0 63 68 65 6d 61 0a 2a 2a 20 6c 61 79 65 72 20 28  chema.** layer (
2d6c0 61 6e 64 20 74 68 65 20 53 65 74 43 6f 6f 6b 69  and the SetCooki
2d6d0 65 20 61 6e 64 20 52 65 61 64 43 6f 6f 6b 69 65  e and ReadCookie
2d6e0 20 6f 70 63 6f 64 65 73 29 20 74 68 65 20 6e 75   opcodes) the nu
2d6f0 6d 62 65 72 20 6f 66 0a 2a 2a 20 66 72 65 65 20  mber of.** free 
2d700 70 61 67 65 73 20 69 73 20 6e 6f 74 20 76 69 73  pages is not vis
2d710 69 62 6c 65 2e 20 20 53 6f 20 43 6f 6f 6b 69 65  ible.  So Cookie
2d720 5b 30 5d 20 69 73 20 74 68 65 20 73 61 6d 65 20  [0] is the same 
2d730 61 73 20 4d 65 74 61 5b 31 5d 2e 0a 2a 2f 0a 69  as Meta[1]..*/.i
2d740 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
2d750 65 74 4d 65 74 61 28 42 74 72 65 65 20 2a 70 2c  etMeta(Btree *p,
2d760 20 69 6e 74 20 69 64 78 2c 20 75 33 32 20 2a 70   int idx, u32 *p
2d770 4d 65 74 61 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Meta){.  int rc;
2d780 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2d790 20 2a 70 50 31 3b 0a 20 20 42 74 53 68 61 72 65   *pP1;.  BtShare
2d7a0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
2d7b0 0a 0a 20 20 2f 2a 20 52 65 61 64 69 6e 67 20 61  ..  /* Reading a
2d7c0 20 6d 65 74 61 2d 64 61 74 61 20 76 61 6c 75 65   meta-data value
2d7d0 20 72 65 71 75 69 72 65 73 20 61 20 72 65 61 64   requires a read
2d7e0 2d 6c 6f 63 6b 20 6f 6e 20 70 61 67 65 20 31 20  -lock on page 1 
2d7f0 28 61 6e 64 20 68 65 6e 63 65 0a 20 20 2a 2a 20  (and hence.  ** 
2d800 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
2d810 72 20 74 61 62 6c 65 2e 20 57 65 20 67 72 61 62  r table. We grab
2d820 20 74 68 69 73 20 6c 6f 63 6b 20 72 65 67 61 72   this lock regar
2d830 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
2d840 20 6f 72 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65   or.  ** not the
2d850 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f   SQLITE_ReadUnco
2d860 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73 20  mmitted flag is 
2d870 73 65 74 20 28 74 68 65 20 74 61 62 6c 65 20 72  set (the table r
2d880 6f 6f 74 65 64 20 61 74 20 70 61 67 65 0a 20 20  ooted at page.  
2d890 2a 2a 20 31 20 69 73 20 74 72 65 61 74 65 64 20  ** 1 is treated 
2d8a0 61 73 20 61 20 73 70 65 63 69 61 6c 20 63 61 73  as a special cas
2d8b0 65 20 62 79 20 71 75 65 72 79 54 61 62 6c 65 4c  e by queryTableL
2d8c0 6f 63 6b 28 29 20 61 6e 64 20 6c 6f 63 6b 54 61  ock() and lockTa
2d8d0 62 6c 65 28 29 29 2e 0a 20 20 2a 2f 0a 20 20 72  ble())..  */.  r
2d8e0 63 20 3d 20 71 75 65 72 79 54 61 62 6c 65 4c 6f  c = queryTableLo
2d8f0 63 6b 28 70 2c 20 31 2c 20 52 45 41 44 5f 4c 4f  ck(p, 1, READ_LO
2d900 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  CK);.  if( rc!=S
2d910 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2d920 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
2d930 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30    assert( idx>=0
2d940 20 26 26 20 69 64 78 3c 3d 31 35 20 29 3b 0a 20   && idx<=15 );. 
2d950 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
2d960 65 72 5f 67 65 74 28 70 42 74 2d 3e 70 50 61 67  er_get(pBt->pPag
2d970 65 72 2c 20 31 2c 20 28 76 6f 69 64 2a 2a 29 26  er, 1, (void**)&
2d980 70 50 31 29 3b 0a 20 20 69 66 28 20 72 63 20 29  pP1);.  if( rc )
2d990 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70   return rc;.  *p
2d9a0 4d 65 74 61 20 3d 20 67 65 74 34 62 79 74 65 28  Meta = get4byte(
2d9b0 26 70 50 31 5b 33 36 20 2b 20 69 64 78 2a 34 5d  &pP1[36 + idx*4]
2d9c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65  );.  sqlite3page
2d9d0 72 5f 75 6e 72 65 66 28 70 50 31 29 3b 0a 0a 20  r_unref(pP1);.. 
2d9e0 20 2f 2a 20 49 66 20 61 75 74 6f 76 61 63 75 75   /* If autovacuu
2d9f0 6d 65 64 20 69 73 20 64 69 73 61 62 6c 65 64 20  med is disabled 
2da00 69 6e 20 74 68 69 73 20 62 75 69 6c 64 20 62 75  in this build bu
2da10 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20  t we are trying 
2da20 74 6f 20 0a 20 20 2a 2a 20 61 63 63 65 73 73 20  to .  ** access 
2da30 61 6e 20 61 75 74 6f 76 61 63 75 75 6d 65 64 20  an autovacuumed 
2da40 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 6d  database, then m
2da50 61 6b 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ake the database
2da60 20 72 65 61 64 6f 6e 6c 79 2e 20 0a 20 20 2a 2f   readonly. .  */
2da70 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
2da80 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2da90 20 69 66 28 20 69 64 78 3d 3d 34 20 26 26 20 2a   if( idx==4 && *
2daa0 70 4d 65 74 61 3e 30 20 29 20 70 42 74 2d 3e 72  pMeta>0 ) pBt->r
2dab0 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 23 65 6e  eadOnly = 1;.#en
2dac0 64 69 66 0a 0a 20 20 2f 2a 20 47 72 61 62 20 74  dif..  /* Grab t
2dad0 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20  he read-lock on 
2dae0 70 61 67 65 20 31 2e 20 2a 2f 0a 20 20 72 63 20  page 1. */.  rc 
2daf0 3d 20 6c 6f 63 6b 54 61 62 6c 65 28 70 2c 20 31  = lockTable(p, 1
2db00 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20  , READ_LOCK);.  
2db10 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2db20 0a 2a 2a 20 57 72 69 74 65 20 6d 65 74 61 2d 69  .** Write meta-i
2db30 6e 66 6f 72 6d 61 74 69 6f 6e 20 62 61 63 6b 20  nformation back 
2db40 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
2db50 65 2e 20 20 4d 65 74 61 5b 30 5d 20 69 73 0a 2a  e.  Meta[0] is.*
2db60 2a 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20  * read-only and 
2db70 6d 61 79 20 6e 6f 74 20 62 65 20 77 72 69 74 74  may not be writt
2db80 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  en..*/.int sqlit
2db90 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74  e3BtreeUpdateMet
2dba0 61 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  a(Btree *p, int 
2dbb0 69 64 78 2c 20 75 33 32 20 69 4d 65 74 61 29 7b  idx, u32 iMeta){
2dbc0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2dbd0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75 6e 73   = p->pBt;.  uns
2dbe0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 31 3b  igned char *pP1;
2dbf0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
2dc00 65 72 74 28 20 69 64 78 3e 3d 31 20 26 26 20 69  ert( idx>=1 && i
2dc10 64 78 3c 3d 31 35 20 29 3b 0a 20 20 69 66 28 20  dx<=15 );.  if( 
2dc20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  p->inTrans!=TRAN
2dc30 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72  S_WRITE ){.    r
2dc40 65 74 75 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f  eturn pBt->readO
2dc50 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41  nly ? SQLITE_REA
2dc60 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45  DONLY : SQLITE_E
2dc70 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 73 73 65  RROR;.  }.  asse
2dc80 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 21  rt( pBt->pPage1!
2dc90 3d 30 20 29 3b 0a 20 20 70 50 31 20 3d 20 70 42  =0 );.  pP1 = pB
2dca0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
2dcb0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
2dcc0 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 31 29  pager_write(pP1)
2dcd0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
2dce0 75 72 6e 20 72 63 3b 0a 20 20 70 75 74 34 62 79  urn rc;.  put4by
2dcf0 74 65 28 26 70 50 31 5b 33 36 20 2b 20 69 64 78  te(&pP1[36 + idx
2dd00 2a 34 5d 2c 20 69 4d 65 74 61 29 3b 0a 20 20 72  *4], iMeta);.  r
2dd10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2dd20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2dd30 20 74 68 65 20 66 6c 61 67 20 62 79 74 65 20 61   the flag byte a
2dd40 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
2dd50 6f 66 20 74 68 65 20 70 61 67 65 20 74 68 61 74  of the page that
2dd60 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69   the cursor.** i
2dd70 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
2dd80 74 69 6e 67 20 74 6f 2e 0a 2a 2f 0a 69 6e 74 20  ting to..*/.int 
2dd90 73 71 6c 69 74 65 33 42 74 72 65 65 46 6c 61 67  sqlite3BtreeFlag
2dda0 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  s(BtCursor *pCur
2ddb0 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68  ){.  /* TODO: Wh
2ddc0 61 74 20 61 62 6f 75 74 20 43 55 52 53 4f 52 5f  at about CURSOR_
2ddd0 52 45 51 55 49 52 45 53 45 45 4b 20 73 74 61 74  REQUIRESEEK stat
2dde0 65 3f 20 50 72 6f 62 61 62 6c 79 20 6e 65 65 64  e? Probably need
2ddf0 20 74 6f 20 63 61 6c 6c 0a 20 20 2a 2a 20 72 65   to call.  ** re
2de00 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73  storeOrClearCurs
2de10 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 68 65 72  orPosition() her
2de20 65 2e 0a 20 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  e..  */.  MemPag
2de30 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
2de40 3e 70 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e  >pPage;.  return
2de50 20 70 50 61 67 65 20 3f 20 70 50 61 67 65 2d 3e   pPage ? pPage->
2de60 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
2de70 4f 66 66 73 65 74 5d 20 3a 20 30 3b 0a 7d 0a 0a  Offset] : 0;.}..
2de80 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
2de90 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  BUG./*.** Print 
2dea0 61 20 64 69 73 61 73 73 65 6d 62 6c 79 20 6f 66  a disassembly of
2deb0 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
2dec0 6f 6e 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70  on standard outp
2ded0 75 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ut.  This routin
2dee0 65 0a 2a 2a 20 69 73 20 75 73 65 64 20 66 6f 72  e.** is used for
2def0 20 64 65 62 75 67 67 69 6e 67 20 61 6e 64 20 74   debugging and t
2df00 65 73 74 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a  esting only..*/.
2df10 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
2df20 50 61 67 65 44 75 6d 70 28 42 74 53 68 61 72 65  PageDump(BtShare
2df30 64 20 2a 70 42 74 2c 20 69 6e 74 20 70 67 6e 6f  d *pBt, int pgno
2df40 2c 20 69 6e 74 20 72 65 63 75 72 73 69 76 65 2c  , int recursive,
2df50 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
2df60 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  t){.  int rc;.  
2df70 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
2df80 20 20 69 6e 74 20 69 2c 20 6a 2c 20 63 3b 0a 20    int i, j, c;. 
2df90 20 69 6e 74 20 6e 46 72 65 65 3b 0a 20 20 75 31   int nFree;.  u1
2dfa0 36 20 69 64 78 3b 0a 20 20 69 6e 74 20 68 64 72  6 idx;.  int hdr
2dfb0 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20  ;.  int nCell;. 
2dfc0 20 69 6e 74 20 69 73 49 6e 69 74 3b 0a 20 20 75   int isInit;.  u
2dfd0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
2dfe0 74 61 3b 0a 20 20 63 68 61 72 20 72 61 6e 67 65  ta;.  char range
2dff0 5b 32 30 5d 3b 0a 20 20 75 6e 73 69 67 6e 65 64  [20];.  unsigned
2e000 20 63 68 61 72 20 70 61 79 6c 6f 61 64 5b 32 30   char payload[20
2e010 5d 3b 0a 0a 20 20 72 63 20 3d 20 67 65 74 50 61  ];..  rc = getPa
2e020 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 70 67  ge(pBt, (Pgno)pg
2e030 6e 6f 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 69  no, &pPage);.  i
2e040 73 49 6e 69 74 20 3d 20 70 50 61 67 65 2d 3e 69  sInit = pPage->i
2e050 73 49 6e 69 74 3b 0a 20 20 69 66 28 20 70 50 61  sInit;.  if( pPa
2e060 67 65 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b  ge->isInit==0 ){
2e070 0a 20 20 20 20 69 6e 69 74 50 61 67 65 28 70 50  .    initPage(pP
2e080 61 67 65 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20  age, pParent);. 
2e090 20 7d 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20   }.  if( rc ){. 
2e0a0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2e0b0 7d 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  }.  hdr = pPage-
2e0c0 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 64 61  >hdrOffset;.  da
2e0d0 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
2e0e0 61 3b 0a 20 20 63 20 3d 20 64 61 74 61 5b 68 64  a;.  c = data[hd
2e0f0 72 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 69 6e 74  r];.  pPage->int
2e100 4b 65 79 20 3d 20 28 63 20 26 20 28 50 54 46 5f  Key = (c & (PTF_
2e110 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44  INTKEY|PTF_LEAFD
2e120 41 54 41 29 29 21 3d 30 3b 0a 20 20 70 50 61 67  ATA))!=0;.  pPag
2e130 65 2d 3e 7a 65 72 6f 44 61 74 61 20 3d 20 28 63  e->zeroData = (c
2e140 20 26 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 29   & PTF_ZERODATA)
2e150 21 3d 30 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65  !=0;.  pPage->le
2e160 61 66 44 61 74 61 20 3d 20 28 63 20 26 20 50 54  afData = (c & PT
2e170 46 5f 4c 45 41 46 44 41 54 41 29 21 3d 30 3b 0a  F_LEAFDATA)!=0;.
2e180 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20    pPage->leaf = 
2e190 28 63 20 26 20 50 54 46 5f 4c 45 41 46 29 21 3d  (c & PTF_LEAF)!=
2e1a0 30 3b 0a 20 20 70 50 61 67 65 2d 3e 68 61 73 44  0;.  pPage->hasD
2e1b0 61 74 61 20 3d 20 21 28 70 50 61 67 65 2d 3e 7a  ata = !(pPage->z
2e1c0 65 72 6f 44 61 74 61 20 7c 7c 20 28 21 70 50 61  eroData || (!pPa
2e1d0 67 65 2d 3e 6c 65 61 66 20 26 26 20 70 50 61 67  ge->leaf && pPag
2e1e0 65 2d 3e 6c 65 61 66 44 61 74 61 29 29 3b 0a 20  e->leafData));. 
2e1f0 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74   nCell = get2byt
2e200 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b  e(&data[hdr+3]);
2e210 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
2e220 72 69 6e 74 66 28 22 50 41 47 45 20 25 64 3a 20  rintf("PAGE %d: 
2e230 20 66 6c 61 67 73 3d 30 78 25 30 32 78 20 20 66   flags=0x%02x  f
2e240 72 61 67 3d 25 64 20 20 20 70 61 72 65 6e 74 3d  rag=%d   parent=
2e250 25 64 5c 6e 22 2c 20 70 67 6e 6f 2c 0a 20 20 20  %d\n", pgno,.   
2e260 20 64 61 74 61 5b 68 64 72 5d 2c 20 64 61 74 61   data[hdr], data
2e270 5b 68 64 72 2b 37 5d 2c 20 0a 20 20 20 20 28 70  [hdr+7], .    (p
2e280 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 26 26 20  Page->isInit && 
2e290 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 29 20  pPage->pParent) 
2e2a0 3f 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  ? pPage->pParent
2e2b0 2d 3e 70 67 6e 6f 20 3a 20 30 29 3b 0a 20 20 61  ->pgno : 0);.  a
2e2c0 73 73 65 72 74 28 20 68 64 72 20 3d 3d 20 28 70  ssert( hdr == (p
2e2d0 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30  gno==1 ? 100 : 0
2e2e0 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 68 64 72  ) );.  idx = hdr
2e2f0 20 2b 20 31 32 20 2d 20 70 50 61 67 65 2d 3e 6c   + 12 - pPage->l
2e300 65 61 66 2a 34 3b 0a 20 20 66 6f 72 28 69 3d 30  eaf*4;.  for(i=0
2e310 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
2e320 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  .    CellInfo in
2e330 66 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69  fo;.    Pgno chi
2e340 6c 64 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  ld;.    unsigned
2e350 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20   char *pCell;.  
2e360 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20 69 6e    int sz;.    in
2e370 74 20 61 64 64 72 3b 0a 0a 20 20 20 20 61 64 64  t addr;..    add
2e380 72 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  r = get2byte(&da
2e390 74 61 5b 69 64 78 20 2b 20 32 2a 69 5d 29 3b 0a  ta[idx + 2*i]);.
2e3a0 20 20 20 20 70 43 65 6c 6c 20 3d 20 26 64 61 74      pCell = &dat
2e3b0 61 5b 61 64 64 72 5d 3b 0a 20 20 20 20 70 61 72  a[addr];.    par
2e3c0 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
2e3d0 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
2e3e0 20 20 20 20 73 7a 20 3d 20 69 6e 66 6f 2e 6e 53      sz = info.nS
2e3f0 69 7a 65 3b 0a 20 20 20 20 73 70 72 69 6e 74 66  ize;.    sprintf
2e400 28 72 61 6e 67 65 2c 22 25 64 2e 2e 25 64 22 2c  (range,"%d..%d",
2e410 20 61 64 64 72 2c 20 61 64 64 72 2b 73 7a 2d 31   addr, addr+sz-1
2e420 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
2e430 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
2e440 63 68 69 6c 64 20 3d 20 30 3b 0a 20 20 20 20 7d  child = 0;.    }
2e450 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 69 6c  else{.      chil
2e460 64 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65  d = get4byte(pCe
2e470 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ll);.    }.    s
2e480 7a 20 3d 20 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a  z = info.nData;.
2e490 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
2e4a0 69 6e 74 4b 65 79 20 29 20 73 7a 20 2b 3d 20 69  intKey ) sz += i
2e4b0 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 69 66  nfo.nKey;.    if
2e4c0 28 20 73 7a 3e 73 69 7a 65 6f 66 28 70 61 79 6c  ( sz>sizeof(payl
2e4d0 6f 61 64 29 2d 31 20 29 20 73 7a 20 3d 20 73 69  oad)-1 ) sz = si
2e4e0 7a 65 6f 66 28 70 61 79 6c 6f 61 64 29 2d 31 3b  zeof(payload)-1;
2e4f0 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 61 79 6c  .    memcpy(payl
2e500 6f 61 64 2c 20 26 70 43 65 6c 6c 5b 69 6e 66 6f  oad, &pCell[info
2e510 2e 6e 48 65 61 64 65 72 5d 2c 20 73 7a 29 3b 0a  .nHeader], sz);.
2e520 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73      for(j=0; j<s
2e530 7a 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  z; j++){.      i
2e540 66 28 20 70 61 79 6c 6f 61 64 5b 6a 5d 3c 30 78  f( payload[j]<0x
2e550 32 30 20 7c 7c 20 70 61 79 6c 6f 61 64 5b 6a 5d  20 || payload[j]
2e560 3e 30 78 37 66 20 29 20 70 61 79 6c 6f 61 64 5b  >0x7f ) payload[
2e570 6a 5d 20 3d 20 27 2e 27 3b 0a 20 20 20 20 7d 0a  j] = '.';.    }.
2e580 20 20 20 20 70 61 79 6c 6f 61 64 5b 73 7a 5d 20      payload[sz] 
2e590 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
2e5a0 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20  DebugPrintf(.   
2e5b0 20 20 20 22 63 65 6c 6c 20 25 32 64 3a 20 69 3d     "cell %2d: i=
2e5c0 25 2d 31 30 73 20 63 68 6c 64 3d 25 2d 34 64 20  %-10s chld=%-4d 
2e5d0 6e 6b 3d 25 2d 34 6c 6c 64 20 6e 64 3d 25 2d 34  nk=%-4lld nd=%-4
2e5e0 64 20 70 61 79 6c 6f 61 64 3d 25 73 5c 6e 22 2c  d payload=%s\n",
2e5f0 0a 20 20 20 20 20 20 69 2c 20 72 61 6e 67 65 2c  .      i, range,
2e600 20 63 68 69 6c 64 2c 20 69 6e 66 6f 2e 6e 4b 65   child, info.nKe
2e610 79 2c 20 69 6e 66 6f 2e 6e 44 61 74 61 2c 20 70  y, info.nData, p
2e620 61 79 6c 6f 61 64 0a 20 20 20 20 29 3b 0a 20 20  ayload.    );.  
2e630 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  }.  if( !pPage->
2e640 6c 65 61 66 20 29 7b 0a 20 20 20 20 73 71 6c 69  leaf ){.    sqli
2e650 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
2e660 72 69 67 68 74 5f 63 68 69 6c 64 3a 20 25 64 5c  right_child: %d\
2e670 6e 22 2c 20 67 65 74 34 62 79 74 65 28 26 64 61  n", get4byte(&da
2e680 74 61 5b 68 64 72 2b 38 5d 29 29 3b 0a 20 20 7d  ta[hdr+8]));.  }
2e690 0a 20 20 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20  .  nFree = 0;.  
2e6a0 69 20 3d 20 30 3b 0a 20 20 69 64 78 20 3d 20 67  i = 0;.  idx = g
2e6b0 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
2e6c0 72 2b 31 5d 29 3b 0a 20 20 77 68 69 6c 65 28 20  r+1]);.  while( 
2e6d0 69 64 78 3e 30 20 26 26 20 69 64 78 3c 70 50 61  idx>0 && idx<pPa
2e6e0 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
2e6f0 69 7a 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 73  ize ){.    int s
2e700 7a 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  z = get2byte(&da
2e710 74 61 5b 69 64 78 2b 32 5d 29 3b 0a 20 20 20 20  ta[idx+2]);.    
2e720 73 70 72 69 6e 74 66 28 72 61 6e 67 65 2c 22 25  sprintf(range,"%
2e730 64 2e 2e 25 64 22 2c 20 69 64 78 2c 20 69 64 78  d..%d", idx, idx
2e740 2b 73 7a 2d 31 29 3b 0a 20 20 20 20 6e 46 72 65  +sz-1);.    nFre
2e750 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 73 71 6c  e += sz;.    sql
2e760 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
2e770 22 66 72 65 65 62 6c 6f 63 6b 20 25 32 64 3a 20  "freeblock %2d: 
2e780 69 3d 25 2d 31 30 73 20 73 69 7a 65 3d 25 2d 34  i=%-10s size=%-4
2e790 64 20 74 6f 74 61 6c 3d 25 64 5c 6e 22 2c 0a 20  d total=%d\n",. 
2e7a0 20 20 20 20 20 20 69 2c 20 72 61 6e 67 65 2c 20        i, range, 
2e7b0 73 7a 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20 20  sz, nFree);.    
2e7c0 69 64 78 20 3d 20 67 65 74 32 62 79 74 65 28 26  idx = get2byte(&
2e7d0 64 61 74 61 5b 69 64 78 5d 29 3b 0a 20 20 20 20  data[idx]);.    
2e7e0 69 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  i++;.  }.  if( i
2e7f0 64 78 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  dx!=0 ){.    sql
2e800 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
2e810 22 45 52 52 4f 52 3a 20 6e 65 78 74 20 66 72 65  "ERROR: next fre
2e820 65 62 6c 6f 63 6b 20 69 6e 64 65 78 20 6f 75 74  eblock index out
2e830 20 6f 66 20 72 61 6e 67 65 3a 20 25 64 5c 6e 22   of range: %d\n"
2e840 2c 20 69 64 78 29 3b 0a 20 20 7d 0a 20 20 69 66  , idx);.  }.  if
2e850 28 20 72 65 63 75 72 73 69 76 65 20 26 26 20 21  ( recursive && !
2e860 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2e870 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
2e880 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
2e890 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2e8a0 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
2e8b0 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20  (pPage, i);.    
2e8c0 20 20 62 74 72 65 65 50 61 67 65 44 75 6d 70 28    btreePageDump(
2e8d0 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 70 43  pBt, get4byte(pC
2e8e0 65 6c 6c 29 2c 20 31 2c 20 70 50 61 67 65 29 3b  ell), 1, pPage);
2e8f0 0a 20 20 20 20 20 20 69 64 78 20 3d 20 67 65 74  .      idx = get
2e900 32 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20  2byte(pCell);.  
2e910 20 20 7d 0a 20 20 20 20 62 74 72 65 65 50 61 67    }.    btreePag
2e920 65 44 75 6d 70 28 70 42 74 2c 20 67 65 74 34 62  eDump(pBt, get4b
2e930 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 38 5d  yte(&data[hdr+8]
2e940 29 2c 20 31 2c 20 70 50 61 67 65 29 3b 0a 20 20  ), 1, pPage);.  
2e950 7d 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  }.  pPage->isIni
2e960 74 20 3d 20 69 73 49 6e 69 74 3b 0a 20 20 73 71  t = isInit;.  sq
2e970 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
2e980 28 64 61 74 61 29 3b 0a 20 20 66 66 6c 75 73 68  (data);.  fflush
2e990 28 73 74 64 6f 75 74 29 3b 0a 20 20 72 65 74 75  (stdout);.  retu
2e9a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2e9b0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2e9c0 50 61 67 65 44 75 6d 70 28 42 74 72 65 65 20 2a  PageDump(Btree *
2e9d0 70 2c 20 69 6e 74 20 70 67 6e 6f 2c 20 69 6e 74  p, int pgno, int
2e9e0 20 72 65 63 75 72 73 69 76 65 29 7b 0a 20 20 72   recursive){.  r
2e9f0 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65 44  eturn btreePageD
2ea00 75 6d 70 28 70 2d 3e 70 42 74 2c 20 70 67 6e 6f  ump(p->pBt, pgno
2ea10 2c 20 72 65 63 75 72 73 69 76 65 2c 20 30 29 3b  , recursive, 0);
2ea20 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64  .}.#endif..#if d
2ea30 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
2ea40 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  ST) || defined(S
2ea50 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a  QLITE_DEBUG)./*.
2ea60 2a 2a 20 46 69 6c 6c 20 61 52 65 73 75 6c 74 5b  ** Fill aResult[
2ea70 5d 20 77 69 74 68 20 69 6e 66 6f 72 6d 61 74 69  ] with informati
2ea80 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 65 6e 74  on about the ent
2ea90 72 79 20 61 6e 64 20 70 61 67 65 20 74 68 61 74  ry and page that
2eaa0 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 69   the.** cursor i
2eab0 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a  s pointing to..*
2eac0 2a 20 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b  * .**   aResult[
2ead0 30 5d 20 3d 20 20 54 68 65 20 70 61 67 65 20 6e  0] =  The page n
2eae0 75 6d 62 65 72 0a 2a 2a 20 20 20 61 52 65 73 75  umber.**   aResu
2eaf0 6c 74 5b 31 5d 20 3d 20 20 54 68 65 20 65 6e 74  lt[1] =  The ent
2eb00 72 79 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 61  ry number.**   a
2eb10 52 65 73 75 6c 74 5b 32 5d 20 3d 20 20 54 6f 74  Result[2] =  Tot
2eb20 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  al number of ent
2eb30 72 69 65 73 20 6f 6e 20 74 68 69 73 20 70 61 67  ries on this pag
2eb40 65 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 33  e.**   aResult[3
2eb50 5d 20 3d 20 20 43 65 6c 6c 20 73 69 7a 65 20 28  ] =  Cell size (
2eb60 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 20 2b 20  local payload + 
2eb70 68 65 61 64 65 72 29 0a 2a 2a 20 20 20 61 52 65  header).**   aRe
2eb80 73 75 6c 74 5b 34 5d 20 3d 20 20 4e 75 6d 62 65  sult[4] =  Numbe
2eb90 72 20 6f 66 20 66 72 65 65 20 62 79 74 65 73 20  r of free bytes 
2eba0 6f 6e 20 74 68 69 73 20 70 61 67 65 0a 2a 2a 20  on this page.** 
2ebb0 20 20 61 52 65 73 75 6c 74 5b 35 5d 20 3d 20 20    aResult[5] =  
2ebc0 4e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62  Number of free b
2ebd0 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 70 61 67  locks on the pag
2ebe0 65 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 36  e.**   aResult[6
2ebf0 5d 20 3d 20 20 54 6f 74 61 6c 20 70 61 79 6c 6f  ] =  Total paylo
2ec00 61 64 20 73 69 7a 65 20 28 6c 6f 63 61 6c 20 2b  ad size (local +
2ec10 20 6f 76 65 72 66 6c 6f 77 29 0a 2a 2a 20 20 20   overflow).**   
2ec20 61 52 65 73 75 6c 74 5b 37 5d 20 3d 20 20 48 65  aResult[7] =  He
2ec30 61 64 65 72 20 73 69 7a 65 20 69 6e 20 62 79 74  ader size in byt
2ec40 65 73 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b  es.**   aResult[
2ec50 38 5d 20 3d 20 20 4c 6f 63 61 6c 20 70 61 79 6c  8] =  Local payl
2ec60 6f 61 64 20 73 69 7a 65 0a 2a 2a 20 20 20 61 52  oad size.**   aR
2ec70 65 73 75 6c 74 5b 39 5d 20 3d 20 20 50 61 72 65  esult[9] =  Pare
2ec80 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 2a  nt page number.*
2ec90 2a 20 20 20 61 52 65 73 75 6c 74 5b 31 30 5d 3d  *   aResult[10]=
2eca0 20 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66    Page number of
2ecb0 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66   the first overf
2ecc0 6c 6f 77 20 70 61 67 65 0a 2a 2a 0a 2a 2a 20 54  low page.**.** T
2ecd0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
2ece0 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
2ecf0 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
2ed00 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ly..*/.int sqlit
2ed10 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 6e 66  e3BtreeCursorInf
2ed20 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  o(BtCursor *pCur
2ed30 2c 20 69 6e 74 20 2a 61 52 65 73 75 6c 74 2c 20  , int *aResult, 
2ed40 69 6e 74 20 75 70 43 6e 74 29 7b 0a 20 20 69 6e  int upCnt){.  in
2ed50 74 20 63 6e 74 2c 20 69 64 78 3b 0a 20 20 4d 65  t cnt, idx;.  Me
2ed60 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
2ed70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 42 74  Cur->pPage;.  Bt
2ed80 43 75 72 73 6f 72 20 74 6d 70 43 75 72 3b 0a 0a  Cursor tmpCur;..
2ed90 20 20 69 6e 74 20 72 63 20 3d 20 72 65 73 74 6f    int rc = resto
2eda0 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50  reOrClearCursorP
2edb0 6f 73 69 74 69 6f 6e 28 70 43 75 72 2c 20 31 29  osition(pCur, 1)
2edc0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
2edd0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
2ede0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 61  urn rc;.  }..  a
2edf0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
2ee00 49 6e 69 74 20 29 3b 0a 20 20 67 65 74 54 65 6d  Init );.  getTem
2ee10 70 43 75 72 73 6f 72 28 70 43 75 72 2c 20 26 74  pCursor(pCur, &t
2ee20 6d 70 43 75 72 29 3b 0a 20 20 77 68 69 6c 65 28  mpCur);.  while(
2ee30 20 75 70 43 6e 74 2d 2d 20 29 7b 0a 20 20 20 20   upCnt-- ){.    
2ee40 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 26 74 6d  moveToParent(&tm
2ee50 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 70 50 61  pCur);.  }.  pPa
2ee60 67 65 20 3d 20 74 6d 70 43 75 72 2e 70 50 61 67  ge = tmpCur.pPag
2ee70 65 3b 0a 20 20 61 52 65 73 75 6c 74 5b 30 5d 20  e;.  aResult[0] 
2ee80 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70  = sqlite3pager_p
2ee90 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d  agenumber(pPage-
2eea0 3e 61 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72  >aData);.  asser
2eeb0 74 28 20 61 52 65 73 75 6c 74 5b 30 5d 3d 3d 70  t( aResult[0]==p
2eec0 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20  Page->pgno );.  
2eed0 61 52 65 73 75 6c 74 5b 31 5d 20 3d 20 74 6d 70  aResult[1] = tmp
2eee0 43 75 72 2e 69 64 78 3b 0a 20 20 61 52 65 73 75  Cur.idx;.  aResu
2eef0 6c 74 5b 32 5d 20 3d 20 70 50 61 67 65 2d 3e 6e  lt[2] = pPage->n
2ef00 43 65 6c 6c 3b 0a 20 20 69 66 28 20 74 6d 70 43  Cell;.  if( tmpC
2ef10 75 72 2e 69 64 78 3e 3d 30 20 26 26 20 74 6d 70  ur.idx>=0 && tmp
2ef20 43 75 72 2e 69 64 78 3c 70 50 61 67 65 2d 3e 6e  Cur.idx<pPage->n
2ef30 43 65 6c 6c 20 29 7b 0a 20 20 20 20 67 65 74 43  Cell ){.    getC
2ef40 65 6c 6c 49 6e 66 6f 28 26 74 6d 70 43 75 72 29  ellInfo(&tmpCur)
2ef50 3b 0a 20 20 20 20 61 52 65 73 75 6c 74 5b 33 5d  ;.    aResult[3]
2ef60 20 3d 20 74 6d 70 43 75 72 2e 69 6e 66 6f 2e 6e   = tmpCur.info.n
2ef70 53 69 7a 65 3b 0a 20 20 20 20 61 52 65 73 75 6c  Size;.    aResul
2ef80 74 5b 36 5d 20 3d 20 74 6d 70 43 75 72 2e 69 6e  t[6] = tmpCur.in
2ef90 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20 61 52  fo.nData;.    aR
2efa0 65 73 75 6c 74 5b 37 5d 20 3d 20 74 6d 70 43 75  esult[7] = tmpCu
2efb0 72 2e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a  r.info.nHeader;.
2efc0 20 20 20 20 61 52 65 73 75 6c 74 5b 38 5d 20 3d      aResult[8] =
2efd0 20 74 6d 70 43 75 72 2e 69 6e 66 6f 2e 6e 4c 6f   tmpCur.info.nLo
2efe0 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  cal;.  }else{.  
2eff0 20 20 61 52 65 73 75 6c 74 5b 33 5d 20 3d 20 30    aResult[3] = 0
2f000 3b 0a 20 20 20 20 61 52 65 73 75 6c 74 5b 36 5d  ;.    aResult[6]
2f010 20 3d 20 30 3b 0a 20 20 20 20 61 52 65 73 75 6c   = 0;.    aResul
2f020 74 5b 37 5d 20 3d 20 30 3b 0a 20 20 20 20 61 52  t[7] = 0;.    aR
2f030 65 73 75 6c 74 5b 38 5d 20 3d 20 30 3b 0a 20 20  esult[8] = 0;.  
2f040 7d 0a 20 20 61 52 65 73 75 6c 74 5b 34 5d 20 3d  }.  aResult[4] =
2f050 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3b 0a 20   pPage->nFree;. 
2f060 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 64 78 20   cnt = 0;.  idx 
2f070 3d 20 67 65 74 32 62 79 74 65 28 26 70 50 61 67  = get2byte(&pPag
2f080 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
2f090 68 64 72 4f 66 66 73 65 74 2b 31 5d 29 3b 0a 20  hdrOffset+1]);. 
2f0a0 20 77 68 69 6c 65 28 20 69 64 78 3e 30 20 26 26   while( idx>0 &&
2f0b0 20 69 64 78 3c 70 50 61 67 65 2d 3e 70 42 74 2d   idx<pPage->pBt-
2f0c0 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
2f0d0 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 69 64     cnt++;.    id
2f0e0 78 20 3d 20 67 65 74 32 62 79 74 65 28 26 70 50  x = get2byte(&pP
2f0f0 61 67 65 2d 3e 61 44 61 74 61 5b 69 64 78 5d 29  age->aData[idx])
2f100 3b 0a 20 20 7d 0a 20 20 61 52 65 73 75 6c 74 5b  ;.  }.  aResult[
2f110 35 5d 20 3d 20 63 6e 74 3b 0a 20 20 69 66 28 20  5] = cnt;.  if( 
2f120 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d  pPage->pParent==
2f130 30 20 7c 7c 20 69 73 52 6f 6f 74 50 61 67 65 28  0 || isRootPage(
2f140 70 50 61 67 65 29 20 29 7b 0a 20 20 20 20 61 52  pPage) ){.    aR
2f150 65 73 75 6c 74 5b 39 5d 20 3d 20 30 3b 0a 20 20  esult[9] = 0;.  
2f160 7d 65 6c 73 65 7b 0a 20 20 20 20 61 52 65 73 75  }else{.    aResu
2f170 6c 74 5b 39 5d 20 3d 20 70 50 61 67 65 2d 3e 70  lt[9] = pPage->p
2f180 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3b 0a 20 20  Parent->pgno;.  
2f190 7d 0a 20 20 69 66 28 20 74 6d 70 43 75 72 2e 69  }.  if( tmpCur.i
2f1a0 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b  nfo.iOverflow ){
2f1b0 0a 20 20 20 20 61 52 65 73 75 6c 74 5b 31 30 5d  .    aResult[10]
2f1c0 20 3d 20 67 65 74 34 62 79 74 65 28 26 74 6d 70   = get4byte(&tmp
2f1d0 43 75 72 2e 69 6e 66 6f 2e 70 43 65 6c 6c 5b 74  Cur.info.pCell[t
2f1e0 6d 70 43 75 72 2e 69 6e 66 6f 2e 69 4f 76 65 72  mpCur.info.iOver
2f1f0 66 6c 6f 77 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b  flow]);.  }else{
2f200 0a 20 20 20 20 61 52 65 73 75 6c 74 5b 31 30 5d  .    aResult[10]
2f210 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65   = 0;.  }.  rele
2f220 61 73 65 54 65 6d 70 43 75 72 73 6f 72 28 26 74  aseTempCursor(&t
2f230 6d 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e  mpCur);.  return
2f240 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2f250 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
2f260 72 6e 20 74 68 65 20 70 61 67 65 72 20 61 73 73  rn the pager ass
2f270 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 42  ociated with a B
2f280 54 72 65 65 2e 20 20 54 68 69 73 20 72 6f 75 74  Tree.  This rout
2f290 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 0a  ine is used for.
2f2a0 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64  ** testing and d
2f2b0 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
2f2c0 2f 0a 50 61 67 65 72 20 2a 73 71 6c 69 74 65 33  /.Pager *sqlite3
2f2d0 42 74 72 65 65 50 61 67 65 72 28 42 74 72 65 65  BtreePager(Btree
2f2e0 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70   *p){.  return p
2f2f0 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 7d  ->pBt->pPager;.}
2f300 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 73 74 72  ../*.** This str
2f310 75 63 74 75 72 65 20 69 73 20 70 61 73 73 65 64  ucture is passed
2f320 20 61 72 6f 75 6e 64 20 74 68 72 6f 75 67 68 20   around through 
2f330 61 6c 6c 20 74 68 65 20 73 61 6e 69 74 79 20 63  all the sanity c
2f340 68 65 63 6b 69 6e 67 20 72 6f 75 74 69 6e 65 73  hecking routines
2f350 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .** in order to 
2f360 6b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 73 6f  keep track of so
2f370 6d 65 20 67 6c 6f 62 61 6c 20 73 74 61 74 65 20  me global state 
2f380 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
2f390 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 49  typedef struct I
2f3a0 6e 74 65 67 72 69 74 79 43 6b 20 49 6e 74 65 67  ntegrityCk Integ
2f3b0 72 69 74 79 43 6b 3b 0a 73 74 72 75 63 74 20 49  rityCk;.struct I
2f3c0 6e 74 65 67 72 69 74 79 43 6b 20 7b 0a 20 20 42  ntegrityCk {.  B
2f3d0 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
2f3e0 20 2f 2a 20 54 68 65 20 74 72 65 65 20 62 65 69   /* The tree bei
2f3f0 6e 67 20 63 68 65 63 6b 65 64 20 6f 75 74 20 2a  ng checked out *
2f400 2f 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  /.  Pager *pPage
2f410 72 3b 20 20 20 20 2f 2a 20 54 68 65 20 61 73 73  r;    /* The ass
2f420 6f 63 69 61 74 65 64 20 70 61 67 65 72 2e 20 20  ociated pager.  
2f430 41 6c 73 6f 20 61 63 63 65 73 73 69 62 6c 65 20  Also accessible 
2f440 62 79 20 70 42 74 2d 3e 70 50 61 67 65 72 20 2a  by pBt->pPager *
2f450 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20  /.  int nPage;  
2f460 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2f470 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
2f480 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
2f490 74 20 2a 61 6e 52 65 66 3b 20 20 20 20 20 20 20  t *anRef;       
2f4a0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d  /* Number of tim
2f4b0 65 73 20 65 61 63 68 20 70 61 67 65 20 69 73 20  es each page is 
2f4c0 72 65 66 65 72 65 6e 63 65 64 20 2a 2f 0a 20 20  referenced */.  
2f4d0 69 6e 74 20 6d 78 45 72 72 3b 20 20 20 20 20 20  int mxErr;      
2f4e0 20 20 2f 2a 20 53 74 6f 70 20 61 63 63 75 6d 75    /* Stop accumu
2f4f0 6c 61 74 69 6e 67 20 65 72 72 6f 72 73 20 77 68  lating errors wh
2f500 65 6e 20 74 68 69 73 20 72 65 61 63 68 65 73 20  en this reaches 
2f510 7a 65 72 6f 20 2a 2f 0a 20 20 63 68 61 72 20 2a  zero */.  char *
2f520 7a 45 72 72 4d 73 67 3b 20 20 20 20 2f 2a 20 41  zErrMsg;    /* A
2f530 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  n error message.
2f540 20 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 65 72 72    NULL if no err
2f550 6f 72 73 20 73 65 65 6e 2e 20 2a 2f 0a 20 20 69  ors seen. */.  i
2f560 6e 74 20 6e 45 72 72 3b 20 20 20 20 20 20 20 20  nt nErr;        
2f570 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 65   /* Number of me
2f580 73 73 61 67 65 73 20 77 72 69 74 74 65 6e 20 74  ssages written t
2f590 6f 20 7a 45 72 72 4d 73 67 20 73 6f 20 66 61 72  o zErrMsg so far
2f5a0 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66 20   */.};..#ifndef 
2f5b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45  SQLITE_OMIT_INTE
2f5c0 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a  GRITY_CHECK./*.*
2f5d0 2a 20 41 70 70 65 6e 64 20 61 20 6d 65 73 73 61  * Append a messa
2f5e0 67 65 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20  ge to the error 
2f5f0 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67 2e 0a  message string..
2f600 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
2f610 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 0a 20  heckAppendMsg(. 
2f620 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43   IntegrityCk *pC
2f630 68 65 63 6b 2c 0a 20 20 63 68 61 72 20 2a 7a 4d  heck,.  char *zM
2f640 73 67 31 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  sg1,.  const cha
2f650 72 20 2a 7a 46 6f 72 6d 61 74 2c 0a 20 20 2e 2e  r *zFormat,.  ..
2f660 2e 0a 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
2f670 70 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 32  p;.  char *zMsg2
2f680 3b 0a 20 20 69 66 28 20 21 70 43 68 65 63 6b 2d  ;.  if( !pCheck-
2f690 3e 6d 78 45 72 72 20 29 20 72 65 74 75 72 6e 3b  >mxErr ) return;
2f6a0 0a 20 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72  .  pCheck->mxErr
2f6b0 2d 2d 3b 0a 20 20 70 43 68 65 63 6b 2d 3e 6e 45  --;.  pCheck->nE
2f6c0 72 72 2b 2b 3b 0a 20 20 76 61 5f 73 74 61 72 74  rr++;.  va_start
2f6d0 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
2f6e0 20 7a 4d 73 67 32 20 3d 20 73 71 6c 69 74 65 33   zMsg2 = sqlite3
2f6f0 56 4d 50 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74  VMPrintf(zFormat
2f700 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28  , ap);.  va_end(
2f710 61 70 29 3b 0a 20 20 69 66 28 20 7a 4d 73 67 31  ap);.  if( zMsg1
2f720 3d 3d 30 20 29 20 7a 4d 73 67 31 20 3d 20 22 22  ==0 ) zMsg1 = ""
2f730 3b 0a 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e  ;.  if( pCheck->
2f740 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 63  zErrMsg ){.    c
2f750 68 61 72 20 2a 7a 4f 6c 64 20 3d 20 70 43 68 65  har *zOld = pChe
2f760 63 6b 2d 3e 7a 45 72 72 4d 73 67 3b 0a 20 20 20  ck->zErrMsg;.   
2f770 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67   pCheck->zErrMsg
2f780 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
2f790 33 53 65 74 53 74 72 69 6e 67 28 26 70 43 68 65  3SetString(&pChe
2f7a0 63 6b 2d 3e 7a 45 72 72 4d 73 67 2c 20 7a 4f 6c  ck->zErrMsg, zOl
2f7b0 64 2c 20 22 5c 6e 22 2c 20 7a 4d 73 67 31 2c 20  d, "\n", zMsg1, 
2f7c0 7a 4d 73 67 32 2c 20 28 63 68 61 72 2a 29 30 29  zMsg2, (char*)0)
2f7d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
2f7e0 28 7a 4f 6c 64 29 3b 0a 20 20 7d 65 6c 73 65 7b  (zOld);.  }else{
2f7f0 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53  .    sqlite3SetS
2f800 74 72 69 6e 67 28 26 70 43 68 65 63 6b 2d 3e 7a  tring(&pCheck->z
2f810 45 72 72 4d 73 67 2c 20 7a 4d 73 67 31 2c 20 7a  ErrMsg, zMsg1, z
2f820 4d 73 67 32 2c 20 28 63 68 61 72 2a 29 30 29 3b  Msg2, (char*)0);
2f830 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
2f840 65 28 7a 4d 73 67 32 29 3b 0a 7d 0a 23 65 6e 64  e(zMsg2);.}.#end
2f850 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
2f860 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
2f870 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  K */..#ifndef SQ
2f880 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52  LITE_OMIT_INTEGR
2f890 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20  ITY_CHECK./*.** 
2f8a0 41 64 64 20 31 20 74 6f 20 74 68 65 20 72 65 66  Add 1 to the ref
2f8b0 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
2f8c0 20 70 61 67 65 20 69 50 61 67 65 2e 20 20 49 66   page iPage.  If
2f8d0 20 74 68 69 73 20 69 73 20 74 68 65 20 73 65 63   this is the sec
2f8e0 6f 6e 64 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  ond.** reference
2f8f0 20 74 6f 20 74 68 65 20 70 61 67 65 2c 20 61 64   to the page, ad
2f900 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  d an error messa
2f910 67 65 20 74 6f 20 70 43 68 65 63 6b 2d 3e 7a 45  ge to pCheck->zE
2f920 72 72 4d 73 67 2e 0a 2a 2a 20 52 65 74 75 72 6e  rrMsg..** Return
2f930 20 31 20 69 66 20 74 68 65 72 65 20 61 72 65 20   1 if there are 
2f940 32 20 6f 72 65 20 6d 6f 72 65 20 72 65 66 65 72  2 ore more refer
2f950 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
2f960 65 20 61 6e 64 20 30 20 69 66 0a 2a 2a 20 69 66  e and 0 if.** if
2f970 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
2f980 73 74 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  st reference to 
2f990 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
2f9a0 41 6c 73 6f 20 63 68 65 63 6b 20 74 68 61 74 20  Also check that 
2f9b0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
2f9c0 69 73 20 69 6e 20 62 6f 75 6e 64 73 2e 0a 2a 2f  is in bounds..*/
2f9d0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63  .static int chec
2f9e0 6b 52 65 66 28 49 6e 74 65 67 72 69 74 79 43 6b  kRef(IntegrityCk
2f9f0 20 2a 70 43 68 65 63 6b 2c 20 69 6e 74 20 69 50   *pCheck, int iP
2fa00 61 67 65 2c 20 63 68 61 72 20 2a 7a 43 6f 6e 74  age, char *zCont
2fa10 65 78 74 29 7b 0a 20 20 69 66 28 20 69 50 61 67  ext){.  if( iPag
2fa20 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  e==0 ) return 1;
2fa30 0a 20 20 69 66 28 20 69 50 61 67 65 3e 70 43 68  .  if( iPage>pCh
2fa40 65 63 6b 2d 3e 6e 50 61 67 65 20 7c 7c 20 69 50  eck->nPage || iP
2fa50 61 67 65 3c 30 20 29 7b 0a 20 20 20 20 63 68 65  age<0 ){.    che
2fa60 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
2fa70 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 69  ck, zContext, "i
2fa80 6e 76 61 6c 69 64 20 70 61 67 65 20 6e 75 6d 62  nvalid page numb
2fa90 65 72 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a  er %d", iPage);.
2faa0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
2fab0 7d 0a 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e  }.  if( pCheck->
2fac0 61 6e 52 65 66 5b 69 50 61 67 65 5d 3d 3d 31 20  anRef[iPage]==1 
2fad0 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65  ){.    checkAppe
2fae0 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
2faf0 6f 6e 74 65 78 74 2c 20 22 32 6e 64 20 72 65 66  ontext, "2nd ref
2fb00 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 25  erence to page %
2fb10 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20  d", iPage);.    
2fb20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
2fb30 72 65 74 75 72 6e 20 20 28 70 43 68 65 63 6b 2d  return  (pCheck-
2fb40 3e 61 6e 52 65 66 5b 69 50 61 67 65 5d 2b 2b 29  >anRef[iPage]++)
2fb50 3e 31 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  >1;.}..#ifndef S
2fb60 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2fb70 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 43 68 65 63  ACUUM./*.** Chec
2fb80 6b 20 74 68 61 74 20 74 68 65 20 65 6e 74 72 79  k that the entry
2fb90 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   in the pointer-
2fba0 6d 61 70 20 66 6f 72 20 70 61 67 65 20 69 43 68  map for page iCh
2fbb0 69 6c 64 20 6d 61 70 73 20 74 6f 20 0a 2a 2a 20  ild maps to .** 
2fbc0 70 61 67 65 20 69 50 61 72 65 6e 74 2c 20 70 6f  page iParent, po
2fbd0 69 6e 74 65 72 20 74 79 70 65 20 70 74 72 54 79  inter type ptrTy
2fbe0 70 65 2e 20 49 66 20 6e 6f 74 2c 20 61 70 70 65  pe. If not, appe
2fbf0 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  nd an error mess
2fc00 61 67 65 0a 2a 2a 20 74 6f 20 70 43 68 65 63 6b  age.** to pCheck
2fc10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2fc20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 0a 20 20   checkPtrmap(.  
2fc30 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68  IntegrityCk *pCh
2fc40 65 63 6b 2c 20 20 20 2f 2a 20 49 6e 74 65 67 72  eck,   /* Integr
2fc50 69 74 79 20 63 68 65 63 6b 20 63 6f 6e 74 65 78  ity check contex
2fc60 74 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69  t */.  Pgno iChi
2fc70 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ld,           /*
2fc80 20 43 68 69 6c 64 20 70 61 67 65 20 6e 75 6d 62   Child page numb
2fc90 65 72 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65  er */.  u8 eType
2fca0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2fcb0 2a 20 45 78 70 65 63 74 65 64 20 70 6f 69 6e 74  * Expected point
2fcc0 65 72 20 6d 61 70 20 74 79 70 65 20 2a 2f 0a 20  er map type */. 
2fcd0 20 50 67 6e 6f 20 69 50 61 72 65 6e 74 2c 20 20   Pgno iParent,  
2fce0 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63          /* Expec
2fcf0 74 65 64 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  ted pointer map 
2fd00 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62  parent page numb
2fd10 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43  er */.  char *zC
2fd20 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20 20 2f  ontext         /
2fd30 2a 20 43 6f 6e 74 65 78 74 20 64 65 73 63 72 69  * Context descri
2fd40 70 74 69 6f 6e 20 28 75 73 65 64 20 66 6f 72 20  ption (used for 
2fd50 65 72 72 6f 72 20 6d 73 67 29 20 2a 2f 0a 29 7b  error msg) */.){
2fd60 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 38 20  .  int rc;.  u8 
2fd70 65 50 74 72 6d 61 70 54 79 70 65 3b 0a 20 20 50  ePtrmapType;.  P
2fd80 67 6e 6f 20 69 50 74 72 6d 61 70 50 61 72 65 6e  gno iPtrmapParen
2fd90 74 3b 0a 0a 20 20 72 63 20 3d 20 70 74 72 6d 61  t;..  rc = ptrma
2fda0 70 47 65 74 28 70 43 68 65 63 6b 2d 3e 70 42 74  pGet(pCheck->pBt
2fdb0 2c 20 69 43 68 69 6c 64 2c 20 26 65 50 74 72 6d  , iChild, &ePtrm
2fdc0 61 70 54 79 70 65 2c 20 26 69 50 74 72 6d 61 70  apType, &iPtrmap
2fdd0 50 61 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 72  Parent);.  if( r
2fde0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2fdf0 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
2fe00 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74  sg(pCheck, zCont
2fe10 65 78 74 2c 20 22 46 61 69 6c 65 64 20 74 6f 20  ext, "Failed to 
2fe20 72 65 61 64 20 70 74 72 6d 61 70 20 6b 65 79 3d  read ptrmap key=
2fe30 25 64 22 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20  %d", iChild);.  
2fe40 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
2fe50 20 69 66 28 20 65 50 74 72 6d 61 70 54 79 70 65   if( ePtrmapType
2fe60 21 3d 65 54 79 70 65 20 7c 7c 20 69 50 74 72 6d  !=eType || iPtrm
2fe70 61 70 50 61 72 65 6e 74 21 3d 69 50 61 72 65 6e  apParent!=iParen
2fe80 74 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70  t ){.    checkAp
2fe90 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
2fea0 7a 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20 20  zContext, .     
2feb0 20 22 42 61 64 20 70 74 72 20 6d 61 70 20 65 6e   "Bad ptr map en
2fec0 74 72 79 20 6b 65 79 3d 25 64 20 65 78 70 65 63  try key=%d expec
2fed0 74 65 64 3d 28 25 64 2c 25 64 29 20 67 6f 74 3d  ted=(%d,%d) got=
2fee0 28 25 64 2c 25 64 29 22 2c 20 0a 20 20 20 20 20  (%d,%d)", .     
2fef0 20 69 43 68 69 6c 64 2c 20 65 54 79 70 65 2c 20   iChild, eType, 
2ff00 69 50 61 72 65 6e 74 2c 20 65 50 74 72 6d 61 70  iParent, ePtrmap
2ff10 54 79 70 65 2c 20 69 50 74 72 6d 61 70 50 61 72  Type, iPtrmapPar
2ff20 65 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  ent);.  }.}.#end
2ff30 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  if../*.** Check 
2ff40 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66  the integrity of
2ff50 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 6f 72   the freelist or
2ff60 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   of an overflow 
2ff70 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2a 20 56 65  page list..** Ve
2ff80 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6e 75  rify that the nu
2ff90 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e  mber of pages on
2ffa0 20 74 68 65 20 6c 69 73 74 20 69 73 20 4e 2e 0a   the list is N..
2ffb0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
2ffc0 68 65 63 6b 4c 69 73 74 28 0a 20 20 49 6e 74 65  heckList(.  Inte
2ffd0 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c  grityCk *pCheck,
2ffe0 20 20 2f 2a 20 49 6e 74 65 67 72 69 74 79 20 63    /* Integrity c
2fff0 68 65 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  hecking context 
30000 2a 2f 0a 20 20 69 6e 74 20 69 73 46 72 65 65 4c  */.  int isFreeL
30010 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 72  ist,       /* Tr
30020 75 65 20 66 6f 72 20 61 20 66 72 65 65 6c 69 73  ue for a freelis
30030 74 2e 20 20 46 61 6c 73 65 20 66 6f 72 20 6f 76  t.  False for ov
30040 65 72 66 6c 6f 77 20 70 61 67 65 20 6c 69 73 74  erflow page list
30050 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 67 65 2c   */.  int iPage,
30060 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
30070 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 66  age number for f
30080 69 72 73 74 20 70 61 67 65 20 69 6e 20 74 68 65  irst page in the
30090 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 4e   list */.  int N
300a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
300b0 20 2f 2a 20 45 78 70 65 63 74 65 64 20 6e 75 6d   /* Expected num
300c0 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
300d0 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 63 68  the list */.  ch
300e0 61 72 20 2a 7a 43 6f 6e 74 65 78 74 20 20 20 20  ar *zContext    
300f0 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66      /* Context f
30100 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  or error message
30110 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
30120 0a 20 20 69 6e 74 20 65 78 70 65 63 74 65 64 20  .  int expected 
30130 3d 20 4e 3b 0a 20 20 69 6e 74 20 69 46 69 72 73  = N;.  int iFirs
30140 74 20 3d 20 69 50 61 67 65 3b 0a 20 20 77 68 69  t = iPage;.  whi
30150 6c 65 28 20 4e 2d 2d 20 3e 20 30 20 26 26 20 70  le( N-- > 0 && p
30160 43 68 65 63 6b 2d 3e 6d 78 45 72 72 20 29 7b 0a  Check->mxErr ){.
30170 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
30180 72 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20 69 66  r *pOvfl;.    if
30190 28 20 69 50 61 67 65 3c 31 20 29 7b 0a 20 20 20  ( iPage<1 ){.   
301a0 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
301b0 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65  g(pCheck, zConte
301c0 78 74 2c 0a 20 20 20 20 20 20 20 20 20 22 25 64  xt,.         "%d
301d0 20 6f 66 20 25 64 20 70 61 67 65 73 20 6d 69 73   of %d pages mis
301e0 73 69 6e 67 20 66 72 6f 6d 20 6f 76 65 72 66 6c  sing from overfl
301f0 6f 77 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67  ow list starting
30200 20 61 74 20 25 64 22 2c 0a 20 20 20 20 20 20 20   at %d",.       
30210 20 20 20 4e 2b 31 2c 20 65 78 70 65 63 74 65 64     N+1, expected
30220 2c 20 69 46 69 72 73 74 29 3b 0a 20 20 20 20 20  , iFirst);.     
30230 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
30240 20 20 69 66 28 20 63 68 65 63 6b 52 65 66 28 70    if( checkRef(p
30250 43 68 65 63 6b 2c 20 69 50 61 67 65 2c 20 7a 43  Check, iPage, zC
30260 6f 6e 74 65 78 74 29 20 29 20 62 72 65 61 6b 3b  ontext) ) break;
30270 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
30280 70 61 67 65 72 5f 67 65 74 28 70 43 68 65 63 6b  pager_get(pCheck
30290 2d 3e 70 50 61 67 65 72 2c 20 28 50 67 6e 6f 29  ->pPager, (Pgno)
302a0 69 50 61 67 65 2c 20 28 76 6f 69 64 2a 2a 29 26  iPage, (void**)&
302b0 70 4f 76 66 6c 29 20 29 7b 0a 20 20 20 20 20 20  pOvfl) ){.      
302c0 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
302d0 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c  Check, zContext,
302e0 20 22 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20   "failed to get 
302f0 70 61 67 65 20 25 64 22 2c 20 69 50 61 67 65 29  page %d", iPage)
30300 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
30310 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 46     }.    if( isF
30320 72 65 65 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  reeList ){.     
30330 20 69 6e 74 20 6e 20 3d 20 67 65 74 34 62 79 74   int n = get4byt
30340 65 28 26 70 4f 76 66 6c 5b 34 5d 29 3b 0a 23 69  e(&pOvfl[4]);.#i
30350 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
30360 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
30370 20 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 70     if( pCheck->p
30380 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
30390 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 50  {.        checkP
303a0 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 50  trmap(pCheck, iP
303b0 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45  age, PTRMAP_FREE
303c0 50 41 47 45 2c 20 30 2c 20 7a 43 6f 6e 74 65 78  PAGE, 0, zContex
303d0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  t);.      }.#end
303e0 69 66 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 70  if.      if( n>p
303f0 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 75 73 61 62  Check->pBt->usab
30400 6c 65 53 69 7a 65 2f 34 2d 38 20 29 7b 0a 20 20  leSize/4-8 ){.  
30410 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
30420 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
30430 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20  ntext,.         
30440 20 20 22 66 72 65 65 6c 69 73 74 20 6c 65 61 66    "freelist leaf
30450 20 63 6f 75 6e 74 20 74 6f 6f 20 62 69 67 20 6f   count too big o
30460 6e 20 70 61 67 65 20 25 64 22 2c 20 69 50 61 67  n page %d", iPag
30470 65 29 3b 0a 20 20 20 20 20 20 20 20 4e 2d 2d 3b  e);.        N--;
30480 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
30490 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
304a0 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <n; i++){.      
304b0 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61      Pgno iFreePa
304c0 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ge = get4byte(&p
304d0 4f 76 66 6c 5b 38 2b 69 2a 34 5d 29 3b 0a 23 69  Ovfl[8+i*4]);.#i
304e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
304f0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
30500 20 20 20 20 20 20 20 69 66 28 20 70 43 68 65 63         if( pChec
30510 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  k->pBt->autoVacu
30520 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  um ){.          
30530 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43    checkPtrmap(pC
30540 68 65 63 6b 2c 20 69 46 72 65 65 50 61 67 65 2c  heck, iFreePage,
30550 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45   PTRMAP_FREEPAGE
30560 2c 20 30 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a  , 0, zContext);.
30570 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
30580 69 66 0a 20 20 20 20 20 20 20 20 20 20 63 68 65  if.          che
30590 63 6b 52 65 66 28 70 43 68 65 63 6b 2c 20 69 46  ckRef(pCheck, iF
305a0 72 65 65 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78  reePage, zContex
305b0 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
305c0 20 20 20 20 20 20 4e 20 2d 3d 20 6e 3b 0a 20 20        N -= n;.  
305d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e      }.    }.#ifn
305e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
305f0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 65  AUTOVACUUM.    e
30600 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  lse{.      /* If
30610 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 73   this database s
30620 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63  upports auto-vac
30630 75 75 6d 20 61 6e 64 20 69 50 61 67 65 20 69 73  uum and iPage is
30640 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a 20 20   not the last.  
30650 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74      ** page in t
30660 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73  his overflow lis
30670 74 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  t, check that th
30680 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
30690 74 72 79 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a  try for.      **
306a0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70   the following p
306b0 61 67 65 20 6d 61 74 63 68 65 73 20 69 50 61 67  age matches iPag
306c0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
306d0 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 70 42    if( pCheck->pB
306e0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
306f0 20 4e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20   N>0 ){.        
30700 69 20 3d 20 67 65 74 34 62 79 74 65 28 70 4f 76  i = get4byte(pOv
30710 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 63 68 65  fl);.        che
30720 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c  ckPtrmap(pCheck,
30730 20 69 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46   i, PTRMAP_OVERF
30740 4c 4f 57 32 2c 20 69 50 61 67 65 2c 20 7a 43 6f  LOW2, iPage, zCo
30750 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a  ntext);.      }.
30760 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
30770 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74   iPage = get4byt
30780 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 73 71  e(pOvfl);.    sq
30790 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
307a0 28 70 4f 76 66 6c 29 3b 0a 20 20 7d 0a 7d 0a 23  (pOvfl);.  }.}.#
307b0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
307c0 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43  OMIT_INTEGRITY_C
307d0 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  HECK */..#ifndef
307e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54   SQLITE_OMIT_INT
307f0 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a  EGRITY_CHECK./*.
30800 2a 2a 20 44 6f 20 76 61 72 69 6f 75 73 20 73 61  ** Do various sa
30810 6e 69 74 79 20 63 68 65 63 6b 73 20 6f 6e 20 61  nity checks on a
30820 20 73 69 6e 67 6c 65 20 70 61 67 65 20 6f 66 20   single page of 
30830 61 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 0a  a tree.  Return.
30840 2a 2a 20 74 68 65 20 74 72 65 65 20 64 65 70 74  ** the tree dept
30850 68 2e 20 20 52 6f 6f 74 20 70 61 67 65 73 20 72  h.  Root pages r
30860 65 74 75 72 6e 20 30 2e 20 20 50 61 72 65 6e 74  eturn 0.  Parent
30870 73 20 6f 66 20 72 6f 6f 74 20 70 61 67 65 73 0a  s of root pages.
30880 2a 2a 20 72 65 74 75 72 6e 20 31 2c 20 61 6e 64  ** return 1, and
30890 20 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a 20 0a 2a   so forth..** .*
308a0 2a 20 54 68 65 73 65 20 63 68 65 63 6b 73 20 61  * These checks a
308b0 72 65 20 64 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20  re done:.**.**  
308c0 20 20 20 20 31 2e 20 20 4d 61 6b 65 20 73 75 72      1.  Make sur
308d0 65 20 74 68 61 74 20 63 65 6c 6c 73 20 61 6e 64  e that cells and
308e0 20 66 72 65 65 62 6c 6f 63 6b 73 20 64 6f 20 6e   freeblocks do n
308f0 6f 74 20 6f 76 65 72 6c 61 70 0a 2a 2a 20 20 20  ot overlap.**   
30900 20 20 20 20 20 20 20 62 75 74 20 63 6f 6d 62 69         but combi
30910 6e 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79  ne to completely
30920 20 63 6f 76 65 72 20 74 68 65 20 70 61 67 65 2e   cover the page.
30930 0a 2a 2a 20 20 4e 4f 20 20 32 2e 20 20 4d 61 6b  .**  NO  2.  Mak
30940 65 20 73 75 72 65 20 63 65 6c 6c 20 6b 65 79 73  e sure cell keys
30950 20 61 72 65 20 69 6e 20 6f 72 64 65 72 2e 0a 2a   are in order..*
30960 2a 20 20 4e 4f 20 20 33 2e 20 20 4d 61 6b 65 20  *  NO  3.  Make 
30970 73 75 72 65 20 6e 6f 20 6b 65 79 20 69 73 20 6c  sure no key is l
30980 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
30990 6c 20 74 6f 20 7a 4c 6f 77 65 72 42 6f 75 6e 64  l to zLowerBound
309a0 2e 0a 2a 2a 20 20 4e 4f 20 20 34 2e 20 20 4d 61  ..**  NO  4.  Ma
309b0 6b 65 20 73 75 72 65 20 6e 6f 20 6b 65 79 20 69  ke sure no key i
309c0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
309d0 72 20 65 71 75 61 6c 20 74 6f 20 7a 55 70 70 65  r equal to zUppe
309e0 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20 20 20 20 20  rBound..**      
309f0 35 2e 20 20 43 68 65 63 6b 20 74 68 65 20 69 6e  5.  Check the in
30a00 74 65 67 72 69 74 79 20 6f 66 20 6f 76 65 72 66  tegrity of overf
30a10 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 20 20 20  low pages..**   
30a20 20 20 20 36 2e 20 20 52 65 63 75 72 73 69 76 65     6.  Recursive
30a30 6c 79 20 63 61 6c 6c 20 63 68 65 63 6b 54 72 65  ly call checkTre
30a40 65 50 61 67 65 20 6f 6e 20 61 6c 6c 20 63 68 69  ePage on all chi
30a50 6c 64 72 65 6e 2e 0a 2a 2a 20 20 20 20 20 20 37  ldren..**      7
30a60 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20 74  .  Verify that t
30a70 68 65 20 64 65 70 74 68 20 6f 66 20 61 6c 6c 20  he depth of all 
30a80 63 68 69 6c 64 72 65 6e 20 69 73 20 74 68 65 20  children is the 
30a90 73 61 6d 65 2e 0a 2a 2a 20 20 20 20 20 20 38 2e  same..**      8.
30aa0 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 69 73    Make sure this
30ab0 20 70 61 67 65 20 69 73 20 61 74 20 6c 65 61 73   page is at leas
30ac0 74 20 33 33 25 20 66 75 6c 6c 20 6f 72 20 65 6c  t 33% full or el
30ad0 73 65 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20  se it is.**     
30ae0 20 20 20 20 20 74 68 65 20 72 6f 6f 74 20 6f 66       the root of
30af0 20 74 68 65 20 74 72 65 65 2e 0a 2a 2f 0a 73 74   the tree..*/.st
30b00 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 54 72  atic int checkTr
30b10 65 65 50 61 67 65 28 0a 20 20 49 6e 74 65 67 72  eePage(.  Integr
30b20 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20  ityCk *pCheck,  
30b30 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72 20 74  /* Context for t
30b40 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 20  he sanity check 
30b50 2a 2f 0a 20 20 69 6e 74 20 69 50 61 67 65 2c 20  */.  int iPage, 
30b60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
30b70 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
30b80 20 70 61 67 65 20 74 6f 20 63 68 65 63 6b 20 2a   page to check *
30b90 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
30ba0 72 65 6e 74 2c 20 20 20 20 20 2f 2a 20 50 61 72  rent,     /* Par
30bb0 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 63 68  ent page */.  ch
30bc0 61 72 20 2a 7a 50 61 72 65 6e 74 43 6f 6e 74 65  ar *zParentConte
30bd0 78 74 20 20 2f 2a 20 50 61 72 65 6e 74 20 63 6f  xt  /* Parent co
30be0 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 4d 65  ntext */.){.  Me
30bf0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
30c00 69 6e 74 20 69 2c 20 72 63 2c 20 64 65 70 74 68  int i, rc, depth
30c10 2c 20 64 32 2c 20 70 67 6e 6f 2c 20 63 6e 74 3b  , d2, pgno, cnt;
30c20 0a 20 20 69 6e 74 20 68 64 72 2c 20 63 65 6c 6c  .  int hdr, cell
30c30 53 74 61 72 74 3b 0a 20 20 69 6e 74 20 6e 43 65  Start;.  int nCe
30c40 6c 6c 3b 0a 20 20 75 38 20 2a 64 61 74 61 3b 0a  ll;.  u8 *data;.
30c50 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
30c60 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
30c70 65 3b 0a 20 20 63 68 61 72 20 7a 43 6f 6e 74 65  e;.  char zConte
30c80 78 74 5b 31 30 30 5d 3b 0a 20 20 63 68 61 72 20  xt[100];.  char 
30c90 2a 68 69 74 3b 0a 0a 20 20 73 70 72 69 6e 74 66  *hit;..  sprintf
30ca0 28 7a 43 6f 6e 74 65 78 74 2c 20 22 50 61 67 65  (zContext, "Page
30cb0 20 25 64 3a 20 22 2c 20 69 50 61 67 65 29 3b 0a   %d: ", iPage);.
30cc0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
30cd0 20 74 68 65 20 70 61 67 65 20 65 78 69 73 74 73   the page exists
30ce0 0a 20 20 2a 2f 0a 20 20 70 42 74 20 3d 20 70 43  .  */.  pBt = pC
30cf0 68 65 63 6b 2d 3e 70 42 74 3b 0a 20 20 75 73 61  heck->pBt;.  usa
30d00 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  bleSize = pBt->u
30d10 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69 66 28  sableSize;.  if(
30d20 20 69 50 61 67 65 3d 3d 30 20 29 20 72 65 74 75   iPage==0 ) retu
30d30 72 6e 20 30 3b 0a 20 20 69 66 28 20 63 68 65 63  rn 0;.  if( chec
30d40 6b 52 65 66 28 70 43 68 65 63 6b 2c 20 69 50 61  kRef(pCheck, iPa
30d50 67 65 2c 20 7a 50 61 72 65 6e 74 43 6f 6e 74 65  ge, zParentConte
30d60 78 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  xt) ) return 0;.
30d70 20 20 69 66 28 20 28 72 63 20 3d 20 67 65 74 50    if( (rc = getP
30d80 61 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69  age(pBt, (Pgno)i
30d90 50 61 67 65 2c 20 26 70 50 61 67 65 29 29 21 3d  Page, &pPage))!=
30da0 30 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70  0 ){.    checkAp
30db0 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
30dc0 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20  zContext,.      
30dd0 20 22 75 6e 61 62 6c 65 20 74 6f 20 67 65 74 20   "unable to get 
30de0 74 68 65 20 70 61 67 65 2e 20 65 72 72 6f 72 20  the page. error 
30df0 63 6f 64 65 3d 25 64 22 2c 20 72 63 29 3b 0a 20  code=%d", rc);. 
30e00 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
30e10 0a 20 20 69 66 28 20 28 72 63 20 3d 20 69 6e 69  .  if( (rc = ini
30e20 74 50 61 67 65 28 70 50 61 67 65 2c 20 70 50 61  tPage(pPage, pPa
30e30 72 65 6e 74 29 29 21 3d 30 20 29 7b 0a 20 20 20  rent))!=0 ){.   
30e40 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
30e50 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
30e60 2c 20 22 69 6e 69 74 50 61 67 65 28 29 20 72 65  , "initPage() re
30e70 74 75 72 6e 73 20 65 72 72 6f 72 20 63 6f 64 65  turns error code
30e80 20 25 64 22 2c 20 72 63 29 3b 0a 20 20 20 20 72   %d", rc);.    r
30e90 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
30ea0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
30eb0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
30ec0 20 6f 75 74 20 61 6c 6c 20 74 68 65 20 63 65 6c   out all the cel
30ed0 6c 73 2e 0a 20 20 2a 2f 0a 20 20 64 65 70 74 68  ls..  */.  depth
30ee0 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
30ef0 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20   i<pPage->nCell 
30f00 26 26 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72  && pCheck->mxErr
30f10 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
30f20 70 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 73  pCell;.    int s
30f30 7a 3b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20  z;.    CellInfo 
30f40 69 6e 66 6f 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  info;..    /* Ch
30f50 65 63 6b 20 70 61 79 6c 6f 61 64 20 6f 76 65 72  eck payload over
30f60 66 6c 6f 77 20 70 61 67 65 73 0a 20 20 20 20 2a  flow pages.    *
30f70 2f 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 43  /.    sprintf(zC
30f80 6f 6e 74 65 78 74 2c 20 22 4f 6e 20 74 72 65 65  ontext, "On tree
30f90 20 70 61 67 65 20 25 64 20 63 65 6c 6c 20 25 64   page %d cell %d
30fa0 3a 20 22 2c 20 69 50 61 67 65 2c 20 69 29 3b 0a  : ", iPage, i);.
30fb0 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
30fc0 43 65 6c 6c 28 70 50 61 67 65 2c 69 29 3b 0a 20  Cell(pPage,i);. 
30fd0 20 20 20 70 61 72 73 65 43 65 6c 6c 50 74 72 28     parseCellPtr(
30fe0 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
30ff0 6e 66 6f 29 3b 0a 20 20 20 20 73 7a 20 3d 20 69  nfo);.    sz = i
31000 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20 69  nfo.nData;.    i
31010 66 28 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65  f( !pPage->intKe
31020 79 20 29 20 73 7a 20 2b 3d 20 69 6e 66 6f 2e 6e  y ) sz += info.n
31030 4b 65 79 3b 0a 20 20 20 20 69 66 28 20 73 7a 3e  Key;.    if( sz>
31040 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
31050 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d       int nPage =
31060 20 28 73 7a 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63   (sz - info.nLoc
31070 61 6c 20 2b 20 75 73 61 62 6c 65 53 69 7a 65 20  al + usableSize 
31080 2d 20 35 29 2f 28 75 73 61 62 6c 65 53 69 7a 65  - 5)/(usableSize
31090 20 2d 20 34 29 3b 0a 20 20 20 20 20 20 50 67 6e   - 4);.      Pgn
310a0 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 67 65 74  o pgnoOvfl = get
310b0 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
310c0 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 23  o.iOverflow]);.#
310d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
310e0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
310f0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
31100 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
31110 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70     checkPtrmap(p
31120 43 68 65 63 6b 2c 20 70 67 6e 6f 4f 76 66 6c 2c  Check, pgnoOvfl,
31130 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
31140 31 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65  1, iPage, zConte
31150 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  xt);.      }.#en
31160 64 69 66 0a 20 20 20 20 20 20 63 68 65 63 6b 4c  dif.      checkL
31170 69 73 74 28 70 43 68 65 63 6b 2c 20 30 2c 20 70  ist(pCheck, 0, p
31180 67 6e 6f 4f 76 66 6c 2c 20 6e 50 61 67 65 2c 20  gnoOvfl, nPage, 
31190 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d  zContext);.    }
311a0 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 73  ..    /* Check s
311b0 61 6e 69 74 79 20 6f 66 20 6c 65 66 74 20 63 68  anity of left ch
311c0 69 6c 64 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  ild page..    */
311d0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
311e0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70  >leaf ){.      p
311f0 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70  gno = get4byte(p
31200 43 65 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53  Cell);.#ifndef S
31210 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
31220 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20  ACUUM.      if( 
31230 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
31240 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  ){.        check
31250 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 70  Ptrmap(pCheck, p
31260 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
31270 45 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65  E, iPage, zConte
31280 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  xt);.      }.#en
31290 64 69 66 0a 20 20 20 20 20 20 64 32 20 3d 20 63  dif.      d2 = c
312a0 68 65 63 6b 54 72 65 65 50 61 67 65 28 70 43 68  heckTreePage(pCh
312b0 65 63 6b 2c 70 67 6e 6f 2c 70 50 61 67 65 2c 7a  eck,pgno,pPage,z
312c0 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  Context);.      
312d0 69 66 28 20 69 3e 30 20 26 26 20 64 32 21 3d 64  if( i>0 && d2!=d
312e0 65 70 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  epth ){.        
312f0 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
31300 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c  Check, zContext,
31310 20 22 43 68 69 6c 64 20 70 61 67 65 20 64 65 70   "Child page dep
31320 74 68 20 64 69 66 66 65 72 73 22 29 3b 0a 20 20  th differs");.  
31330 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 70 74      }.      dept
31340 68 20 3d 20 64 32 3b 0a 20 20 20 20 7d 0a 20 20  h = d2;.    }.  
31350 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  }.  if( !pPage->
31360 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f  leaf ){.    pgno
31370 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
31380 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
31390 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
313a0 20 20 20 20 73 70 72 69 6e 74 66 28 7a 43 6f 6e      sprintf(zCon
313b0 74 65 78 74 2c 20 22 4f 6e 20 70 61 67 65 20 25  text, "On page %
313c0 64 20 61 74 20 72 69 67 68 74 20 63 68 69 6c 64  d at right child
313d0 3a 20 22 2c 20 69 50 61 67 65 29 3b 0a 23 69 66  : ", iPage);.#if
313e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
313f0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
31400 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
31410 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 63 68 65  uum ){.      che
31420 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c  ckPtrmap(pCheck,
31430 20 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54   pgno, PTRMAP_BT
31440 52 45 45 2c 20 69 50 61 67 65 2c 20 30 29 3b 0a  REE, iPage, 0);.
31450 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
31460 20 63 68 65 63 6b 54 72 65 65 50 61 67 65 28 70   checkTreePage(p
31470 43 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 70 50 61  Check, pgno, pPa
31480 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20  ge, zContext);. 
31490 20 7d 0a 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20   }. .  /* Check 
314a0 66 6f 72 20 63 6f 6d 70 6c 65 74 65 20 63 6f 76  for complete cov
314b0 65 72 61 67 65 20 6f 66 20 74 68 65 20 70 61 67  erage of the pag
314c0 65 0a 20 20 2a 2f 0a 20 20 64 61 74 61 20 3d 20  e.  */.  data = 
314d0 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
314e0 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
314f0 4f 66 66 73 65 74 3b 0a 20 20 68 69 74 20 3d 20  Offset;.  hit = 
31500 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 75 73  sqliteMalloc( us
31510 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69 66  ableSize );.  if
31520 28 20 68 69 74 20 29 7b 0a 20 20 20 20 6d 65 6d  ( hit ){.    mem
31530 73 65 74 28 68 69 74 2c 20 31 2c 20 67 65 74 32  set(hit, 1, get2
31540 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
31550 5d 29 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d  ]));.    nCell =
31560 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
31570 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20 63 65 6c  hdr+3]);.    cel
31580 6c 53 74 61 72 74 20 3d 20 68 64 72 20 2b 20 31  lStart = hdr + 1
31590 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61  2 - 4*pPage->lea
315a0 66 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  f;.    for(i=0; 
315b0 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
315c0 20 20 20 20 20 69 6e 74 20 70 63 20 3d 20 67 65       int pc = ge
315d0 74 32 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c  t2byte(&data[cel
315e0 6c 53 74 61 72 74 2b 69 2a 32 5d 29 3b 0a 20 20  lStart+i*2]);.  
315f0 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 63      int size = c
31600 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
31610 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20  , &data[pc]);.  
31620 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
31630 20 69 66 28 20 28 70 63 2b 73 69 7a 65 2d 31 29   if( (pc+size-1)
31640 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20  >=usableSize || 
31650 70 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  pc<0 ){.        
31660 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
31670 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20  Check, 0, .     
31680 20 20 20 20 20 20 20 22 43 6f 72 72 75 70 74 69         "Corrupti
31690 6f 6e 20 64 65 74 65 63 74 65 64 20 69 6e 20 63  on detected in c
316a0 65 6c 6c 20 25 64 20 6f 6e 20 70 61 67 65 20 25  ell %d on page %
316b0 64 22 2c 69 2c 69 50 61 67 65 2c 30 29 3b 0a 20  d",i,iPage,0);. 
316c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
316d0 20 20 20 20 66 6f 72 28 6a 3d 70 63 2b 73 69 7a      for(j=pc+siz
316e0 65 2d 31 3b 20 6a 3e 3d 70 63 3b 20 6a 2d 2d 29  e-1; j>=pc; j--)
316f0 20 68 69 74 5b 6a 5d 2b 2b 3b 0a 20 20 20 20 20   hit[j]++;.     
31700 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72   }.    }.    for
31710 28 63 6e 74 3d 30 2c 20 69 3d 67 65 74 32 62 79  (cnt=0, i=get2by
31720 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29  te(&data[hdr+1])
31730 3b 20 69 3e 30 20 26 26 20 69 3c 75 73 61 62 6c  ; i>0 && i<usabl
31740 65 53 69 7a 65 20 26 26 20 63 6e 74 3c 31 30 30  eSize && cnt<100
31750 30 30 3b 20 0a 20 20 20 20 20 20 20 20 20 20 20  00; .           
31760 63 6e 74 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  cnt++){.      in
31770 74 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74  t size = get2byt
31780 65 28 26 64 61 74 61 5b 69 2b 32 5d 29 3b 0a 20  e(&data[i+2]);. 
31790 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
317a0 20 20 69 66 28 20 28 69 2b 73 69 7a 65 2d 31 29    if( (i+size-1)
317b0 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20  >=usableSize || 
317c0 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  i<0 ){.        c
317d0 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
317e0 68 65 63 6b 2c 20 30 2c 20 20 0a 20 20 20 20 20  heck, 0,  .     
317f0 20 20 20 20 20 20 20 22 43 6f 72 72 75 70 74 69         "Corrupti
31800 6f 6e 20 64 65 74 65 63 74 65 64 20 69 6e 20 63  on detected in c
31810 65 6c 6c 20 25 64 20 6f 6e 20 70 61 67 65 20 25  ell %d on page %
31820 64 22 2c 69 2c 69 50 61 67 65 2c 30 29 3b 0a 20  d",i,iPage,0);. 
31830 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
31840 20 20 20 20 66 6f 72 28 6a 3d 69 2b 73 69 7a 65      for(j=i+size
31850 2d 31 3b 20 6a 3e 3d 69 3b 20 6a 2d 2d 29 20 68  -1; j>=i; j--) h
31860 69 74 5b 6a 5d 2b 2b 3b 0a 20 20 20 20 20 20 7d  it[j]++;.      }
31870 0a 20 20 20 20 20 20 69 20 3d 20 67 65 74 32 62  .      i = get2b
31880 79 74 65 28 26 64 61 74 61 5b 69 5d 29 3b 0a 20  yte(&data[i]);. 
31890 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 63     }.    for(i=c
318a0 6e 74 3d 30 3b 20 69 3c 75 73 61 62 6c 65 53 69  nt=0; i<usableSi
318b0 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ze; i++){.      
318c0 69 66 28 20 68 69 74 5b 69 5d 3d 3d 30 20 29 7b  if( hit[i]==0 ){
318d0 0a 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a  .        cnt++;.
318e0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
318f0 68 69 74 5b 69 5d 3e 31 20 29 7b 0a 20 20 20 20  hit[i]>1 ){.    
31900 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
31910 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 0a 20 20  sg(pCheck, 0,.  
31920 20 20 20 20 20 20 20 20 22 4d 75 6c 74 69 70 6c          "Multipl
31930 65 20 75 73 65 73 20 66 6f 72 20 62 79 74 65 20  e uses for byte 
31940 25 64 20 6f 66 20 70 61 67 65 20 25 64 22 2c 20  %d of page %d", 
31950 69 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20  i, iPage);.     
31960 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
31970 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
31980 63 6e 74 21 3d 64 61 74 61 5b 68 64 72 2b 37 5d  cnt!=data[hdr+7]
31990 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41   ){.      checkA
319a0 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
319b0 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22   0, .          "
319c0 46 72 61 67 6d 65 6e 74 65 64 20 73 70 61 63 65  Fragmented space
319d0 20 69 73 20 25 64 20 62 79 74 65 20 72 65 70 6f   is %d byte repo
319e0 72 74 65 64 20 61 73 20 25 64 20 6f 6e 20 70 61  rted as %d on pa
319f0 67 65 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20  ge %d",.        
31a00 20 20 63 6e 74 2c 20 64 61 74 61 5b 68 64 72 2b    cnt, data[hdr+
31a10 37 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20  7], iPage);.    
31a20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  }.  }.  sqliteFr
31a30 65 65 28 68 69 74 29 3b 0a 0a 20 20 72 65 6c 65  ee(hit);..  rele
31a40 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
31a50 20 20 72 65 74 75 72 6e 20 64 65 70 74 68 2b 31    return depth+1
31a60 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
31a70 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52  LITE_OMIT_INTEGR
31a80 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69  ITY_CHECK */..#i
31a90 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
31aa0 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
31ab0 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  K./*.** This rou
31ac0 74 69 6e 65 20 64 6f 65 73 20 61 20 63 6f 6d 70  tine does a comp
31ad0 6c 65 74 65 20 63 68 65 63 6b 20 6f 66 20 74 68  lete check of th
31ae0 65 20 67 69 76 65 6e 20 42 54 72 65 65 20 66 69  e given BTree fi
31af0 6c 65 2e 20 20 61 52 6f 6f 74 5b 5d 20 69 73 0a  le.  aRoot[] is.
31b00 2a 2a 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70  ** an array of p
31b10 61 67 65 73 20 6e 75 6d 62 65 72 73 20 77 65 72  ages numbers wer
31b20 65 20 65 61 63 68 20 70 61 67 65 20 6e 75 6d 62  e each page numb
31b30 65 72 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70  er is the root p
31b40 61 67 65 20 6f 66 0a 2a 2a 20 61 20 74 61 62 6c  age of.** a tabl
31b50 65 2e 20 20 6e 52 6f 6f 74 20 69 73 20 74 68 65  e.  nRoot is the
31b60 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   number of entri
31b70 65 73 20 69 6e 20 61 52 6f 6f 74 2e 0a 2a 2a 0a  es in aRoot..**.
31b80 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67  ** If everything
31b90 20 63 68 65 63 6b 73 20 6f 75 74 2c 20 74 68 69   checks out, thi
31ba0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
31bb0 73 20 4e 55 4c 4c 2e 20 20 49 66 20 73 6f 6d 65  s NULL.  If some
31bc0 74 68 69 6e 67 20 69 73 0a 2a 2a 20 61 6d 69 73  thing is.** amis
31bd0 73 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  s, an error mess
31be0 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  age is written i
31bf0 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69  nto memory obtai
31c00 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28  ned from malloc(
31c10 29 0a 2a 2a 20 61 6e 64 20 61 20 70 6f 69 6e 74  ).** and a point
31c20 65 72 20 74 6f 20 74 68 61 74 20 65 72 72 6f 72  er to that error
31c30 20 6d 65 73 73 61 67 65 20 69 73 20 72 65 74 75   message is retu
31c40 72 6e 65 64 2e 20 20 54 68 65 20 63 61 6c 6c 69  rned.  The calli
31c50 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  ng function.** i
31c60 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
31c70 72 20 66 72 65 65 69 6e 67 20 74 68 65 20 65 72  r freeing the er
31c80 72 6f 72 20 6d 65 73 73 61 67 65 20 77 68 65 6e  ror message when
31c90 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2f 0a   it is done..*/.
31ca0 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72  char *sqlite3Btr
31cb0 65 65 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b  eeIntegrityCheck
31cc0 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
31cd0 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 74    /* The btree t
31ce0 6f 20 62 65 20 63 68 65 63 6b 65 64 20 2a 2f 0a  o be checked */.
31cf0 20 20 69 6e 74 20 2a 61 52 6f 6f 74 2c 20 20 20    int *aRoot,   
31d00 2f 2a 20 41 6e 20 61 72 72 61 79 20 6f 66 20 72  /* An array of r
31d10 6f 6f 74 20 70 61 67 65 73 20 6e 75 6d 62 65 72  oot pages number
31d20 73 20 66 6f 72 20 69 6e 64 69 76 69 64 75 61 6c  s for individual
31d30 20 74 72 65 65 73 20 2a 2f 0a 20 20 69 6e 74 20   trees */.  int 
31d40 6e 52 6f 6f 74 2c 20 20 20 20 2f 2a 20 4e 75 6d  nRoot,    /* Num
31d50 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
31d60 6e 20 61 52 6f 6f 74 5b 5d 20 2a 2f 0a 20 20 69  n aRoot[] */.  i
31d70 6e 74 20 6d 78 45 72 72 2c 20 20 20 20 2f 2a 20  nt mxErr,    /* 
31d80 53 74 6f 70 20 72 65 70 6f 72 74 69 6e 67 20 65  Stop reporting e
31d90 72 72 6f 72 73 20 61 66 74 65 72 20 74 68 69 73  rrors after this
31da0 20 6d 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 2a   many */.  int *
31db0 70 6e 45 72 72 20 20 20 20 2f 2a 20 57 72 69 74  pnErr    /* Writ
31dc0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
31dd0 72 73 20 73 65 65 6e 20 74 6f 20 74 68 69 73 20  rs seen to this 
31de0 76 61 72 69 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  variable */.){. 
31df0 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 52   int i;.  int nR
31e00 65 66 3b 0a 20 20 49 6e 74 65 67 72 69 74 79 43  ef;.  IntegrityC
31e10 6b 20 73 43 68 65 63 6b 3b 0a 20 20 42 74 53 68  k sCheck;.  BtSh
31e20 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
31e30 42 74 3b 0a 0a 20 20 6e 52 65 66 20 3d 20 73 71  Bt;..  nRef = sq
31e40 6c 69 74 65 33 70 61 67 65 72 5f 72 65 66 63 6f  lite3pager_refco
31e50 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
31e60 3b 0a 20 20 69 66 28 20 6c 6f 63 6b 42 74 72 65  ;.  if( lockBtre
31e70 65 57 69 74 68 52 65 74 72 79 28 70 29 21 3d 53  eWithRetry(p)!=S
31e80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31e90 72 65 74 75 72 6e 20 73 71 6c 69 74 65 53 74 72  return sqliteStr
31ea0 44 75 70 28 22 55 6e 61 62 6c 65 20 74 6f 20 61  Dup("Unable to a
31eb0 63 71 75 69 72 65 20 61 20 72 65 61 64 20 6c 6f  cquire a read lo
31ec0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
31ed0 73 65 22 29 3b 0a 20 20 7d 0a 20 20 73 43 68 65  se");.  }.  sChe
31ee0 63 6b 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  ck.pBt = pBt;.  
31ef0 73 43 68 65 63 6b 2e 70 50 61 67 65 72 20 3d 20  sCheck.pPager = 
31f00 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 73  pBt->pPager;.  s
31f10 43 68 65 63 6b 2e 6e 50 61 67 65 20 3d 20 73 71  Check.nPage = sq
31f20 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63  lite3pager_pagec
31f30 6f 75 6e 74 28 73 43 68 65 63 6b 2e 70 50 61 67  ount(sCheck.pPag
31f40 65 72 29 3b 0a 20 20 73 43 68 65 63 6b 2e 6d 78  er);.  sCheck.mx
31f50 45 72 72 20 3d 20 6d 78 45 72 72 3b 0a 20 20 73  Err = mxErr;.  s
31f60 43 68 65 63 6b 2e 6e 45 72 72 20 3d 20 30 3b 0a  Check.nErr = 0;.
31f70 20 20 2a 70 6e 45 72 72 20 3d 20 30 3b 0a 20 20    *pnErr = 0;.  
31f80 69 66 28 20 73 43 68 65 63 6b 2e 6e 50 61 67 65  if( sCheck.nPage
31f90 3d 3d 30 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63  ==0 ){.    unloc
31fa0 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
31fb0 42 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  Bt);.    return 
31fc0 30 3b 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b 2e  0;.  }.  sCheck.
31fd0 61 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 4d 61  anRef = sqliteMa
31fe0 6c 6c 6f 63 52 61 77 28 20 28 73 43 68 65 63 6b  llocRaw( (sCheck
31ff0 2e 6e 50 61 67 65 2b 31 29 2a 73 69 7a 65 6f 66  .nPage+1)*sizeof
32000 28 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 30 5d  (sCheck.anRef[0]
32010 29 20 29 3b 0a 20 20 69 66 28 20 21 73 43 68 65  ) );.  if( !sChe
32020 63 6b 2e 61 6e 52 65 66 20 29 7b 0a 20 20 20 20  ck.anRef ){.    
32030 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
32040 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 2a 70  sed(pBt);.    *p
32050 6e 45 72 72 20 3d 20 31 3b 0a 20 20 20 20 72 65  nErr = 1;.    re
32060 74 75 72 6e 20 73 71 6c 69 74 65 33 4d 50 72 69  turn sqlite3MPri
32070 6e 74 66 28 22 55 6e 61 62 6c 65 20 74 6f 20 6d  ntf("Unable to m
32080 61 6c 6c 6f 63 20 25 64 20 62 79 74 65 73 22 2c  alloc %d bytes",
32090 20 0a 20 20 20 20 20 20 20 20 28 73 43 68 65 63   .        (sChec
320a0 6b 2e 6e 50 61 67 65 2b 31 29 2a 73 69 7a 65 6f  k.nPage+1)*sizeo
320b0 66 28 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 30  f(sCheck.anRef[0
320c0 5d 29 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  ]));.  }.  for(i
320d0 3d 30 3b 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50  =0; i<=sCheck.nP
320e0 61 67 65 3b 20 69 2b 2b 29 7b 20 73 43 68 65 63  age; i++){ sChec
320f0 6b 2e 61 6e 52 65 66 5b 69 5d 20 3d 20 30 3b 20  k.anRef[i] = 0; 
32100 7d 0a 20 20 69 20 3d 20 50 45 4e 44 49 4e 47 5f  }.  i = PENDING_
32110 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 3b 0a  BYTE_PAGE(pBt);.
32120 20 20 69 66 28 20 69 3c 3d 73 43 68 65 63 6b 2e    if( i<=sCheck.
32130 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 73 43 68  nPage ){.    sCh
32140 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 20 3d 20 31  eck.anRef[i] = 1
32150 3b 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b 2e 7a  ;.  }.  sCheck.z
32160 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 2f  ErrMsg = 0;..  /
32170 2a 20 43 68 65 63 6b 20 74 68 65 20 69 6e 74 65  * Check the inte
32180 67 72 69 74 79 20 6f 66 20 74 68 65 20 66 72 65  grity of the fre
32190 65 6c 69 73 74 0a 20 20 2a 2f 0a 20 20 63 68 65  elist.  */.  che
321a0 63 6b 4c 69 73 74 28 26 73 43 68 65 63 6b 2c 20  ckList(&sCheck, 
321b0 31 2c 20 67 65 74 34 62 79 74 65 28 26 70 42 74  1, get4byte(&pBt
321c0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
321d0 33 32 5d 29 2c 0a 20 20 20 20 20 20 20 20 20 20  32]),.          
321e0 20 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d    get4byte(&pBt-
321f0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
32200 36 5d 29 2c 20 22 4d 61 69 6e 20 66 72 65 65 6c  6]), "Main freel
32210 69 73 74 3a 20 22 29 3b 0a 0a 20 20 2f 2a 20 43  ist: ");..  /* C
32220 68 65 63 6b 20 61 6c 6c 20 74 68 65 20 74 61 62  heck all the tab
32230 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  les..  */.  for(
32240 69 3d 30 3b 20 69 3c 6e 52 6f 6f 74 20 26 26 20  i=0; i<nRoot && 
32250 73 43 68 65 63 6b 2e 6d 78 45 72 72 3b 20 69 2b  sCheck.mxErr; i+
32260 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 52 6f 6f  +){.    if( aRoo
32270 74 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  t[i]==0 ) contin
32280 75 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ue;.#ifndef SQLI
32290 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
322a0 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  UM.    if( pBt->
322b0 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 61 52  autoVacuum && aR
322c0 6f 6f 74 5b 69 5d 3e 31 20 29 7b 0a 20 20 20 20  oot[i]>1 ){.    
322d0 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 26 73    checkPtrmap(&s
322e0 43 68 65 63 6b 2c 20 61 52 6f 6f 74 5b 69 5d 2c  Check, aRoot[i],
322f0 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45   PTRMAP_ROOTPAGE
32300 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23  , 0, 0);.    }.#
32310 65 6e 64 69 66 0a 20 20 20 20 63 68 65 63 6b 54  endif.    checkT
32320 72 65 65 50 61 67 65 28 26 73 43 68 65 63 6b 2c  reePage(&sCheck,
32330 20 61 52 6f 6f 74 5b 69 5d 2c 20 30 2c 20 22 4c   aRoot[i], 0, "L
32340 69 73 74 20 6f 66 20 74 72 65 65 20 72 6f 6f 74  ist of tree root
32350 73 3a 20 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  s: ");.  }..  /*
32360 20 4d 61 6b 65 20 73 75 72 65 20 65 76 65 72 79   Make sure every
32370 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c   page in the fil
32380 65 20 69 73 20 72 65 66 65 72 65 6e 63 65 64 0a  e is referenced.
32390 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20    */.  for(i=1; 
323a0 69 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65 20  i<=sCheck.nPage 
323b0 26 26 20 73 43 68 65 63 6b 2e 6d 78 45 72 72 3b  && sCheck.mxErr;
323c0 20 69 2b 2b 29 7b 0a 23 69 66 64 65 66 20 53 51   i++){.#ifdef SQ
323d0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
323e0 43 55 55 4d 0a 20 20 20 20 69 66 28 20 73 43 68  CUUM.    if( sCh
323f0 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 3d 3d 30 20  eck.anRef[i]==0 
32400 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70  ){.      checkAp
32410 70 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c  pendMsg(&sCheck,
32420 20 30 2c 20 22 50 61 67 65 20 25 64 20 69 73 20   0, "Page %d is 
32430 6e 65 76 65 72 20 75 73 65 64 22 2c 20 69 29 3b  never used", i);
32440 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20  .    }.#else.   
32450 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
32460 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
32470 6f 2d 76 61 63 75 75 6d 2c 20 6d 61 6b 65 20 73  o-vacuum, make s
32480 75 72 65 20 6e 6f 20 74 61 62 6c 65 73 20 63 6f  ure no tables co
32490 6e 74 61 69 6e 0a 20 20 20 20 2a 2a 20 72 65 66  ntain.    ** ref
324a0 65 72 65 6e 63 65 73 20 74 6f 20 70 6f 69 6e 74  erences to point
324b0 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 0a 20 20  er-map pages..  
324c0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 43 68    */.    if( sCh
324d0 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 3d 3d 30 20  eck.anRef[i]==0 
324e0 26 26 20 0a 20 20 20 20 20 20 20 28 50 54 52 4d  && .       (PTRM
324f0 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 69  AP_PAGENO(pBt, i
32500 29 21 3d 69 20 7c 7c 20 21 70 42 74 2d 3e 61 75  )!=i || !pBt->au
32510 74 6f 56 61 63 75 75 6d 29 20 29 7b 0a 20 20 20  toVacuum) ){.   
32520 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
32530 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 22 50  g(&sCheck, 0, "P
32540 61 67 65 20 25 64 20 69 73 20 6e 65 76 65 72 20  age %d is never 
32550 75 73 65 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d  used", i);.    }
32560 0a 20 20 20 20 69 66 28 20 73 43 68 65 63 6b 2e  .    if( sCheck.
32570 61 6e 52 65 66 5b 69 5d 21 3d 30 20 26 26 20 0a  anRef[i]!=0 && .
32580 20 20 20 20 20 20 20 28 50 54 52 4d 41 50 5f 50         (PTRMAP_P
32590 41 47 45 4e 4f 28 70 42 74 2c 20 69 29 3d 3d 69  AGENO(pBt, i)==i
325a0 20 26 26 20 70 42 74 2d 3e 61 75 74 6f 56 61 63   && pBt->autoVac
325b0 75 75 6d 29 20 29 7b 0a 20 20 20 20 20 20 63 68  uum) ){.      ch
325c0 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43  eckAppendMsg(&sC
325d0 68 65 63 6b 2c 20 30 2c 20 22 50 6f 69 6e 74 65  heck, 0, "Pointe
325e0 72 20 6d 61 70 20 70 61 67 65 20 25 64 20 69 73  r map page %d is
325f0 20 72 65 66 65 72 65 6e 63 65 64 22 2c 20 69 29   referenced", i)
32600 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
32610 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
32620 72 65 20 74 68 69 73 20 61 6e 61 6c 79 73 69 73  re this analysis
32630 20 64 69 64 20 6e 6f 74 20 6c 65 61 76 65 20 61   did not leave a
32640 6e 79 20 75 6e 72 65 66 28 29 20 70 61 67 65 73  ny unref() pages
32650 0a 20 20 2a 2f 0a 20 20 75 6e 6c 6f 63 6b 42 74  .  */.  unlockBt
32660 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
32670 3b 0a 20 20 69 66 28 20 6e 52 65 66 20 21 3d 20  ;.  if( nRef != 
32680 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65 66  sqlite3pager_ref
32690 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
326a0 72 29 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41  r) ){.    checkA
326b0 70 70 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b  ppendMsg(&sCheck
326c0 2c 20 30 2c 20 0a 20 20 20 20 20 20 22 4f 75 74  , 0, .      "Out
326d0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 63 6f  standing page co
326e0 75 6e 74 20 67 6f 65 73 20 66 72 6f 6d 20 25 64  unt goes from %d
326f0 20 74 6f 20 25 64 20 64 75 72 69 6e 67 20 74 68   to %d during th
32700 69 73 20 61 6e 61 6c 79 73 69 73 22 2c 0a 20 20  is analysis",.  
32710 20 20 20 20 6e 52 65 66 2c 20 73 71 6c 69 74 65      nRef, sqlite
32720 33 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 28  3pager_refcount(
32730 70 42 74 2d 3e 70 50 61 67 65 72 29 0a 20 20 20  pBt->pPager).   
32740 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c   );.  }..  /* Cl
32750 65 61 6e 20 20 75 70 20 61 6e 64 20 72 65 70 6f  ean  up and repo
32760 72 74 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a  rt errors..  */.
32770 20 20 73 71 6c 69 74 65 46 72 65 65 28 73 43 68    sqliteFree(sCh
32780 65 63 6b 2e 61 6e 52 65 66 29 3b 0a 20 20 2a 70  eck.anRef);.  *p
32790 6e 45 72 72 20 3d 20 73 43 68 65 63 6b 2e 6e 45  nErr = sCheck.nE
327a0 72 72 3b 0a 20 20 72 65 74 75 72 6e 20 73 43 68  rr;.  return sCh
327b0 65 63 6b 2e 7a 45 72 72 4d 73 67 3b 0a 7d 0a 23  eck.zErrMsg;.}.#
327c0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
327d0 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43  OMIT_INTEGRITY_C
327e0 48 45 43 4b 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  HECK */../*.** R
327f0 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70  eturn the full p
32800 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 75  athname of the u
32810 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61  nderlying databa
32820 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73  se file..*/.cons
32830 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42  t char *sqlite3B
32840 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28  treeGetFilename(
32850 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73  Btree *p){.  ass
32860 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 70 50 61  ert( p->pBt->pPa
32870 67 65 72 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  ger!=0 );.  retu
32880 72 6e 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  rn sqlite3pager_
32890 66 69 6c 65 6e 61 6d 65 28 70 2d 3e 70 42 74 2d  filename(p->pBt-
328a0 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  >pPager);.}../*.
328b0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  ** Return the pa
328c0 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 69  thname of the di
328d0 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e  rectory that con
328e0 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61  tains the databa
328f0 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73  se file..*/.cons
32900 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42  t char *sqlite3B
32910 74 72 65 65 47 65 74 44 69 72 6e 61 6d 65 28 42  treeGetDirname(B
32920 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65  tree *p){.  asse
32930 72 74 28 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67  rt( p->pBt->pPag
32940 65 72 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  er!=0 );.  retur
32950 6e 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64  n sqlite3pager_d
32960 69 72 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70  irname(p->pBt->p
32970 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Pager);.}../*.**
32980 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 74 68   Return the path
32990 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  name of the jour
329a0 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 74 68 69  nal file for thi
329b0 73 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20  s database. The 
329c0 72 65 74 75 72 6e 0a 2a 2a 20 76 61 6c 75 65 20  return.** value 
329d0 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
329e0 69 73 20 74 68 65 20 73 61 6d 65 20 72 65 67 61  is the same rega
329f0 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
32a00 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  r the journal fi
32a10 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63  le.** has been c
32a20 72 65 61 74 65 64 20 6f 72 20 6e 6f 74 2e 0a 2a  reated or not..*
32a30 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
32a40 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75  lite3BtreeGetJou
32a50 72 6e 61 6c 6e 61 6d 65 28 42 74 72 65 65 20 2a  rnalname(Btree *
32a60 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p){.  assert( p-
32a70 3e 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20  >pBt->pPager!=0 
32a80 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
32a90 74 65 33 70 61 67 65 72 5f 6a 6f 75 72 6e 61 6c  te3pager_journal
32aa0 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61  name(p->pBt->pPa
32ab0 67 65 72 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  ger);.}..#ifndef
32ac0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43   SQLITE_OMIT_VAC
32ad0 55 55 4d 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74  UUM./*.** Copy t
32ae0 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74  he complete cont
32af0 65 6e 74 20 6f 66 20 70 42 74 46 72 6f 6d 20 69  ent of pBtFrom i
32b00 6e 74 6f 20 70 42 74 54 6f 2e 20 20 41 20 74 72  nto pBtTo.  A tr
32b10 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73  ansaction.** mus
32b20 74 20 62 65 20 61 63 74 69 76 65 20 66 6f 72 20  t be active for 
32b30 62 6f 74 68 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  both files..**.*
32b40 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 66 69  * The size of fi
32b50 6c 65 20 70 42 74 46 72 6f 6d 20 6d 61 79 20 62  le pBtFrom may b
32b60 65 20 72 65 64 75 63 65 64 20 62 79 20 74 68 69  e reduced by thi
32b70 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20  s operation..** 
32b80 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  If anything goes
32b90 20 77 72 6f 6e 67 2c 20 74 68 65 20 74 72 61 6e   wrong, the tran
32ba0 73 61 63 74 69 6f 6e 20 6f 6e 20 70 42 74 46 72  saction on pBtFr
32bb0 6f 6d 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  om is rolled bac
32bc0 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
32bd0 33 42 74 72 65 65 43 6f 70 79 46 69 6c 65 28 42  3BtreeCopyFile(B
32be0 74 72 65 65 20 2a 70 54 6f 2c 20 42 74 72 65 65  tree *pTo, Btree
32bf0 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 6e 74 20   *pFrom){.  int 
32c00 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
32c10 20 20 50 67 6e 6f 20 69 2c 20 6e 50 61 67 65 2c    Pgno i, nPage,
32c20 20 6e 54 6f 50 61 67 65 2c 20 69 53 6b 69 70 3b   nToPage, iSkip;
32c30 0a 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ..  BtShared *pB
32c40 74 54 6f 20 3d 20 70 54 6f 2d 3e 70 42 74 3b 0a  tTo = pTo->pBt;.
32c50 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 46    BtShared *pBtF
32c60 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e 70 42 74  rom = pFrom->pBt
32c70 3b 0a 0a 20 20 69 66 28 20 70 54 6f 2d 3e 69 6e  ;..  if( pTo->in
32c80 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49  Trans!=TRANS_WRI
32c90 54 45 20 7c 7c 20 70 46 72 6f 6d 2d 3e 69 6e 54  TE || pFrom->inT
32ca0 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54  rans!=TRANS_WRIT
32cb0 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  E ){.    return 
32cc0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
32cd0 7d 0a 20 20 69 66 28 20 70 42 74 54 6f 2d 3e 70  }.  if( pBtTo->p
32ce0 43 75 72 73 6f 72 20 29 20 72 65 74 75 72 6e 20  Cursor ) return 
32cf0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 6e  SQLITE_BUSY;.  n
32d00 54 6f 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33  ToPage = sqlite3
32d10 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28  pager_pagecount(
32d20 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 29 3b 0a  pBtTo->pPager);.
32d30 20 20 6e 50 61 67 65 20 3d 20 73 71 6c 69 74 65    nPage = sqlite
32d40 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74  3pager_pagecount
32d50 28 70 42 74 46 72 6f 6d 2d 3e 70 50 61 67 65 72  (pBtFrom->pPager
32d60 29 3b 0a 20 20 69 53 6b 69 70 20 3d 20 50 45 4e  );.  iSkip = PEN
32d70 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
32d80 42 74 54 6f 29 3b 0a 20 20 66 6f 72 28 69 3d 31  BtTo);.  for(i=1
32d90 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
32da0 26 26 20 69 3c 3d 6e 50 61 67 65 3b 20 69 2b 2b  && i<=nPage; i++
32db0 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 50 61  ){.    void *pPa
32dc0 67 65 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 69  ge;.    if( i==i
32dd0 53 6b 69 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Skip ) continue;
32de0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
32df0 33 70 61 67 65 72 5f 67 65 74 28 70 42 74 46 72  3pager_get(pBtFr
32e00 6f 6d 2d 3e 70 50 61 67 65 72 2c 20 69 2c 20 26  om->pPager, i, &
32e10 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  pPage);.    if( 
32e20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rc ) break;.    
32e30 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
32e40 72 5f 6f 76 65 72 77 72 69 74 65 28 70 42 74 54  r_overwrite(pBtT
32e50 6f 2d 3e 70 50 61 67 65 72 2c 20 69 2c 20 70 50  o->pPager, i, pP
32e60 61 67 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  age);.    sqlite
32e70 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70 50 61  3pager_unref(pPa
32e80 67 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  ge);.  }.  for(i
32e90 3d 6e 50 61 67 65 2b 31 3b 20 72 63 3d 3d 53 51  =nPage+1; rc==SQ
32ea0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 3d 6e 54  LITE_OK && i<=nT
32eb0 6f 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  oPage; i++){.   
32ec0 20 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20   void *pPage;.  
32ed0 20 20 69 66 28 20 69 3d 3d 69 53 6b 69 70 20 29    if( i==iSkip )
32ee0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 72   continue;.    r
32ef0 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
32f00 5f 67 65 74 28 70 42 74 54 6f 2d 3e 70 50 61 67  _get(pBtTo->pPag
32f10 65 72 2c 20 69 2c 20 26 70 50 61 67 65 29 3b 0a  er, i, &pPage);.
32f20 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
32f30 61 6b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ak;.    rc = sql
32f40 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28  ite3pager_write(
32f50 70 50 61 67 65 29 3b 0a 20 20 20 20 73 71 6c 69  pPage);.    sqli
32f60 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70  te3pager_unref(p
32f70 50 61 67 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Page);.    sqlit
32f80 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 77 72 69  e3pager_dont_wri
32f90 74 65 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72  te(pBtTo->pPager
32fa0 2c 20 69 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , i);.  }.  if( 
32fb0 21 72 63 20 26 26 20 6e 50 61 67 65 3c 6e 54 6f  !rc && nPage<nTo
32fc0 50 61 67 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  Page ){.    rc =
32fd0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 74 72   sqlite3pager_tr
32fe0 75 6e 63 61 74 65 28 70 42 74 54 6f 2d 3e 70 50  uncate(pBtTo->pP
32ff0 61 67 65 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20  ager, nPage);.  
33000 7d 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  }.  if( rc ){.  
33010 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f    sqlite3BtreeRo
33020 6c 6c 62 61 63 6b 28 70 54 6f 29 3b 0a 20 20 7d  llback(pTo);.  }
33030 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20 0a  .  return rc;  .
33040 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
33050 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 20 2a  TE_OMIT_VACUUM *
33060 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
33070 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 61 20 74 72  non-zero if a tr
33080 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
33090 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ive..*/.int sqli
330a0 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
330b0 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72  s(Btree *p){.  r
330c0 65 74 75 72 6e 20 28 70 20 26 26 20 28 70 2d 3e  eturn (p && (p->
330d0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
330e0 52 49 54 45 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  RITE));.}../*.**
330f0 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
33100 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20   if a statement 
33110 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
33120 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ctive..*/.int sq
33130 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 53 74  lite3BtreeIsInSt
33140 6d 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  mt(Btree *p){.  
33150 72 65 74 75 72 6e 20 28 70 2d 3e 70 42 74 20 26  return (p->pBt &
33160 26 20 70 2d 3e 70 42 74 2d 3e 69 6e 53 74 6d 74  & p->pBt->inStmt
33170 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
33180 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 61  rn non-zero if a
33190 20 72 65 61 64 20 28 6f 72 20 77 72 69 74 65 29   read (or write)
331a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
331b0 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73  active..*/.int s
331c0 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 52  qlite3BtreeIsInR
331d0 65 61 64 54 72 61 6e 73 28 42 74 72 65 65 20 2a  eadTrans(Btree *
331e0 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 20  p){.  return (p 
331f0 26 26 20 28 70 2d 3e 69 6e 54 72 61 6e 73 21 3d  && (p->inTrans!=
33200 54 52 41 4e 53 5f 4e 4f 4e 45 29 29 3b 0a 7d 0a  TRANS_NONE));.}.
33210 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c  ./*.** This call
33220 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e   is a no-op if n
33230 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  o write-transact
33240 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ion is currently
33250 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a   active on pBt..
33260 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
33270 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   sync the databa
33280 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20  se file for the 
33290 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74  btree pBt. zMast
332a0 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20  er points to.** 
332b0 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61  the name of a ma
332c0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
332d0 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
332e0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
332f0 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20  e.** individual 
33300 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72  journal file, or
33310 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61   is NULL, indica
33320 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a  ting no master j
33330 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20  ournal file .** 
33340 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65  (single database
33350 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a   transaction)..*
33360 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69  *.** When this i
33370 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61  s called, the ma
33380 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f  ster journal sho
33390 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76 65  uld already have
333a0 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64   been.** created
333b0 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  , populated with
333c0 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f   this journal po
333d0 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64  inter and synced
333e0 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
333f0 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f 75  Once this is rou
33400 74 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65  tine has returne
33410 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e  d, the only thin
33420 67 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f  g required to co
33430 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74  mmit.** the writ
33440 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f  e-transaction fo
33450 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  r this database 
33460 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74  file is to delet
33470 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  e the journal..*
33480 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
33490 65 65 53 79 6e 63 28 42 74 72 65 65 20 2a 70 2c  eeSync(Btree *p,
334a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
334b0 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ster){.  int rc 
334c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
334d0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
334e0 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
334f0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
33500 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 50 67  = p->pBt;.    Pg
33510 6e 6f 20 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 23  no nTrunc = 0;.#
33520 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
33530 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
33540 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
33550 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72  acuum ){.      r
33560 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f  c = autoVacuumCo
33570 6d 6d 69 74 28 70 42 74 2c 20 26 6e 54 72 75 6e  mmit(pBt, &nTrun
33580 63 29 3b 20 0a 20 20 20 20 20 20 69 66 28 20 72  c); .      if( r
33590 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
335a0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
335b0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
335c0 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d  .#endif.    rc =
335d0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79   sqlite3pager_sy
335e0 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nc(pBt->pPager, 
335f0 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e 63 29  zMaster, nTrunc)
33600 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
33610 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
33620 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
33630 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
33640 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20   blob of memory 
33650 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
33660 2a 2a 20 61 20 73 69 6e 67 6c 65 20 73 68 61 72  ** a single shar
33670 65 64 2d 62 74 72 65 65 2e 20 54 68 65 20 6d 65  ed-btree. The me
33680 6d 6f 72 79 20 69 73 20 75 73 65 64 20 62 79 20  mory is used by 
33690 63 6c 69 65 6e 74 20 63 6f 64 65 20 66 6f 72 20  client code for 
336a0 69 74 27 73 20 6f 77 6e 0a 2a 2a 20 70 75 72 70  it's own.** purp
336b0 6f 73 65 73 20 28 66 6f 72 20 65 78 61 6d 70 6c  oses (for exampl
336c0 65 2c 20 74 6f 20 73 74 6f 72 65 20 61 20 68 69  e, to store a hi
336d0 67 68 2d 6c 65 76 65 6c 20 73 63 68 65 6d 61 20  gh-level schema 
336e0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
336f0 0a 2a 2a 20 74 68 65 20 73 68 61 72 65 64 2d 62  .** the shared-b
33700 74 72 65 65 29 2e 20 54 68 65 20 62 74 72 65 65  tree). The btree
33710 20 6c 61 79 65 72 20 6d 61 6e 61 67 65 73 20 72   layer manages r
33720 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 69 6e  eference countin
33730 67 20 69 73 73 75 65 73 2e 0a 2a 2a 0a 2a 2a 20  g issues..**.** 
33740 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74  The first time t
33750 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  his is called on
33760 20 61 20 73 68 61 72 65 64 2d 62 74 72 65 65 2c   a shared-btree,
33770 20 6e 42 79 74 65 73 20 62 79 74 65 73 20 6f 66   nBytes bytes of
33780 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 72 65 20 61   memory.** are a
33790 6c 6c 6f 63 61 74 65 64 2c 20 7a 65 72 6f 65 64  llocated, zeroed
337a0 2c 20 61 6e 64 20 72 65 74 75 72 6e 65 64 20 74  , and returned t
337b0 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 46 6f  o the caller. Fo
337c0 72 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e  r each subsequen
337d0 74 20 0a 2a 2a 20 63 61 6c 6c 20 74 68 65 20 6e  t .** call the n
337e0 42 79 74 65 73 20 70 61 72 61 6d 65 74 65 72 20  Bytes parameter 
337f0 69 73 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 61  is ignored and a
33800 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
33810 73 61 6d 65 20 62 6c 6f 62 0a 2a 2a 20 6f 66 20  same blob.** of 
33820 6d 65 6d 6f 72 79 20 72 65 74 75 72 6e 65 64 2e  memory returned.
33830 20 0a 2a 2a 0a 2a 2a 20 4a 75 73 74 20 62 65 66   .**.** Just bef
33840 6f 72 65 20 74 68 65 20 73 68 61 72 65 64 2d 62  ore the shared-b
33850 74 72 65 65 20 69 73 20 63 6c 6f 73 65 64 2c 20  tree is closed, 
33860 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 70 61 73  the function pas
33870 73 65 64 20 61 73 20 74 68 65 20 0a 2a 2a 20 78  sed as the .** x
33880 46 72 65 65 20 61 72 67 75 6d 65 6e 74 20 77 68  Free argument wh
33890 65 6e 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  en the memory al
338a0 6c 6f 63 61 74 69 6f 6e 20 77 61 73 20 6d 61 64  location was mad
338b0 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20  e is invoked on 
338c0 74 68 65 20 0a 2a 2a 20 62 6c 6f 62 20 6f 66 20  the .** blob of 
338d0 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79  allocated memory
338e0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
338f0 73 68 6f 75 6c 64 20 6e 6f 74 20 63 61 6c 6c 20  should not call 
33900 73 71 6c 69 74 65 46 72 65 65 28 29 0a 2a 2a 20  sqliteFree().** 
33910 6f 6e 20 74 68 65 20 6d 65 6d 6f 72 79 2c 20 74  on the memory, t
33920 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 64  he btree layer d
33930 6f 65 73 20 74 68 61 74 2e 0a 2a 2f 0a 76 6f 69  oes that..*/.voi
33940 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 53  d *sqlite3BtreeS
33950 63 68 65 6d 61 28 42 74 72 65 65 20 2a 70 2c 20  chema(Btree *p, 
33960 69 6e 74 20 6e 42 79 74 65 73 2c 20 76 6f 69 64  int nBytes, void
33970 28 2a 78 46 72 65 65 29 28 76 6f 69 64 20 2a 29  (*xFree)(void *)
33980 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
33990 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
339a0 66 28 20 21 70 42 74 2d 3e 70 53 63 68 65 6d 61  f( !pBt->pSchema
339b0 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 53 63   ){.    pBt->pSc
339c0 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 4d 61 6c  hema = sqliteMal
339d0 6c 6f 63 28 6e 42 79 74 65 73 29 3b 0a 20 20 20  loc(nBytes);.   
339e0 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
339f0 61 20 3d 20 78 46 72 65 65 3b 0a 20 20 7d 0a 20  a = xFree;.  }. 
33a00 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 70 53 63   return pBt->pSc
33a10 68 65 6d 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  hema;.}../*.** R
33a20 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e  eturn true if an
33a30 6f 74 68 65 72 20 75 73 65 72 20 6f 66 20 74 68  other user of th
33a40 65 20 73 61 6d 65 20 73 68 61 72 65 64 20 62 74  e same shared bt
33a50 72 65 65 20 61 73 20 74 68 65 20 61 72 67 75 6d  ree as the argum
33a60 65 6e 74 0a 2a 2a 20 68 61 6e 64 6c 65 20 68 6f  ent.** handle ho
33a70 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65  lds an exclusive
33a80 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 73 71 6c   lock on the sql
33a90 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
33aa0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
33ab0 42 74 72 65 65 53 63 68 65 6d 61 4c 6f 63 6b 65  BtreeSchemaLocke
33ac0 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72  d(Btree *p){.  r
33ad0 65 74 75 72 6e 20 28 71 75 65 72 79 54 61 62 6c  eturn (queryTabl
33ae0 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f  eLock(p, MASTER_
33af0 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29  ROOT, READ_LOCK)
33b00 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a  !=SQLITE_OK);.}.
33b10 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
33b20 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
33b30 48 45 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20  HE./*.** Obtain 
33b40 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61  a lock on the ta
33b50 62 6c 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 70  ble whose root p
33b60 61 67 65 20 69 73 20 69 54 61 62 2e 20 20 54 68  age is iTab.  Th
33b70 65 0a 2a 2a 20 6c 6f 63 6b 20 69 73 20 61 20 77  e.** lock is a w
33b80 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 69 73 57  rite lock if isW
33b90 72 69 74 65 6c 6f 63 6b 20 69 73 20 74 72 75 65  ritelock is true
33ba0 20 6f 72 20 61 20 72 65 61 64 20 6c 6f 63 6b 0a   or a read lock.
33bb0 2a 2a 20 69 66 20 69 74 20 69 73 20 66 61 6c 73  ** if it is fals
33bc0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
33bd0 33 42 74 72 65 65 4c 6f 63 6b 54 61 62 6c 65 28  3BtreeLockTable(
33be0 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 54  Btree *p, int iT
33bf0 61 62 2c 20 75 38 20 69 73 57 72 69 74 65 4c 6f  ab, u8 isWriteLo
33c00 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ck){.  int rc = 
33c10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20  SQLITE_OK;.  u8 
33c20 6c 6f 63 6b 54 79 70 65 20 3d 20 28 69 73 57 72  lockType = (isWr
33c30 69 74 65 4c 6f 63 6b 3f 57 52 49 54 45 5f 4c 4f  iteLock?WRITE_LO
33c40 43 4b 3a 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20  CK:READ_LOCK);. 
33c50 20 72 63 20 3d 20 71 75 65 72 79 54 61 62 6c 65   rc = queryTable
33c60 4c 6f 63 6b 28 70 2c 20 69 54 61 62 2c 20 6c 6f  Lock(p, iTab, lo
33c70 63 6b 54 79 70 65 29 3b 0a 20 20 69 66 28 20 72  ckType);.  if( r
33c80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
33c90 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 54 61 62      rc = lockTab
33ca0 6c 65 28 70 2c 20 69 54 61 62 2c 20 6c 6f 63 6b  le(p, iTab, lock
33cb0 54 79 70 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Type);.  }.  ret
33cc0 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
33cd0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
33ce0 6f 77 69 6e 67 20 64 65 62 75 67 67 69 6e 67 20  owing debugging 
33cf0 69 6e 74 65 72 66 61 63 65 20 68 61 73 20 74 6f  interface has to
33d00 20 62 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65   be in this file
33d10 20 28 72 61 74 68 65 72 0a 2a 2a 20 74 68 61 6e   (rather.** than
33d20 20 69 6e 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65   in, for example
33d30 2c 20 74 65 73 74 31 2e 63 29 20 73 6f 20 74 68  , test1.c) so th
33d40 61 74 20 69 74 20 63 61 6e 20 67 65 74 20 61 63  at it can get ac
33d50 63 65 73 73 20 74 6f 0a 2a 2a 20 74 68 65 20 64  cess to.** the d
33d60 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 42 74 53  efinition of BtS
33d70 68 61 72 65 64 2e 0a 2a 2f 0a 23 69 66 20 64 65  hared..*/.#if de
33d80 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
33d90 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28 54  UG) && defined(T
33da0 43 4c 53 48 29 0a 23 69 6e 63 6c 75 64 65 20 3c  CLSH).#include <
33db0 74 63 6c 2e 68 3e 0a 69 6e 74 20 73 71 6c 69 74  tcl.h>.int sqlit
33dc0 65 33 5f 73 68 61 72 65 64 5f 63 61 63 68 65 5f  e3_shared_cache_
33dd0 72 65 70 6f 72 74 28 0a 20 20 76 6f 69 64 20 2a  report(.  void *
33de0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
33df0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
33e00 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
33e10 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
33e20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65  objv[].){.#ifnde
33e30 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
33e40 41 52 45 44 5f 43 41 43 48 45 0a 20 20 63 6f 6e  ARED_CACHE.  con
33e50 73 74 20 54 68 72 65 61 64 44 61 74 61 20 2a 70  st ThreadData *p
33e60 54 64 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65  Td = sqlite3Thre
33e70 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79 28 29  adDataReadOnly()
33e80 3b 0a 20 20 69 66 28 20 70 54 64 2d 3e 75 73 65  ;.  if( pTd->use
33e90 53 68 61 72 65 64 44 61 74 61 20 29 7b 0a 20 20  SharedData ){.  
33ea0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
33eb0 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52  .    Tcl_Obj *pR
33ec0 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28  et = Tcl_NewObj(
33ed0 29 3b 0a 20 20 20 20 66 6f 72 28 70 42 74 3d 70  );.    for(pBt=p
33ee0 54 64 2d 3e 70 42 74 72 65 65 3b 20 70 42 74 3b  Td->pBtree; pBt;
33ef0 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29   pBt=pBt->pNext)
33f00 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
33f10 61 72 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69  ar *zFile = sqli
33f20 74 65 33 70 61 67 65 72 5f 66 69 6c 65 6e 61 6d  te3pager_filenam
33f30 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  e(pBt->pPager);.
33f40 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62        Tcl_ListOb
33f50 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
33f60 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c  nterp, pRet, Tcl
33f70 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 46  _NewStringObj(zF
33f80 69 6c 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 20  ile, -1));.     
33f90 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
33fa0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
33fb0 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49  , pRet, Tcl_NewI
33fc0 6e 74 4f 62 6a 28 70 42 74 2d 3e 6e 52 65 66 29  ntObj(pBt->nRef)
33fd0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c  );.    }.    Tcl
33fe0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
33ff0 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20 20 7d  terp, pRet);.  }
34000 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
34010 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69   TCL_OK;.}.#endi
34020 66 0a                                            f.