/ Hex Artifact Content
Login

Artifact c4757940df58fc0914d2c4f1778a66101df2c6b9:


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 32 36 20 32 30 30 36 2f 30  c,v 1.326 2006/0
0190: 38 2f 30 38 20 31 33 3a 35 31 3a 34 33 20 64 72  8/08 13:51:43 dr
01a0: 68 20 45 78 70 20 24 0a 2a 2a 0a 2a 2a 20 54 68  h Exp $.**.** Th
01b0: 69 73 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e  is file implemen
01c0: 74 73 20 61 20 65 78 74 65 72 6e 61 6c 20 28 64  ts a external (d
01d0: 69 73 6b 2d 62 61 73 65 64 29 20 64 61 74 61 62  isk-based) datab
01e0: 61 73 65 20 75 73 69 6e 67 20 42 54 72 65 65 73  ase using BTrees
01f0: 2e 0a 2a 2a 20 46 6f 72 20 61 20 64 65 74 61 69  ..** For a detai
0200: 6c 65 64 20 64 69 73 63 75 73 73 69 6f 6e 20 6f  led discussion o
0210: 66 20 42 54 72 65 65 73 2c 20 72 65 66 65 72 20  f BTrees, refer 
0220: 74 6f 0a 2a 2a 0a 2a 2a 20 20 20 20 20 44 6f 6e  to.**.**     Don
0230: 61 6c 64 20 45 2e 20 4b 6e 75 74 68 2c 20 54 48  ald E. Knuth, TH
0240: 45 20 41 52 54 20 4f 46 20 43 4f 4d 50 55 54 45  E ART OF COMPUTE
0250: 52 20 50 52 4f 47 52 41 4d 4d 49 4e 47 2c 20 56  R PROGRAMMING, V
0260: 6f 6c 75 6d 65 20 33 3a 0a 2a 2a 20 20 20 20 20  olume 3:.**     
0270: 22 53 6f 72 74 69 6e 67 20 41 6e 64 20 53 65 61  "Sorting And Sea
0280: 72 63 68 69 6e 67 22 2c 20 70 61 67 65 73 20 34  rching", pages 4
0290: 37 33 2d 34 38 30 2e 20 41 64 64 69 73 6f 6e 2d  73-480. Addison-
02a0: 57 65 73 6c 65 79 0a 2a 2a 20 20 20 20 20 50 75  Wesley.**     Pu
02b0: 62 6c 69 73 68 69 6e 67 20 43 6f 6d 70 61 6e 79  blishing Company
02c0: 2c 20 52 65 61 64 69 6e 67 2c 20 4d 61 73 73 61  , Reading, Massa
02d0: 63 68 75 73 65 74 74 73 2e 0a 2a 2a 0a 2a 2a 20  chusetts..**.** 
02e0: 54 68 65 20 62 61 73 69 63 20 69 64 65 61 20 69  The basic idea i
02f0: 73 20 74 68 61 74 20 65 61 63 68 20 70 61 67 65  s that each page
0300: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e   of the file con
0310: 74 61 69 6e 73 20 4e 20 64 61 74 61 62 61 73 65  tains N database
0320: 0a 2a 2a 20 65 6e 74 72 69 65 73 20 61 6e 64 20  .** entries and 
0330: 4e 2b 31 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  N+1 pointers to 
0340: 73 75 62 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20  subpages..**.** 
0350: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
0360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0390: 2d 2d 0a 2a 2a 20 20 20 7c 20 20 50 74 72 28 30  --.**   |  Ptr(0
03a0: 29 20 7c 20 4b 65 79 28 30 29 20 7c 20 50 74 72  ) | Key(0) | Ptr
03b0: 28 31 29 20 7c 20 4b 65 79 28 31 29 20 7c 20 2e  (1) | Key(1) | .
03c0: 2e 2e 20 7c 20 4b 65 79 28 4e 29 20 7c 20 50 74  .. | Key(N) | Pt
03d0: 72 28 4e 2b 31 29 20 7c 0a 2a 2a 20 20 20 2d 2d  r(N+1) |.**   --
03e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
03f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
0420: 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20  *.** All of the 
0430: 6b 65 79 73 20 6f 6e 20 74 68 65 20 70 61 67 65  keys on the page
0440: 20 74 68 61 74 20 50 74 72 28 30 29 20 70 6f 69   that Ptr(0) poi
0450: 6e 74 73 20 74 6f 20 68 61 76 65 20 76 61 6c 75  nts to have valu
0460: 65 73 20 6c 65 73 73 0a 2a 2a 20 74 68 61 6e 20  es less.** than 
0470: 4b 65 79 28 30 29 2e 20 20 41 6c 6c 20 6f 66 20  Key(0).  All of 
0480: 74 68 65 20 6b 65 79 73 20 6f 6e 20 70 61 67 65  the keys on page
0490: 20 50 74 72 28 31 29 20 61 6e 64 20 69 74 73 20   Ptr(1) and its 
04a0: 73 75 62 70 61 67 65 73 20 68 61 76 65 0a 2a 2a  subpages have.**
04b0: 20 76 61 6c 75 65 73 20 67 72 65 61 74 65 72 20   values greater 
04c0: 74 68 61 6e 20 4b 65 79 28 30 29 20 61 6e 64 20  than Key(0) and 
04d0: 6c 65 73 73 20 74 68 61 6e 20 4b 65 79 28 31 29  less than Key(1)
04e0: 2e 20 20 41 6c 6c 20 6f 66 20 74 68 65 20 6b 65  .  All of the ke
04f0: 79 73 0a 2a 2a 20 6f 6e 20 50 74 72 28 4e 2b 31  ys.** on Ptr(N+1
0500: 29 20 61 6e 64 20 69 74 73 20 73 75 62 70 61 67  ) and its subpag
0510: 65 73 20 68 61 76 65 20 76 61 6c 75 65 73 20 67  es have values g
0520: 72 65 61 74 65 72 20 74 68 61 6e 20 4b 65 79 28  reater than Key(
0530: 4e 29 2e 20 20 41 6e 64 0a 2a 2a 20 73 6f 20 66  N).  And.** so f
0540: 6f 72 74 68 2e 0a 2a 2a 0a 2a 2a 20 46 69 6e 64  orth..**.** Find
0550: 69 6e 67 20 61 20 70 61 72 74 69 63 75 6c 61 72  ing a particular
0560: 20 6b 65 79 20 72 65 71 75 69 72 65 73 20 72 65   key requires re
0570: 61 64 69 6e 67 20 4f 28 6c 6f 67 28 4d 29 29 20  ading O(log(M)) 
0580: 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 0a  pages from the .
0590: 2a 2a 20 64 69 73 6b 20 77 68 65 72 65 20 4d 20  ** disk where M 
05a0: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
05b0: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
05c0: 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  tree..**.** In t
05d0: 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  his implementati
05e0: 6f 6e 2c 20 61 20 73 69 6e 67 6c 65 20 66 69 6c  on, a single fil
05f0: 65 20 63 61 6e 20 68 6f 6c 64 20 6f 6e 65 20 6f  e can hold one o
0600: 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20  r more separate 
0610: 0a 2a 2a 20 42 54 72 65 65 73 2e 20 20 45 61 63  .** BTrees.  Eac
0620: 68 20 42 54 72 65 65 20 69 73 20 69 64 65 6e 74  h BTree is ident
0630: 69 66 69 65 64 20 62 79 20 74 68 65 20 69 6e 64  ified by the ind
0640: 65 78 20 6f 66 20 69 74 73 20 72 6f 6f 74 20 70  ex of its root p
0650: 61 67 65 2e 20 20 54 68 65 0a 2a 2a 20 6b 65 79  age.  The.** key
0660: 20 61 6e 64 20 64 61 74 61 20 66 6f 72 20 61 6e   and data for an
0670: 79 20 65 6e 74 72 79 20 61 72 65 20 63 6f 6d 62  y entry are comb
0680: 69 6e 65 64 20 74 6f 20 66 6f 72 6d 20 74 68 65  ined to form the
0690: 20 22 70 61 79 6c 6f 61 64 22 2e 20 20 41 0a 2a   "payload".  A.*
06a0: 2a 20 66 69 78 65 64 20 61 6d 6f 75 6e 74 20 6f  * fixed amount o
06b0: 66 20 70 61 79 6c 6f 61 64 20 63 61 6e 20 62 65  f payload can be
06c0: 20 63 61 72 72 69 65 64 20 64 69 72 65 63 74 6c   carried directl
06d0: 79 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  y on the databas
06e0: 65 0a 2a 2a 20 70 61 67 65 2e 20 20 49 66 20 74  e.** page.  If t
06f0: 68 65 20 70 61 79 6c 6f 61 64 20 69 73 20 6c 61  he payload is la
0700: 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 70 72  rger than the pr
0710: 65 73 65 74 20 61 6d 6f 75 6e 74 20 74 68 65 6e  eset amount then
0720: 20 73 75 72 70 6c 75 73 0a 2a 2a 20 62 79 74 65   surplus.** byte
0730: 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20  s are stored on 
0740: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
0750: 20 54 68 65 20 70 61 79 6c 6f 61 64 20 66 6f 72   The payload for
0760: 20 61 6e 20 65 6e 74 72 79 0a 2a 2a 20 61 6e 64   an entry.** and
0770: 20 74 68 65 20 70 72 65 63 65 64 69 6e 67 20 70   the preceding p
0780: 6f 69 6e 74 65 72 20 61 72 65 20 63 6f 6d 62 69  ointer are combi
0790: 6e 65 64 20 74 6f 20 66 6f 72 6d 20 61 20 22 43  ned to form a "C
07a0: 65 6c 6c 22 2e 20 20 45 61 63 68 20 0a 2a 2a 20  ell".  Each .** 
07b0: 70 61 67 65 20 68 61 73 20 61 20 73 6d 61 6c 6c  page has a small
07c0: 20 68 65 61 64 65 72 20 77 68 69 63 68 20 63 6f   header which co
07d0: 6e 74 61 69 6e 73 20 74 68 65 20 50 74 72 28 4e  ntains the Ptr(N
07e0: 2b 31 29 20 70 6f 69 6e 74 65 72 20 61 6e 64 20  +1) pointer and 
07f0: 6f 74 68 65 72 0a 2a 2a 20 69 6e 66 6f 72 6d 61  other.** informa
0800: 74 69 6f 6e 20 73 75 63 68 20 61 73 20 74 68 65  tion such as the
0810: 20 73 69 7a 65 20 6f 66 20 6b 65 79 20 61 6e 64   size of key and
0820: 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 46 4f 52   data..**.** FOR
0830: 4d 41 54 20 44 45 54 41 49 4c 53 0a 2a 2a 0a 2a  MAT DETAILS.**.*
0840: 2a 20 54 68 65 20 66 69 6c 65 20 69 73 20 64 69  * The file is di
0850: 76 69 64 65 64 20 69 6e 74 6f 20 70 61 67 65 73  vided into pages
0860: 2e 20 20 54 68 65 20 66 69 72 73 74 20 70 61 67  .  The first pag
0870: 65 20 69 73 20 63 61 6c 6c 65 64 20 70 61 67 65  e is called page
0880: 20 31 2c 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e   1,.** the secon
0890: 64 20 69 73 20 70 61 67 65 20 32 2c 20 61 6e 64  d is page 2, and
08a0: 20 73 6f 20 66 6f 72 74 68 2e 20 20 41 20 70 61   so forth.  A pa
08b0: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 7a 65 72  ge number of zer
08c0: 6f 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 22  o indicates.** "
08d0: 6e 6f 20 73 75 63 68 20 70 61 67 65 22 2e 20 20  no such page".  
08e0: 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 63 61  The page size ca
08f0: 6e 20 62 65 20 61 6e 79 74 68 69 6e 67 20 62 65  n be anything be
0900: 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35  tween 512 and 65
0910: 35 33 36 2e 0a 2a 2a 20 45 61 63 68 20 70 61 67  536..** Each pag
0920: 65 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20  e can be either 
0930: 61 20 62 74 72 65 65 20 70 61 67 65 2c 20 61 20  a btree page, a 
0940: 66 72 65 65 6c 69 73 74 20 70 61 67 65 20 6f 72  freelist page or
0950: 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20   an overflow.** 
0960: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  page..**.** The 
0970: 66 69 72 73 74 20 70 61 67 65 20 69 73 20 61 6c  first page is al
0980: 77 61 79 73 20 61 20 62 74 72 65 65 20 70 61 67  ways a btree pag
0990: 65 2e 20 20 54 68 65 20 66 69 72 73 74 20 31 30  e.  The first 10
09a0: 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 66  0 bytes of the f
09b0: 69 72 73 74 0a 2a 2a 20 70 61 67 65 20 63 6f 6e  irst.** page con
09c0: 74 61 69 6e 20 61 20 73 70 65 63 69 61 6c 20 68  tain a special h
09d0: 65 61 64 65 72 20 28 74 68 65 20 22 66 69 6c 65  eader (the "file
09e0: 20 68 65 61 64 65 72 22 29 20 74 68 61 74 20 64   header") that d
09f0: 65 73 63 72 69 62 65 73 20 74 68 65 20 66 69 6c  escribes the fil
0a00: 65 2e 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74  e..** The format
0a10: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 68 65 61   of the file hea
0a20: 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  der is as follow
0a30: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f 46 46 53 45  s:.**.**   OFFSE
0a40: 54 20 20 20 53 49 5a 45 20 20 20 20 44 45 53 43  T   SIZE    DESC
0a50: 52 49 50 54 49 4f 4e 0a 2a 2a 20 20 20 20 20 20  RIPTION.**      
0a60: 30 20 20 20 20 20 20 31 36 20 20 20 20 20 48 65  0      16     He
0a70: 61 64 65 72 20 73 74 72 69 6e 67 3a 20 22 53 51  ader string: "SQ
0a80: 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 5c 30 30  Lite format 3\00
0a90: 30 22 0a 2a 2a 20 20 20 20 20 31 36 20 20 20 20  0".**     16    
0aa0: 20 20 20 32 20 20 20 20 20 50 61 67 65 20 73 69     2     Page si
0ab0: 7a 65 20 69 6e 20 62 79 74 65 73 2e 20 20 0a 2a  ze in bytes.  .*
0ac0: 2a 20 20 20 20 20 31 38 20 20 20 20 20 20 20 31  *     18       1
0ad0: 20 20 20 20 20 46 69 6c 65 20 66 6f 72 6d 61 74       File format
0ae0: 20 77 72 69 74 65 20 76 65 72 73 69 6f 6e 0a 2a   write version.*
0af0: 2a 20 20 20 20 20 31 39 20 20 20 20 20 20 20 31  *     19       1
0b00: 20 20 20 20 20 46 69 6c 65 20 66 6f 72 6d 61 74       File format
0b10: 20 72 65 61 64 20 76 65 72 73 69 6f 6e 0a 2a 2a   read version.**
0b20: 20 20 20 20 20 32 30 20 20 20 20 20 20 20 31 20       20       1 
0b30: 20 20 20 20 42 79 74 65 73 20 6f 66 20 75 6e 75      Bytes of unu
0b40: 73 65 64 20 73 70 61 63 65 20 61 74 20 74 68 65  sed space at the
0b50: 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67   end of each pag
0b60: 65 0a 2a 2a 20 20 20 20 20 32 31 20 20 20 20 20  e.**     21     
0b70: 20 20 31 20 20 20 20 20 4d 61 78 20 65 6d 62 65    1     Max embe
0b80: 64 64 65 64 20 70 61 79 6c 6f 61 64 20 66 72 61  dded payload fra
0b90: 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 32 32 20  ction.**     22 
0ba0: 20 20 20 20 20 20 31 20 20 20 20 20 4d 69 6e 20        1     Min 
0bb0: 65 6d 62 65 64 64 65 64 20 70 61 79 6c 6f 61 64  embedded payload
0bc0: 20 66 72 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20   fraction.**    
0bd0: 20 32 33 20 20 20 20 20 20 20 31 20 20 20 20 20   23       1     
0be0: 4d 69 6e 20 6c 65 61 66 20 70 61 79 6c 6f 61 64  Min leaf payload
0bf0: 20 66 72 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20   fraction.**    
0c00: 20 32 34 20 20 20 20 20 20 20 34 20 20 20 20 20   24       4     
0c10: 46 69 6c 65 20 63 68 61 6e 67 65 20 63 6f 75 6e  File change coun
0c20: 74 65 72 0a 2a 2a 20 20 20 20 20 32 38 20 20 20  ter.**     28   
0c30: 20 20 20 20 34 20 20 20 20 20 52 65 73 65 72 76      4     Reserv
0c40: 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75 73  ed for future us
0c50: 65 0a 2a 2a 20 20 20 20 20 33 32 20 20 20 20 20  e.**     32     
0c60: 20 20 34 20 20 20 20 20 46 69 72 73 74 20 66 72    4     First fr
0c70: 65 65 6c 69 73 74 20 70 61 67 65 0a 2a 2a 20 20  eelist page.**  
0c80: 20 20 20 33 36 20 20 20 20 20 20 20 34 20 20 20     36       4   
0c90: 20 20 4e 75 6d 62 65 72 20 6f 66 20 66 72 65 65    Number of free
0ca0: 6c 69 73 74 20 70 61 67 65 73 20 69 6e 20 74 68  list pages in th
0cb0: 65 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 34 30  e file.**     40
0cc0: 20 20 20 20 20 20 36 30 20 20 20 20 20 31 35 20        60     15 
0cd0: 34 2d 62 79 74 65 20 6d 65 74 61 20 76 61 6c 75  4-byte meta valu
0ce0: 65 73 20 70 61 73 73 65 64 20 74 6f 20 68 69 67  es passed to hig
0cf0: 68 65 72 20 6c 61 79 65 72 73 0a 2a 2a 0a 2a 2a  her layers.**.**
0d00: 20 41 6c 6c 20 6f 66 20 74 68 65 20 69 6e 74 65   All of the inte
0d10: 67 65 72 20 76 61 6c 75 65 73 20 61 72 65 20 62  ger values are b
0d20: 69 67 2d 65 6e 64 69 61 6e 20 28 6d 6f 73 74 20  ig-endian (most 
0d30: 73 69 67 6e 69 66 69 63 61 6e 74 20 62 79 74 65  significant byte
0d40: 20 66 69 72 73 74 29 2e 0a 2a 2a 0a 2a 2a 20 54   first)..**.** T
0d50: 68 65 20 66 69 6c 65 20 63 68 61 6e 67 65 20 63  he file change c
0d60: 6f 75 6e 74 65 72 20 69 73 20 69 6e 63 72 65 6d  ounter is increm
0d70: 65 6e 74 65 64 20 77 68 65 6e 20 74 68 65 20 64  ented when the d
0d80: 61 74 61 62 61 73 65 20 69 73 20 63 68 61 6e 67  atabase is chang
0d90: 65 64 20 6d 6f 72 65 0a 2a 2a 20 74 68 61 6e 20  ed more.** than 
0da0: 6f 6e 63 65 20 77 69 74 68 69 6e 20 74 68 65 20  once within the 
0db0: 73 61 6d 65 20 73 65 63 6f 6e 64 2e 20 20 54 68  same second.  Th
0dc0: 69 73 20 63 6f 75 6e 74 65 72 2c 20 74 6f 67 65  is counter, toge
0dd0: 74 68 65 72 20 77 69 74 68 20 74 68 65 0a 2a 2a  ther with the.**
0de0: 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 74 69   modification ti
0df0: 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2c 20  me of the file, 
0e00: 61 6c 6c 6f 77 73 20 6f 74 68 65 72 20 70 72 6f  allows other pro
0e10: 63 65 73 73 65 73 20 74 6f 20 6b 6e 6f 77 0a 2a  cesses to know.*
0e20: 2a 20 77 68 65 6e 20 74 68 65 20 66 69 6c 65 20  * when the file 
0e30: 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e 64 20  has changed and 
0e40: 74 68 75 73 20 77 68 65 6e 20 74 68 65 79 20 6e  thus when they n
0e50: 65 65 64 20 74 6f 20 66 6c 75 73 68 20 74 68 65  eed to flush the
0e60: 69 72 0a 2a 2a 20 63 61 63 68 65 2e 0a 2a 2a 0a  ir.** cache..**.
0e70: 2a 2a 20 54 68 65 20 6d 61 78 20 65 6d 62 65 64  ** The max embed
0e80: 64 65 64 20 70 61 79 6c 6f 61 64 20 66 72 61 63  ded payload frac
0e90: 74 69 6f 6e 20 69 73 20 74 68 65 20 61 6d 6f 75  tion is the amou
0ea0: 6e 74 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20  nt of the total 
0eb0: 75 73 61 62 6c 65 0a 2a 2a 20 73 70 61 63 65 20  usable.** space 
0ec0: 69 6e 20 61 20 70 61 67 65 20 74 68 61 74 20 63  in a page that c
0ed0: 61 6e 20 62 65 20 63 6f 6e 73 75 6d 65 64 20 62  an be consumed b
0ee0: 79 20 61 20 73 69 6e 67 6c 65 20 63 65 6c 6c 20  y a single cell 
0ef0: 66 6f 72 20 73 74 61 6e 64 61 72 64 0a 2a 2a 20  for standard.** 
0f00: 42 2d 74 72 65 65 20 28 6e 6f 6e 2d 4c 45 41 46  B-tree (non-LEAF
0f10: 44 41 54 41 29 20 74 61 62 6c 65 73 2e 20 20 41  DATA) tables.  A
0f20: 20 76 61 6c 75 65 20 6f 66 20 32 35 35 20 6d 65   value of 255 me
0f30: 61 6e 73 20 31 30 30 25 2e 20 20 54 68 65 20 64  ans 100%.  The d
0f40: 65 66 61 75 6c 74 0a 2a 2a 20 69 73 20 74 6f 20  efault.** is to 
0f50: 6c 69 6d 69 74 20 74 68 65 20 6d 61 78 69 6d 75  limit the maximu
0f60: 6d 20 63 65 6c 6c 20 73 69 7a 65 20 73 6f 20 74  m cell size so t
0f70: 68 61 74 20 61 74 20 6c 65 61 73 74 20 34 20 63  hat at least 4 c
0f80: 65 6c 6c 73 20 77 69 6c 6c 20 66 69 74 0a 2a 2a  ells will fit.**
0f90: 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 54   on one page.  T
0fa0: 68 75 73 20 74 68 65 20 64 65 66 61 75 6c 74 20  hus the default 
0fb0: 6d 61 78 20 65 6d 62 65 64 64 65 64 20 70 61 79  max embedded pay
0fc0: 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e 20 69 73  load fraction is
0fd0: 20 36 34 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68   64..**.** If th
0fe0: 65 20 70 61 79 6c 6f 61 64 20 66 6f 72 20 61 20  e payload for a 
0ff0: 63 65 6c 6c 20 69 73 20 6c 61 72 67 65 72 20 74  cell is larger t
1000: 68 61 6e 20 74 68 65 20 6d 61 78 20 70 61 79 6c  han the max payl
1010: 6f 61 64 2c 20 74 68 65 6e 20 65 78 74 72 61 0a  oad, then extra.
1020: 2a 2a 20 70 61 79 6c 6f 61 64 20 69 73 20 73 70  ** payload is sp
1030: 69 6c 6c 65 64 20 74 6f 20 6f 76 65 72 66 6c 6f  illed to overflo
1040: 77 20 70 61 67 65 73 2e 20 20 4f 6e 63 65 20 61  w pages.  Once a
1050: 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  n overflow page 
1060: 69 73 20 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a  is allocated,.**
1070: 20 61 73 20 6d 61 6e 79 20 62 79 74 65 73 20 61   as many bytes a
1080: 73 20 70 6f 73 73 69 62 6c 65 20 61 72 65 20 6d  s possible are m
1090: 6f 76 65 64 20 69 6e 74 6f 20 74 68 65 20 6f 76  oved into the ov
10a0: 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77 69 74  erflow pages wit
10b0: 68 6f 75 74 20 6c 65 74 74 69 6e 67 0a 2a 2a 20  hout letting.** 
10c0: 74 68 65 20 63 65 6c 6c 20 73 69 7a 65 20 64 72  the cell size dr
10d0: 6f 70 20 62 65 6c 6f 77 20 74 68 65 20 6d 69 6e  op below the min
10e0: 20 65 6d 62 65 64 64 65 64 20 70 61 79 6c 6f 61   embedded payloa
10f0: 64 20 66 72 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  d fraction..**.*
1100: 2a 20 54 68 65 20 6d 69 6e 20 6c 65 61 66 20 70  * The min leaf p
1110: 61 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e 20  ayload fraction 
1120: 69 73 20 6c 69 6b 65 20 74 68 65 20 6d 69 6e 20  is like the min 
1130: 65 6d 62 65 64 64 65 64 20 70 61 79 6c 6f 61 64  embedded payload
1140: 20 66 72 61 63 74 69 6f 6e 0a 2a 2a 20 65 78 63   fraction.** exc
1150: 65 70 74 20 74 68 61 74 20 69 74 20 61 70 70 6c  ept that it appl
1160: 69 65 73 20 74 6f 20 6c 65 61 66 20 6e 6f 64 65  ies to leaf node
1170: 73 20 69 6e 20 61 20 4c 45 41 46 44 41 54 41 20  s in a LEAFDATA 
1180: 74 72 65 65 2e 20 20 54 68 65 20 6d 61 78 69 6d  tree.  The maxim
1190: 75 6d 0a 2a 2a 20 70 61 79 6c 6f 61 64 20 66 72  um.** payload fr
11a0: 61 63 74 69 6f 6e 20 66 6f 72 20 61 20 4c 45 41  action for a LEA
11b0: 46 44 41 54 41 20 74 72 65 65 20 69 73 20 61 6c  FDATA tree is al
11c0: 77 61 79 73 20 31 30 30 25 20 28 6f 72 20 32 35  ways 100% (or 25
11d0: 35 29 20 61 6e 64 20 69 74 0a 2a 2a 20 6e 6f 74  5) and it.** not
11e0: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
11f0: 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  e header..**.** 
1200: 45 61 63 68 20 62 74 72 65 65 20 70 61 67 65 73  Each btree pages
1210: 20 69 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f   is divided into
1220: 20 74 68 72 65 65 20 73 65 63 74 69 6f 6e 73 3a   three sections:
1230: 20 20 54 68 65 20 68 65 61 64 65 72 2c 20 74 68    The header, th
1240: 65 0a 2a 2a 20 63 65 6c 6c 20 70 6f 69 6e 74 65  e.** cell pointe
1250: 72 20 61 72 72 61 79 2c 20 61 6e 64 20 74 68 65  r array, and the
1260: 20 63 65 6c 6c 20 61 72 65 61 20 61 72 65 61 2e   cell area area.
1270: 20 20 50 61 67 65 20 31 20 61 6c 73 6f 20 68 61    Page 1 also ha
1280: 73 20 61 20 31 30 30 2d 62 79 74 65 0a 2a 2a 20  s a 100-byte.** 
1290: 66 69 6c 65 20 68 65 61 64 65 72 20 74 68 61 74  file header that
12a0: 20 6f 63 63 75 72 73 20 62 65 66 6f 72 65 20 74   occurs before t
12b0: 68 65 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a  he page header..
12c0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 7c 2d 2d 2d 2d  **.**      |----
12d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 7c 0a 2a 2a  ------------|.**
12e0: 20 20 20 20 20 20 7c 20 66 69 6c 65 20 68 65 61        | file hea
12f0: 64 65 72 20 20 20 20 7c 20 20 20 31 30 30 20 62  der    |   100 b
1300: 79 74 65 73 2e 20 20 50 61 67 65 20 31 20 6f 6e  ytes.  Page 1 on
1310: 6c 79 2e 0a 2a 2a 20 20 20 20 20 20 7c 2d 2d 2d  ly..**      |---
1320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 7c 0a 2a  -------------|.*
1330: 2a 20 20 20 20 20 20 7c 20 70 61 67 65 20 68 65  *      | page he
1340: 61 64 65 72 20 20 20 20 7c 20 20 20 38 20 62 79  ader    |   8 by
1350: 74 65 73 20 66 6f 72 20 6c 65 61 76 65 73 2e 20  tes for leaves. 
1360: 20 31 32 20 62 79 74 65 73 20 66 6f 72 20 69 6e   12 bytes for in
1370: 74 65 72 69 6f 72 20 6e 6f 64 65 73 0a 2a 2a 20  terior nodes.** 
1380: 20 20 20 20 20 7c 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       |----------
1390: 2d 2d 2d 2d 2d 2d 7c 0a 2a 2a 20 20 20 20 20 20  ------|.**      
13a0: 7c 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 20  | cell pointer  
13b0: 20 7c 20 20 20 7c 20 20 32 20 62 79 74 65 73 20   |   |  2 bytes 
13c0: 70 65 72 20 63 65 6c 6c 2e 20 20 53 6f 72 74 65  per cell.  Sorte
13d0: 64 20 6f 72 64 65 72 2e 0a 2a 2a 20 20 20 20 20  d order..**     
13e0: 20 7c 20 61 72 72 61 79 20 20 20 20 20 20 20 20   | array        
13f0: 20 20 7c 20 20 20 7c 20 20 47 72 6f 77 73 20 64    |   |  Grows d
1400: 6f 77 6e 77 61 72 64 0a 2a 2a 20 20 20 20 20 20  ownward.**      
1410: 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |               
1420: 20 7c 20 20 20 76 0a 2a 2a 20 20 20 20 20 20 7c   |   v.**      |
1430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1440: 7c 0a 2a 2a 20 20 20 20 20 20 7c 20 75 6e 61 6c  |.**      | unal
1450: 6c 6f 63 61 74 65 64 20 20 20 20 7c 0a 2a 2a 20  located    |.** 
1460: 20 20 20 20 20 7c 20 73 70 61 63 65 20 20 20 20       | space    
1470: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
1480: 7c 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  |---------------
1490: 2d 7c 20 20 20 5e 20 20 47 72 6f 77 73 20 75 70  -|   ^  Grows up
14a0: 77 61 72 64 73 0a 2a 2a 20 20 20 20 20 20 7c 20  wards.**      | 
14b0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 20 20 7c  cell content   |
14c0: 20 20 20 7c 20 20 41 72 62 69 74 72 61 72 79 20     |  Arbitrary 
14d0: 6f 72 64 65 72 20 69 6e 74 65 72 73 70 65 72 73  order interspers
14e0: 65 64 20 77 69 74 68 20 66 72 65 65 62 6c 6f 63  ed with freebloc
14f0: 6b 73 2e 0a 2a 2a 20 20 20 20 20 20 7c 20 61 72  ks..**      | ar
1500: 65 61 20 20 20 20 20 20 20 20 20 20 20 7c 20 20  ea           |  
1510: 20 7c 20 20 61 6e 64 20 66 72 65 65 20 73 70 61   |  and free spa
1520: 63 65 20 66 72 61 67 6d 65 6e 74 73 2e 0a 2a 2a  ce fragments..**
1530: 20 20 20 20 20 20 7c 2d 2d 2d 2d 2d 2d 2d 2d 2d        |---------
1540: 2d 2d 2d 2d 2d 2d 2d 7c 0a 2a 2a 0a 2a 2a 20 54  -------|.**.** T
1550: 68 65 20 70 61 67 65 20 68 65 61 64 65 72 73 20  he page headers 
1560: 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a  looks like this:
1570: 0a 2a 2a 0a 2a 2a 20 20 20 4f 46 46 53 45 54 20  .**.**   OFFSET 
1580: 20 20 53 49 5a 45 20 20 20 20 20 44 45 53 43 52    SIZE     DESCR
1590: 49 50 54 49 4f 4e 0a 2a 2a 20 20 20 20 20 20 30  IPTION.**      0
15a0: 20 20 20 20 20 20 20 31 20 20 20 20 20 20 46 6c         1      Fl
15b0: 61 67 73 2e 20 31 3a 20 69 6e 74 6b 65 79 2c 20  ags. 1: intkey, 
15c0: 32 3a 20 7a 65 72 6f 64 61 74 61 2c 20 34 3a 20  2: zerodata, 4: 
15d0: 6c 65 61 66 64 61 74 61 2c 20 38 3a 20 6c 65 61  leafdata, 8: lea
15e0: 66 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20  f.**      1     
15f0: 20 20 32 20 20 20 20 20 20 62 79 74 65 20 6f 66    2      byte of
1600: 66 73 65 74 20 74 6f 20 74 68 65 20 66 69 72 73  fset to the firs
1610: 74 20 66 72 65 65 62 6c 6f 63 6b 0a 2a 2a 20 20  t freeblock.**  
1620: 20 20 20 20 33 20 20 20 20 20 20 20 32 20 20 20      3       2   
1630: 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c     number of cel
1640: 6c 73 20 6f 6e 20 74 68 69 73 20 70 61 67 65 0a  ls on this page.
1650: 2a 2a 20 20 20 20 20 20 35 20 20 20 20 20 20 20  **      5       
1660: 32 20 20 20 20 20 20 66 69 72 73 74 20 62 79 74  2      first byt
1670: 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  e of the cell co
1680: 6e 74 65 6e 74 20 61 72 65 61 0a 2a 2a 20 20 20  ntent area.**   
1690: 20 20 20 37 20 20 20 20 20 20 20 31 20 20 20 20     7       1    
16a0: 20 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 67    number of frag
16b0: 6d 65 6e 74 65 64 20 66 72 65 65 20 62 79 74 65  mented free byte
16c0: 73 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20  s.**      8     
16d0: 20 20 34 20 20 20 20 20 20 52 69 67 68 74 20 63    4      Right c
16e0: 68 69 6c 64 20 28 74 68 65 20 50 74 72 28 4e 2b  hild (the Ptr(N+
16f0: 31 29 20 76 61 6c 75 65 29 2e 20 20 4f 6d 69 74  1) value).  Omit
1700: 74 65 64 20 6f 6e 20 6c 65 61 76 65 73 2e 0a 2a  ted on leaves..*
1710: 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 64  *.** The flags d
1720: 65 66 69 6e 65 20 74 68 65 20 66 6f 72 6d 61 74  efine the format
1730: 20 6f 66 20 74 68 69 73 20 62 74 72 65 65 20 70   of this btree p
1740: 61 67 65 2e 20 20 54 68 65 20 6c 65 61 66 20 66  age.  The leaf f
1750: 6c 61 67 20 6d 65 61 6e 73 20 74 68 61 74 0a 2a  lag means that.*
1760: 2a 20 74 68 69 73 20 70 61 67 65 20 68 61 73 20  * this page has 
1770: 6e 6f 20 63 68 69 6c 64 72 65 6e 2e 20 20 54 68  no children.  Th
1780: 65 20 7a 65 72 6f 64 61 74 61 20 66 6c 61 67 20  e zerodata flag 
1790: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 20  means that this 
17a0: 70 61 67 65 20 63 61 72 72 69 65 73 0a 2a 2a 20  page carries.** 
17b0: 6f 6e 6c 79 20 6b 65 79 73 20 61 6e 64 20 6e 6f  only keys and no
17c0: 20 64 61 74 61 2e 20 20 54 68 65 20 69 6e 74 6b   data.  The intk
17d0: 65 79 20 66 6c 61 67 20 6d 65 61 6e 73 20 74 68  ey flag means th
17e0: 61 74 20 74 68 65 20 6b 65 79 20 69 73 20 61 20  at the key is a 
17f0: 69 6e 74 65 67 65 72 0a 2a 2a 20 77 68 69 63 68  integer.** which
1800: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68   is stored in th
1810: 65 20 6b 65 79 20 73 69 7a 65 20 65 6e 74 72 79  e key size entry
1820: 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 68 65 61   of the cell hea
1830: 64 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20  der rather than 
1840: 69 6e 0a 2a 2a 20 74 68 65 20 70 61 79 6c 6f 61  in.** the payloa
1850: 64 20 61 72 65 61 2e 0a 2a 2a 0a 2a 2a 20 54 68  d area..**.** Th
1860: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
1870: 72 72 61 79 20 62 65 67 69 6e 73 20 6f 6e 20 74  rray begins on t
1880: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 61 66  he first byte af
1890: 74 65 72 20 74 68 65 20 70 61 67 65 20 68 65 61  ter the page hea
18a0: 64 65 72 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c  der..** The cell
18b0: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 63   pointer array c
18c0: 6f 6e 74 61 69 6e 73 20 7a 65 72 6f 20 6f 72 20  ontains zero or 
18d0: 6d 6f 72 65 20 32 2d 62 79 74 65 20 6e 75 6d 62  more 2-byte numb
18e0: 65 72 73 20 77 68 69 63 68 20 61 72 65 0a 2a 2a  ers which are.**
18f0: 20 6f 66 66 73 65 74 73 20 66 72 6f 6d 20 74 68   offsets from th
1900: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
1910: 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 63  he page to the c
1920: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74  ell content in t
1930: 68 65 20 63 65 6c 6c 0a 2a 2a 20 63 6f 6e 74 65  he cell.** conte
1940: 6e 74 20 61 72 65 61 2e 20 20 54 68 65 20 63 65  nt area.  The ce
1950: 6c 6c 20 70 6f 69 6e 74 65 72 73 20 6f 63 63 75  ll pointers occu
1960: 72 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65  r in sorted orde
1970: 72 2e 20 20 54 68 65 20 73 79 73 74 65 6d 20 73  r.  The system s
1980: 74 72 69 76 65 73 0a 2a 2a 20 74 6f 20 6b 65 65  trives.** to kee
1990: 70 20 66 72 65 65 20 73 70 61 63 65 20 61 66 74  p free space aft
19a0: 65 72 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c  er the last cell
19b0: 20 70 6f 69 6e 74 65 72 20 73 6f 20 74 68 61 74   pointer so that
19c0: 20 6e 65 77 20 63 65 6c 6c 73 20 63 61 6e 0a 2a   new cells can.*
19d0: 2a 20 62 65 20 65 61 73 69 6c 79 20 61 64 64 65  * be easily adde
19e0: 64 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  d without having
19f0: 20 74 6f 20 64 65 66 72 61 67 6d 65 6e 74 20 74   to defragment t
1a00: 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 43  he page..**.** C
1a10: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 73  ell content is s
1a20: 74 6f 72 65 64 20 61 74 20 74 68 65 20 76 65 72  tored at the ver
1a30: 79 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  y end of the pag
1a40: 65 20 61 6e 64 20 67 72 6f 77 73 20 74 6f 77 61  e and grows towa
1a50: 72 64 20 74 68 65 0a 2a 2a 20 62 65 67 69 6e 6e  rd the.** beginn
1a60: 69 6e 67 20 6f 66 20 74 68 65 20 70 61 67 65 2e  ing of the page.
1a70: 0a 2a 2a 0a 2a 2a 20 55 6e 75 73 65 64 20 73 70  .**.** Unused sp
1a80: 61 63 65 20 77 69 74 68 69 6e 20 74 68 65 20 63  ace within the c
1a90: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
1aa0: 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e   is collected in
1ab0: 74 6f 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74  to a linked list
1ac0: 20 6f 66 0a 2a 2a 20 66 72 65 65 62 6c 6f 63 6b   of.** freeblock
1ad0: 73 2e 20 20 45 61 63 68 20 66 72 65 65 62 6c 6f  s.  Each freeblo
1ae0: 63 6b 20 69 73 20 61 74 20 6c 65 61 73 74 20 34  ck is at least 4
1af0: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
1b00: 20 54 68 65 20 62 79 74 65 20 6f 66 66 73 65 74   The byte offset
1b10: 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74  .** to the first
1b20: 20 66 72 65 65 62 6c 6f 63 6b 20 69 73 20 67 69   freeblock is gi
1b30: 76 65 6e 20 69 6e 20 74 68 65 20 68 65 61 64 65  ven in the heade
1b40: 72 2e 20 20 46 72 65 65 62 6c 6f 63 6b 73 20 6f  r.  Freeblocks o
1b50: 63 63 75 72 20 69 6e 0a 2a 2a 20 69 6e 63 72 65  ccur in.** incre
1b60: 61 73 69 6e 67 20 6f 72 64 65 72 2e 20 20 42 65  asing order.  Be
1b70: 63 61 75 73 65 20 61 20 66 72 65 65 62 6c 6f 63  cause a freebloc
1b80: 6b 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  k must be at lea
1b90: 73 74 20 34 20 62 79 74 65 73 20 69 6e 20 73 69  st 4 bytes in si
1ba0: 7a 65 2c 0a 2a 2a 20 61 6e 79 20 67 72 6f 75 70  ze,.** any group
1bb0: 20 6f 66 20 33 20 6f 72 20 66 65 77 65 72 20 75   of 3 or fewer u
1bc0: 6e 75 73 65 64 20 62 79 74 65 73 20 69 6e 20 74  nused bytes in t
1bd0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
1be0: 61 72 65 61 20 63 61 6e 6e 6f 74 0a 2a 2a 20 65  area cannot.** e
1bf0: 78 69 73 74 20 6f 6e 20 74 68 65 20 66 72 65 65  xist on the free
1c00: 62 6c 6f 63 6b 20 63 68 61 69 6e 2e 20 20 41 20  block chain.  A 
1c10: 67 72 6f 75 70 20 6f 66 20 33 20 6f 72 20 66 65  group of 3 or fe
1c20: 77 65 72 20 66 72 65 65 20 62 79 74 65 73 20 69  wer free bytes i
1c30: 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 20 66 72  s called.** a fr
1c40: 61 67 6d 65 6e 74 2e 20 20 54 68 65 20 74 6f 74  agment.  The tot
1c50: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  al number of byt
1c60: 65 73 20 69 6e 20 61 6c 6c 20 66 72 61 67 6d 65  es in all fragme
1c70: 6e 74 73 20 69 73 20 72 65 63 6f 72 64 65 64 2e  nts is recorded.
1c80: 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20  .** in the page 
1c90: 68 65 61 64 65 72 20 61 74 20 6f 66 66 73 65 74  header at offset
1ca0: 20 37 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 49 5a   7..**.**    SIZ
1cb0: 45 20 20 20 20 44 45 53 43 52 49 50 54 49 4f 4e  E    DESCRIPTION
1cc0: 0a 2a 2a 20 20 20 20 20 20 32 20 20 20 20 20 42  .**      2     B
1cd0: 79 74 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68  yte offset of th
1ce0: 65 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b  e next freeblock
1cf0: 0a 2a 2a 20 20 20 20 20 20 32 20 20 20 20 20 42  .**      2     B
1d00: 79 74 65 73 20 69 6e 20 74 68 69 73 20 66 72 65  ytes in this fre
1d10: 65 62 6c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 43 65 6c  eblock.**.** Cel
1d20: 6c 73 20 61 72 65 20 6f 66 20 76 61 72 69 61 62  ls are of variab
1d30: 6c 65 20 6c 65 6e 67 74 68 2e 20 20 43 65 6c 6c  le length.  Cell
1d40: 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20  s are stored in 
1d50: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
1d60: 20 61 72 65 61 20 61 74 0a 2a 2a 20 74 68 65 20   area at.** the 
1d70: 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e  end of the page.
1d80: 20 20 50 6f 69 6e 74 65 72 73 20 74 6f 20 74 68    Pointers to th
1d90: 65 20 63 65 6c 6c 73 20 61 72 65 20 69 6e 20 74  e cells are in t
1da0: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
1db0: 61 72 72 61 79 0a 2a 2a 20 74 68 61 74 20 69 6d  array.** that im
1dc0: 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
1dd0: 73 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  s the page heade
1de0: 72 2e 20 20 43 65 6c 6c 73 20 69 73 20 6e 6f 74  r.  Cells is not
1df0: 20 6e 65 63 65 73 73 61 72 69 6c 79 0a 2a 2a 20   necessarily.** 
1e00: 63 6f 6e 74 69 67 75 6f 75 73 20 6f 72 20 69 6e  contiguous or in
1e10: 20 6f 72 64 65 72 2c 20 62 75 74 20 63 65 6c 6c   order, but cell
1e20: 20 70 6f 69 6e 74 65 72 73 20 61 72 65 20 63 6f   pointers are co
1e30: 6e 74 69 67 75 6f 75 73 20 61 6e 64 20 69 6e 20  ntiguous and in 
1e40: 6f 72 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 65 6c  order..**.** Cel
1e50: 6c 20 63 6f 6e 74 65 6e 74 20 6d 61 6b 65 73 20  l content makes 
1e60: 75 73 65 20 6f 66 20 76 61 72 69 61 62 6c 65 20  use of variable 
1e70: 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 73 2e  length integers.
1e80: 20 20 41 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20    A variable.** 
1e90: 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 20 69  length integer i
1ea0: 73 20 31 20 74 6f 20 39 20 62 79 74 65 73 20 77  s 1 to 9 bytes w
1eb0: 68 65 72 65 20 74 68 65 20 6c 6f 77 65 72 20 37  here the lower 7
1ec0: 20 62 69 74 73 20 6f 66 20 65 61 63 68 20 0a 2a   bits of each .*
1ed0: 2a 20 62 79 74 65 20 61 72 65 20 75 73 65 64 2e  * byte are used.
1ee0: 20 20 54 68 65 20 69 6e 74 65 67 65 72 20 63 6f    The integer co
1ef0: 6e 73 69 73 74 73 20 6f 66 20 61 6c 6c 20 62 79  nsists of all by
1f00: 74 65 73 20 74 68 61 74 20 68 61 76 65 20 62 69  tes that have bi
1f10: 74 20 38 20 73 65 74 20 61 6e 64 0a 2a 2a 20 74  t 8 set and.** t
1f20: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 77 69  he first byte wi
1f30: 74 68 20 62 69 74 20 38 20 63 6c 65 61 72 2e 20  th bit 8 clear. 
1f40: 20 54 68 65 20 6d 6f 73 74 20 73 69 67 6e 69 66   The most signif
1f50: 69 63 61 6e 74 20 62 79 74 65 20 6f 66 20 74 68  icant byte of th
1f60: 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 61 70 70  e integer.** app
1f70: 65 61 72 73 20 66 69 72 73 74 2e 20 20 41 20 76  ears first.  A v
1f80: 61 72 69 61 62 6c 65 2d 6c 65 6e 67 74 68 20 69  ariable-length i
1f90: 6e 74 65 67 65 72 20 6d 61 79 20 6e 6f 74 20 62  nteger may not b
1fa0: 65 20 6d 6f 72 65 20 74 68 61 6e 20 39 20 62 79  e more than 9 by
1fb0: 74 65 73 20 6c 6f 6e 67 2e 0a 2a 2a 20 41 73 20  tes long..** As 
1fc0: 61 20 73 70 65 63 69 61 6c 20 63 61 73 65 2c 20  a special case, 
1fd0: 61 6c 6c 20 38 20 62 79 74 65 73 20 6f 66 20 74  all 8 bytes of t
1fe0: 68 65 20 39 74 68 20 62 79 74 65 20 61 72 65 20  he 9th byte are 
1ff0: 75 73 65 64 20 61 73 20 64 61 74 61 2e 20 20 54  used as data.  T
2000: 68 69 73 0a 2a 2a 20 61 6c 6c 6f 77 73 20 61 20  his.** allows a 
2010: 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 74  64-bit integer t
2020: 6f 20 62 65 20 65 6e 63 6f 64 65 64 20 69 6e 20  o be encoded in 
2030: 39 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  9 bytes..**.**  
2040: 20 20 30 78 30 30 20 20 20 20 20 20 20 20 20 20    0x00          
2050: 20 20 20 20 20 20 20 20 20 20 20 20 62 65 63 6f              beco
2060: 6d 65 73 20 20 30 78 30 30 30 30 30 30 30 30 0a  mes  0x00000000.
2070: 2a 2a 20 20 20 20 30 78 37 66 20 20 20 20 20 20  **    0x7f      
2080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2090: 62 65 63 6f 6d 65 73 20 20 30 78 30 30 30 30 30  becomes  0x00000
20a0: 30 37 66 0a 2a 2a 20 20 20 20 30 78 38 31 20 30  07f.**    0x81 0
20b0: 78 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20  x00             
20c0: 20 20 20 20 62 65 63 6f 6d 65 73 20 20 30 78 30      becomes  0x0
20d0: 30 30 30 30 30 38 30 0a 2a 2a 20 20 20 20 30 78  0000080.**    0x
20e0: 38 32 20 30 78 30 30 20 20 20 20 20 20 20 20 20  82 0x00         
20f0: 20 20 20 20 20 20 20 20 62 65 63 6f 6d 65 73 20          becomes 
2100: 20 30 78 30 30 30 30 30 31 30 30 0a 2a 2a 20 20   0x00000100.**  
2110: 20 20 30 78 38 30 20 30 78 37 66 20 20 20 20 20    0x80 0x7f     
2120: 20 20 20 20 20 20 20 20 20 20 20 20 62 65 63 6f              beco
2130: 6d 65 73 20 20 30 78 30 30 30 30 30 30 37 66 0a  mes  0x0000007f.
2140: 2a 2a 20 20 20 20 30 78 38 61 20 30 78 39 31 20  **    0x8a 0x91 
2150: 30 78 64 31 20 30 78 61 63 20 30 78 37 38 20 20  0xd1 0xac 0x78  
2160: 62 65 63 6f 6d 65 73 20 20 30 78 31 32 33 34 35  becomes  0x12345
2170: 36 37 38 0a 2a 2a 20 20 20 20 30 78 38 31 20 30  678.**    0x81 0
2180: 78 38 31 20 30 78 38 31 20 30 78 38 31 20 30 78  x81 0x81 0x81 0x
2190: 30 31 20 20 62 65 63 6f 6d 65 73 20 20 30 78 31  01  becomes  0x1
21a0: 30 32 30 34 30 38 31 0a 2a 2a 0a 2a 2a 20 56 61  0204081.**.** Va
21b0: 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e  riable length in
21c0: 74 65 67 65 72 73 20 61 72 65 20 75 73 65 64 20  tegers are used 
21d0: 66 6f 72 20 72 6f 77 69 64 73 20 61 6e 64 20 74  for rowids and t
21e0: 6f 20 68 6f 6c 64 20 74 68 65 20 6e 75 6d 62 65  o hold the numbe
21f0: 72 20 6f 66 0a 2a 2a 20 62 79 74 65 73 20 6f 66  r of.** bytes of
2200: 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 69 6e   key and data in
2210: 20 61 20 62 74 72 65 65 20 63 65 6c 6c 2e 0a 2a   a btree cell..*
2220: 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74  *.** The content
2230: 20 6f 66 20 61 20 63 65 6c 6c 20 6c 6f 6f 6b 73   of a cell looks
2240: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
2250: 2a 20 20 20 20 53 49 5a 45 20 20 20 20 44 45 53  *    SIZE    DES
2260: 43 52 49 50 54 49 4f 4e 0a 2a 2a 20 20 20 20 20  CRIPTION.**     
2270: 20 34 20 20 20 20 20 50 61 67 65 20 6e 75 6d 62   4     Page numb
2280: 65 72 20 6f 66 20 74 68 65 20 6c 65 66 74 20 63  er of the left c
2290: 68 69 6c 64 2e 20 4f 6d 69 74 74 65 64 20 69 66  hild. Omitted if
22a0: 20 6c 65 61 66 20 66 6c 61 67 20 69 73 20 73 65   leaf flag is se
22b0: 74 2e 0a 2a 2a 20 20 20 20 20 76 61 72 20 20 20  t..**     var   
22c0: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
22d0: 20 6f 66 20 64 61 74 61 2e 20 4f 6d 69 74 74 65   of data. Omitte
22e0: 64 20 69 66 20 74 68 65 20 7a 65 72 6f 64 61 74  d if the zerodat
22f0: 61 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a 2a  a flag is set..*
2300: 2a 20 20 20 20 20 76 61 72 20 20 20 20 4e 75 6d  *     var    Num
2310: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
2320: 6b 65 79 2e 20 4f 72 20 74 68 65 20 6b 65 79 20  key. Or the key 
2330: 69 74 73 65 6c 66 20 69 66 20 69 6e 74 6b 65 79  itself if intkey
2340: 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a 2a 2a   flag is set..**
2350: 20 20 20 20 20 20 2a 20 20 20 20 20 50 61 79 6c        *     Payl
2360: 6f 61 64 0a 2a 2a 20 20 20 20 20 20 34 20 20 20  oad.**      4   
2370: 20 20 46 69 72 73 74 20 70 61 67 65 20 6f 66 20    First page of 
2380: 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61  the overflow cha
2390: 69 6e 2e 20 20 4f 6d 69 74 74 65 64 20 69 66 20  in.  Omitted if 
23a0: 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 0a 2a  no overflow.**.*
23b0: 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  * Overflow pages
23c0: 20 66 6f 72 6d 20 61 20 6c 69 6e 6b 65 64 20 6c   form a linked l
23d0: 69 73 74 2e 20 20 45 61 63 68 20 70 61 67 65 20  ist.  Each page 
23e0: 65 78 63 65 70 74 20 74 68 65 20 6c 61 73 74 20  except the last 
23f0: 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 2a 2a  is completely.**
2400: 20 66 69 6c 6c 65 64 20 77 69 74 68 20 64 61 74   filled with dat
2410: 61 20 28 70 61 67 65 73 69 7a 65 20 2d 20 34 20  a (pagesize - 4 
2420: 62 79 74 65 73 29 2e 20 20 54 68 65 20 6c 61 73  bytes).  The las
2430: 74 20 70 61 67 65 20 63 61 6e 20 68 61 76 65 20  t page can have 
2440: 61 73 20 6c 69 74 74 6c 65 0a 2a 2a 20 61 73 20  as little.** as 
2450: 31 20 62 79 74 65 20 6f 66 20 64 61 74 61 2e 0a  1 byte of data..
2460: 2a 2a 0a 2a 2a 20 20 20 20 53 49 5a 45 20 20 20  **.**    SIZE   
2470: 20 44 45 53 43 52 49 50 54 49 4f 4e 0a 2a 2a 20   DESCRIPTION.** 
2480: 20 20 20 20 20 34 20 20 20 20 20 50 61 67 65 20       4     Page 
2490: 6e 75 6d 62 65 72 20 6f 66 20 6e 65 78 74 20 6f  number of next o
24a0: 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 2a 2a 20  verflow page.** 
24b0: 20 20 20 20 20 2a 20 20 20 20 20 44 61 74 61 0a       *     Data.
24c0: 2a 2a 0a 2a 2a 20 46 72 65 65 6c 69 73 74 20 70  **.** Freelist p
24d0: 61 67 65 73 20 63 6f 6d 65 20 69 6e 20 74 77 6f  ages come in two
24e0: 20 73 75 62 74 79 70 65 73 3a 20 74 72 75 6e 6b   subtypes: trunk
24f0: 20 70 61 67 65 73 20 61 6e 64 20 6c 65 61 66 20   pages and leaf 
2500: 70 61 67 65 73 2e 20 20 54 68 65 0a 2a 2a 20 66  pages.  The.** f
2510: 69 6c 65 20 68 65 61 64 65 72 20 70 6f 69 6e 74  ile header point
2520: 73 20 74 6f 20 66 69 72 73 74 20 69 6e 20 61 20  s to first in a 
2530: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 74  linked list of t
2540: 72 75 6e 6b 20 70 61 67 65 2e 20 20 45 61 63 68  runk page.  Each
2550: 20 74 72 75 6e 6b 0a 2a 2a 20 70 61 67 65 20 70   trunk.** page p
2560: 6f 69 6e 74 73 20 74 6f 20 6d 75 6c 74 69 70 6c  oints to multipl
2570: 65 20 6c 65 61 66 20 70 61 67 65 73 2e 20 20 54  e leaf pages.  T
2580: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
2590: 6c 65 61 66 20 70 61 67 65 20 69 73 0a 2a 2a 20  leaf page is.** 
25a0: 75 6e 73 70 65 63 69 66 69 65 64 2e 20 20 41 20  unspecified.  A 
25b0: 74 72 75 6e 6b 20 70 61 67 65 20 6c 6f 6f 6b 73  trunk page looks
25c0: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
25d0: 2a 20 20 20 20 53 49 5a 45 20 20 20 20 44 45 53  *    SIZE    DES
25e0: 43 52 49 50 54 49 4f 4e 0a 2a 2a 20 20 20 20 20  CRIPTION.**     
25f0: 20 34 20 20 20 20 20 50 61 67 65 20 6e 75 6d 62   4     Page numb
2600: 65 72 20 6f 66 20 6e 65 78 74 20 74 72 75 6e 6b  er of next trunk
2610: 20 70 61 67 65 0a 2a 2a 20 20 20 20 20 20 34 20   page.**      4 
2620: 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65      Number of le
2630: 61 66 20 70 6f 69 6e 74 65 72 73 20 6f 6e 20 74  af pointers on t
2640: 68 69 73 20 70 61 67 65 0a 2a 2a 20 20 20 20 20  his page.**     
2650: 20 2a 20 20 20 20 20 7a 65 72 6f 20 6f 72 20 6d   *     zero or m
2660: 6f 72 65 20 70 61 67 65 73 20 6e 75 6d 62 65 72  ore pages number
2670: 73 20 6f 66 20 6c 65 61 76 65 73 0a 2a 2f 0a 23  s of leaves.*/.#
2680: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
2690: 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22  nt.h".#include "
26a0: 70 61 67 65 72 2e 68 22 0a 23 69 6e 63 6c 75 64  pager.h".#includ
26b0: 65 20 22 62 74 72 65 65 2e 68 22 0a 23 69 6e 63  e "btree.h".#inc
26c0: 6c 75 64 65 20 22 6f 73 2e 68 22 0a 23 69 6e 63  lude "os.h".#inc
26d0: 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a  lude <assert.h>.
26e0: 0a 2f 2a 20 52 6f 75 6e 64 20 75 70 20 61 20 6e  ./* Round up a n
26f0: 75 6d 62 65 72 20 74 6f 20 74 68 65 20 6e 65 78  umber to the nex
2700: 74 20 6c 61 72 67 65 72 20 6d 75 6c 74 69 70 6c  t larger multipl
2710: 65 20 6f 66 20 38 2e 20 20 54 68 69 73 20 69 73  e of 8.  This is
2720: 20 75 73 65 64 0a 2a 2a 20 74 6f 20 66 6f 72 63   used.** to forc
2730: 65 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65  e 8-byte alignme
2740: 6e 74 20 6f 6e 20 36 34 2d 62 69 74 20 61 72 63  nt on 64-bit arc
2750: 68 69 74 65 63 74 75 72 65 73 2e 0a 2a 2f 0a 23  hitectures..*/.#
2760: 64 65 66 69 6e 65 20 52 4f 55 4e 44 38 28 78 29  define ROUND8(x)
2770: 20 20 20 28 28 78 2b 37 29 26 7e 37 29 0a 0a 0a     ((x+7)&~7)...
2780: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
2790: 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6d 61   value is the ma
27a0: 78 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20  ximum cell size 
27b0: 61 73 73 75 6d 69 6e 67 20 61 20 6d 61 78 69 6d  assuming a maxim
27c0: 75 6d 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20  um page.** size 
27d0: 67 69 76 65 20 61 62 6f 76 65 2e 0a 2a 2f 0a 23  give above..*/.#
27e0: 64 65 66 69 6e 65 20 4d 58 5f 43 45 4c 4c 5f 53  define MX_CELL_S
27f0: 49 5a 45 28 70 42 74 29 20 20 28 70 42 74 2d 3e  IZE(pBt)  (pBt->
2800: 70 61 67 65 53 69 7a 65 2d 38 29 0a 0a 2f 2a 20  pageSize-8)../* 
2810: 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  The maximum numb
2820: 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 61  er of cells on a
2830: 20 73 69 6e 67 6c 65 20 70 61 67 65 20 6f 66 20   single page of 
2840: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
2850: 68 69 73 0a 2a 2a 20 61 73 73 75 6d 65 73 20 61  his.** assumes a
2860: 20 6d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69   minimum cell si
2870: 7a 65 20 6f 66 20 33 20 62 79 74 65 73 2e 20 20  ze of 3 bytes.  
2880: 53 75 63 68 20 73 6d 61 6c 6c 20 63 65 6c 6c 73  Such small cells
2890: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 65 78 63 65   will be.** exce
28a0: 65 64 69 6e 67 6c 79 20 72 61 72 65 2c 20 62 75  edingly rare, bu
28b0: 74 20 74 68 65 79 20 61 72 65 20 70 6f 73 73 69  t they are possi
28c0: 62 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ble..*/.#define 
28d0: 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 28 28 70  MX_CELL(pBt) ((p
28e0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 38 29 2f  Bt->pageSize-8)/
28f0: 33 29 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64  3)../* Forward d
2900: 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 74  eclarations */.t
2910: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 4d 65  ypedef struct Me
2920: 6d 50 61 67 65 20 4d 65 6d 50 61 67 65 3b 0a 74  mPage MemPage;.t
2930: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 42 74  ypedef struct Bt
2940: 4c 6f 63 6b 20 42 74 4c 6f 63 6b 3b 0a 0a 2f 2a  Lock BtLock;../*
2950: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 6d 61  .** This is a ma
2960: 67 69 63 20 73 74 72 69 6e 67 20 74 68 61 74 20  gic string that 
2970: 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62  appears at the b
2980: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72  eginning of ever
2990: 79 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61  y.** SQLite data
29a0: 62 61 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  base in order to
29b0: 20 69 64 65 6e 74 69 66 79 20 74 68 65 20 66 69   identify the fi
29c0: 6c 65 20 61 73 20 61 20 72 65 61 6c 20 64 61 74  le as a real dat
29d0: 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 59 6f 75  abase..**.** You
29e0: 20 63 61 6e 20 63 68 61 6e 67 65 20 74 68 69 73   can change this
29f0: 20 76 61 6c 75 65 20 61 74 20 63 6f 6d 70 69 6c   value at compil
2a00: 65 2d 74 69 6d 65 20 62 79 20 73 70 65 63 69 66  e-time by specif
2a10: 79 69 6e 67 20 61 0a 2a 2a 20 2d 44 53 51 4c 49  ying a.** -DSQLI
2a20: 54 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3d 22  TE_FILE_HEADER="
2a30: 2e 2e 2e 22 20 6f 6e 20 74 68 65 20 63 6f 6d 70  ..." on the comp
2a40: 69 6c 65 72 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e  iler command-lin
2a50: 65 2e 20 20 54 68 65 0a 2a 2a 20 68 65 61 64 65  e.  The.** heade
2a60: 72 20 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c  r must be exactl
2a70: 79 20 31 36 20 62 79 74 65 73 20 69 6e 63 6c 75  y 16 bytes inclu
2a80: 64 69 6e 67 20 74 68 65 20 7a 65 72 6f 2d 74 65  ding the zero-te
2a90: 72 6d 69 6e 61 74 6f 72 20 73 6f 0a 2a 2a 20 74  rminator so.** t
2aa0: 68 65 20 73 74 72 69 6e 67 20 69 74 73 65 6c 66  he string itself
2ab0: 20 73 68 6f 75 6c 64 20 62 65 20 31 35 20 63 68   should be 15 ch
2ac0: 61 72 61 63 74 65 72 73 20 6c 6f 6e 67 2e 20 20  aracters long.  
2ad0: 49 66 20 79 6f 75 20 63 68 61 6e 67 65 0a 2a 2a  If you change.**
2ae0: 20 74 68 65 20 68 65 61 64 65 72 2c 20 74 68 65   the header, the
2af0: 6e 20 79 6f 75 72 20 63 75 73 74 6f 6d 20 6c 69  n your custom li
2b00: 62 72 61 72 79 20 77 69 6c 6c 20 6e 6f 74 20 62  brary will not b
2b10: 65 20 61 62 6c 65 20 74 6f 20 72 65 61 64 20 0a  e able to read .
2b20: 2a 2a 20 64 61 74 61 62 61 73 65 73 20 67 65 6e  ** databases gen
2b30: 65 72 61 74 65 64 20 62 79 20 74 68 65 20 73 74  erated by the st
2b40: 61 6e 64 61 72 64 20 74 6f 6f 6c 73 20 61 6e 64  andard tools and
2b50: 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 74 6f   the standard to
2b60: 6f 6c 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  ols.** will not 
2b70: 62 65 20 61 62 6c 65 20 74 6f 20 72 65 61 64 20  be able to read 
2b80: 64 61 74 61 62 61 73 65 73 20 63 72 65 61 74 65  databases create
2b90: 64 20 62 79 20 79 6f 75 72 20 63 75 73 74 6f 6d  d by your custom
2ba0: 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66   library..*/.#if
2bb0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 46 49 4c 45  ndef SQLITE_FILE
2bc0: 5f 48 45 41 44 45 52 20 2f 2a 20 31 32 33 34 35  _HEADER /* 12345
2bd0: 36 37 38 39 20 31 32 33 34 35 36 20 2a 2f 0a 23  6789 123456 */.#
2be0: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
2bf0: 46 49 4c 45 5f 48 45 41 44 45 52 20 22 53 51 4c  FILE_HEADER "SQL
2c00: 69 74 65 20 66 6f 72 6d 61 74 20 33 22 0a 23 65  ite format 3".#e
2c10: 6e 64 69 66 0a 73 74 61 74 69 63 20 63 6f 6e 73  ndif.static cons
2c20: 74 20 63 68 61 72 20 7a 4d 61 67 69 63 48 65 61  t char zMagicHea
2c30: 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54 45 5f 46  der[] = SQLITE_F
2c40: 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a 2f 2a 0a  ILE_HEADER;../*.
2c50: 2a 2a 20 50 61 67 65 20 74 79 70 65 20 66 6c 61  ** Page type fla
2c60: 67 73 2e 20 20 41 6e 20 4f 52 65 64 20 63 6f 6d  gs.  An ORed com
2c70: 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 73  bination of thes
2c80: 65 20 66 6c 61 67 73 20 61 70 70 65 61 72 20 61  e flags appear a
2c90: 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 62  s the.** first b
2ca0: 79 74 65 20 6f 66 20 65 76 65 72 79 20 42 54 72  yte of every BTr
2cb0: 65 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 64 65 66  ee page..*/.#def
2cc0: 69 6e 65 20 50 54 46 5f 49 4e 54 4b 45 59 20 20  ine PTF_INTKEY  
2cd0: 20 20 30 78 30 31 0a 23 64 65 66 69 6e 65 20 50    0x01.#define P
2ce0: 54 46 5f 5a 45 52 4f 44 41 54 41 20 20 30 78 30  TF_ZERODATA  0x0
2cf0: 32 0a 23 64 65 66 69 6e 65 20 50 54 46 5f 4c 45  2.#define PTF_LE
2d00: 41 46 44 41 54 41 20 20 30 78 30 34 0a 23 64 65  AFDATA  0x04.#de
2d10: 66 69 6e 65 20 50 54 46 5f 4c 45 41 46 20 20 20  fine PTF_LEAF   
2d20: 20 20 20 30 78 30 38 0a 0a 2f 2a 0a 2a 2a 20 41     0x08../*.** A
2d30: 73 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 74  s each page of t
2d40: 68 65 20 66 69 6c 65 20 69 73 20 6c 6f 61 64 65  he file is loade
2d50: 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2c 20 61  d into memory, a
2d60: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
2d70: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73  e following.** s
2d80: 74 72 75 63 74 75 72 65 20 69 73 20 61 70 70 65  tructure is appe
2d90: 6e 64 65 64 20 61 6e 64 20 69 6e 69 74 69 61 6c  nded and initial
2da0: 69 7a 65 64 20 74 6f 20 7a 65 72 6f 2e 20 20 54  ized to zero.  T
2db0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 73 74  his structure st
2dc0: 6f 72 65 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74  ores.** informat
2dd0: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 70 61  ion about the pa
2de0: 67 65 20 74 68 61 74 20 69 73 20 64 65 63 6f 64  ge that is decod
2df0: 65 64 20 66 72 6f 6d 20 74 68 65 20 72 61 77 20  ed from the raw 
2e00: 66 69 6c 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  file page..**.**
2e10: 20 54 68 65 20 70 50 61 72 65 6e 74 20 66 69 65   The pParent fie
2e20: 6c 64 20 70 6f 69 6e 74 73 20 62 61 63 6b 20 74  ld points back t
2e30: 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
2e40: 65 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  e.  This allows 
2e50: 75 73 20 74 6f 0a 2a 2a 20 77 61 6c 6b 20 75 70  us to.** walk up
2e60: 20 74 68 65 20 42 54 72 65 65 20 66 72 6f 6d 20   the BTree from 
2e70: 61 6e 79 20 6c 65 61 66 20 74 6f 20 74 68 65 20  any leaf to the 
2e80: 72 6f 6f 74 2e 20 20 43 61 72 65 20 6d 75 73 74  root.  Care must
2e90: 20 62 65 20 74 61 6b 65 6e 20 74 6f 0a 2a 2a 20   be taken to.** 
2ea0: 75 6e 72 65 66 28 29 20 74 68 65 20 70 61 72 65  unref() the pare
2eb0: 6e 74 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20  nt page pointer 
2ec0: 77 68 65 6e 20 74 68 69 73 20 70 61 67 65 20 69  when this page i
2ed0: 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 66 65  s no longer refe
2ee0: 72 65 6e 63 65 64 2e 0a 2a 2a 20 54 68 65 20 70  renced..** The p
2ef0: 61 67 65 44 65 73 74 72 75 63 74 6f 72 28 29 20  ageDestructor() 
2f00: 72 6f 75 74 69 6e 65 20 68 61 6e 64 6c 65 73 20  routine handles 
2f10: 74 68 61 74 20 63 68 6f 72 65 2e 0a 2a 2f 0a 73  that chore..*/.s
2f20: 74 72 75 63 74 20 4d 65 6d 50 61 67 65 20 7b 0a  truct MemPage {.
2f30: 20 20 75 38 20 69 73 49 6e 69 74 3b 20 20 20 20    u8 isInit;    
2f40: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2f50: 66 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 69  f previously ini
2f60: 74 69 61 6c 69 7a 65 64 2e 20 4d 55 53 54 20 42  tialized. MUST B
2f70: 45 20 46 49 52 53 54 21 20 2a 2f 0a 20 20 75 38  E FIRST! */.  u8
2f80: 20 69 64 78 53 68 69 66 74 3b 20 20 20 20 20 20   idxShift;      
2f90: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 43 65     /* True if Ce
2fa0: 6c 6c 20 69 6e 64 69 63 65 73 20 68 61 76 65 20  ll indices have 
2fb0: 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 38 20  changed */.  u8 
2fc0: 6e 4f 76 65 72 66 6c 6f 77 3b 20 20 20 20 20 20  nOverflow;      
2fd0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
2fe0: 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 62 6f 64  verflow cell bod
2ff0: 69 65 73 20 69 6e 20 61 43 65 6c 6c 5b 5d 20 2a  ies in aCell[] *
3000: 2f 0a 20 20 75 38 20 69 6e 74 4b 65 79 3b 20 20  /.  u8 intKey;  
3010: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
3020: 20 69 66 20 69 6e 74 6b 65 79 20 66 6c 61 67 20   if intkey flag 
3030: 69 73 20 73 65 74 20 2a 2f 0a 20 20 75 38 20 6c  is set */.  u8 l
3040: 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  eaf;            
3050: 20 2f 2a 20 54 72 75 65 20 69 66 20 6c 65 61 66   /* True if leaf
3060: 20 66 6c 61 67 20 69 73 20 73 65 74 20 2a 2f 0a   flag is set */.
3070: 20 20 75 38 20 7a 65 72 6f 44 61 74 61 3b 20 20    u8 zeroData;  
3080: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
3090: 66 20 74 61 62 6c 65 20 73 74 6f 72 65 73 20 6b  f table stores k
30a0: 65 79 73 20 6f 6e 6c 79 20 2a 2f 0a 20 20 75 38  eys only */.  u8
30b0: 20 6c 65 61 66 44 61 74 61 3b 20 20 20 20 20 20   leafData;      
30c0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 61     /* True if ta
30d0: 62 6c 65 73 20 73 74 6f 72 65 73 20 64 61 74 61  bles stores data
30e0: 20 6f 6e 20 6c 65 61 76 65 73 20 6f 6e 6c 79 20   on leaves only 
30f0: 2a 2f 0a 20 20 75 38 20 68 61 73 44 61 74 61 3b  */.  u8 hasData;
3100: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3110: 65 20 69 66 20 74 68 69 73 20 70 61 67 65 20 73  e if this page s
3120: 74 6f 72 65 73 20 64 61 74 61 20 2a 2f 0a 20 20  tores data */.  
3130: 75 38 20 68 64 72 4f 66 66 73 65 74 3b 20 20 20  u8 hdrOffset;   
3140: 20 20 20 20 20 2f 2a 20 31 30 30 20 66 6f 72 20       /* 100 for 
3150: 70 61 67 65 20 31 2e 20 20 30 20 6f 74 68 65 72  page 1.  0 other
3160: 77 69 73 65 20 2a 2f 0a 20 20 75 38 20 63 68 69  wise */.  u8 chi
3170: 6c 64 50 74 72 53 69 7a 65 3b 20 20 20 20 20 2f  ldPtrSize;     /
3180: 2a 20 30 20 69 66 20 6c 65 61 66 3d 3d 31 2e 20  * 0 if leaf==1. 
3190: 20 34 20 69 66 20 6c 65 61 66 3d 3d 30 20 2a 2f   4 if leaf==0 */
31a0: 0a 20 20 75 31 36 20 6d 61 78 4c 6f 63 61 6c 3b  .  u16 maxLocal;
31b0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20          /* Copy 
31c0: 6f 66 20 42 74 72 65 65 2e 6d 61 78 4c 6f 63 61  of Btree.maxLoca
31d0: 6c 20 6f 72 20 42 74 72 65 65 2e 6d 61 78 4c 65  l or Btree.maxLe
31e0: 61 66 20 2a 2f 0a 20 20 75 31 36 20 6d 69 6e 4c  af */.  u16 minL
31f0: 6f 63 61 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20  ocal;        /* 
3200: 43 6f 70 79 20 6f 66 20 42 74 72 65 65 2e 6d 69  Copy of Btree.mi
3210: 6e 4c 6f 63 61 6c 20 6f 72 20 42 74 72 65 65 2e  nLocal or Btree.
3220: 6d 69 6e 4c 65 61 66 20 2a 2f 0a 20 20 75 31 36  minLeaf */.  u16
3230: 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20   cellOffset;    
3240: 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 44    /* Index in aD
3250: 61 74 61 20 6f 66 20 66 69 72 73 74 20 63 65 6c  ata of first cel
3260: 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75  l pointer */.  u
3270: 31 36 20 69 64 78 50 61 72 65 6e 74 3b 20 20 20  16 idxParent;   
3280: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
3290: 70 61 72 65 6e 74 20 6f 66 20 74 68 69 73 20 6e  parent of this n
32a0: 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6e 46 72  ode */.  u16 nFr
32b0: 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ee;           /*
32c0: 20 4e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20   Number of free 
32d0: 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67  bytes on the pag
32e0: 65 20 2a 2f 0a 20 20 75 31 36 20 6e 43 65 6c 6c  e */.  u16 nCell
32f0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
3300: 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f  umber of cells o
3310: 6e 20 74 68 69 73 20 70 61 67 65 2c 20 6c 6f 63  n this page, loc
3320: 61 6c 20 61 6e 64 20 6f 76 66 6c 20 2a 2f 0a 20  al and ovfl */. 
3330: 20 73 74 72 75 63 74 20 5f 4f 76 66 6c 43 65 6c   struct _OvflCel
3340: 6c 20 7b 20 20 20 2f 2a 20 43 65 6c 6c 73 20 74  l {   /* Cells t
3350: 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  hat will not fit
3360: 20 6f 6e 20 61 44 61 74 61 5b 5d 20 2a 2f 0a 20   on aData[] */. 
3370: 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20     u8 *pCell;   
3380: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
3390: 72 73 20 74 6f 20 74 68 65 20 62 6f 64 79 20 6f  rs to the body o
33a0: 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  f the overflow c
33b0: 65 6c 6c 20 2a 2f 0a 20 20 20 20 75 31 36 20 69  ell */.    u16 i
33c0: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  dx;            /
33d0: 2a 20 49 6e 73 65 72 74 20 74 68 69 73 20 63 65  * Insert this ce
33e0: 6c 6c 20 62 65 66 6f 72 65 20 69 64 78 2d 74 68  ll before idx-th
33f0: 20 6e 6f 6e 2d 6f 76 65 72 66 6c 6f 77 20 63 65   non-overflow ce
3400: 6c 6c 20 2a 2f 0a 20 20 7d 20 61 4f 76 66 6c 5b  ll */.  } aOvfl[
3410: 35 5d 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  5];.  BtShared *
3420: 70 42 74 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  pBt;       /* Po
3430: 69 6e 74 65 72 20 62 61 63 6b 20 74 6f 20 42 54  inter back to BT
3440: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
3450: 0a 20 20 75 38 20 2a 61 44 61 74 61 3b 20 20 20  .  u8 *aData;   
3460: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
3470: 65 72 20 62 61 63 6b 20 74 6f 20 74 68 65 20 73  er back to the s
3480: 74 61 72 74 20 6f 66 20 74 68 65 20 70 61 67 65  tart of the page
3490: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
34a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
34b0: 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ge number for th
34c0: 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 4d 65 6d  is page */.  Mem
34d0: 50 61 67 65 20 2a 70 50 61 72 65 6e 74 3b 20 20  Page *pParent;  
34e0: 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20    /* The parent 
34f0: 6f 66 20 74 68 69 73 20 70 61 67 65 2e 20 20 4e  of this page.  N
3500: 55 4c 4c 20 66 6f 72 20 72 6f 6f 74 20 2a 2f 0a  ULL for root */.
3510: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e  };../*.** The in
3520: 2d 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66  -memory image of
3530: 20 61 20 64 69 73 6b 20 70 61 67 65 20 68 61 73   a disk page has
3540: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 69   the auxiliary i
3550: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 70 70 65 6e  nformation appen
3560: 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 65 6e  ded.** to the en
3570: 64 2e 20 20 45 58 54 52 41 5f 53 49 5a 45 20 69  d.  EXTRA_SIZE i
3580: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
3590: 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 6e  bytes of space n
35a0: 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 0a 2a 2a  eeded to hold.**
35b0: 20 74 68 61 74 20 65 78 74 72 61 20 69 6e 66 6f   that extra info
35c0: 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 64 65 66  rmation..*/.#def
35d0: 69 6e 65 20 45 58 54 52 41 5f 53 49 5a 45 20 73  ine EXTRA_SIZE s
35e0: 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 0a 0a  izeof(MemPage)..
35f0: 2f 2a 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20  /* Btree handle 
3600: 2a 2f 0a 73 74 72 75 63 74 20 42 74 72 65 65 20  */.struct Btree 
3610: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 70 53 71  {.  sqlite3 *pSq
3620: 6c 69 74 65 3b 0a 20 20 42 74 53 68 61 72 65 64  lite;.  BtShared
3630: 20 2a 70 42 74 3b 0a 20 20 75 38 20 69 6e 54 72   *pBt;.  u8 inTr
3640: 61 6e 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ans;            
3650: 2f 2a 20 54 52 41 4e 53 5f 4e 4f 4e 45 2c 20 54  /* TRANS_NONE, T
3660: 52 41 4e 53 5f 52 45 41 44 20 6f 72 20 54 52 41  RANS_READ or TRA
3670: 4e 53 5f 57 52 49 54 45 20 2a 2f 0a 7d 3b 0a 0a  NS_WRITE */.};..
3680: 2f 2a 0a 2a 2a 20 42 74 72 65 65 2e 69 6e 54 72  /*.** Btree.inTr
3690: 61 6e 73 20 6d 61 79 20 74 61 6b 65 20 6f 6e 65  ans may take one
36a0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
36b0: 67 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20  g values..**.** 
36c0: 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 64 61  If the shared-da
36d0: 74 61 20 65 78 74 65 6e 73 69 6f 6e 20 69 73 20  ta extension is 
36e0: 65 6e 61 62 6c 65 64 2c 20 74 68 65 72 65 20 6d  enabled, there m
36f0: 61 79 20 62 65 20 6d 75 6c 74 69 70 6c 65 20 75  ay be multiple u
3700: 73 65 72 73 0a 2a 2a 20 6f 66 20 74 68 65 20 42  sers.** of the B
3710: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e 20  tree structure. 
3720: 41 74 20 6d 6f 73 74 20 6f 6e 65 20 6f 66 20 74  At most one of t
3730: 68 65 73 65 20 6d 61 79 20 6f 70 65 6e 20 61 20  hese may open a 
3740: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
3750: 6e 2c 0a 2a 2a 20 62 75 74 20 61 6e 79 20 6e 75  n,.** but any nu
3760: 6d 62 65 72 20 6d 61 79 20 68 61 76 65 20 61 63  mber may have ac
3770: 74 69 76 65 20 72 65 61 64 20 74 72 61 6e 73 61  tive read transa
3780: 63 74 69 6f 6e 73 2e 20 56 61 72 69 61 62 6c 65  ctions. Variable
3790: 20 42 74 72 65 65 2e 70 44 62 20 0a 2a 2a 20 70   Btree.pDb .** p
37a0: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 68 61 6e  oints to the han
37b0: 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 61 6e  dle that owns an
37c0: 79 20 63 75 72 72 65 6e 74 20 77 72 69 74 65 2d  y current write-
37d0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
37e0: 23 64 65 66 69 6e 65 20 54 52 41 4e 53 5f 4e 4f  #define TRANS_NO
37f0: 4e 45 20 20 30 0a 23 64 65 66 69 6e 65 20 54 52  NE  0.#define TR
3800: 41 4e 53 5f 52 45 41 44 20 20 31 0a 23 64 65 66  ANS_READ  1.#def
3810: 69 6e 65 20 54 52 41 4e 53 5f 57 52 49 54 45 20  ine TRANS_WRITE 
3820: 32 0a 0a 2f 2a 0a 2a 2a 20 45 76 65 72 79 74 68  2../*.** Everyth
3830: 69 6e 67 20 77 65 20 6e 65 65 64 20 74 6f 20 6b  ing we need to k
3840: 6e 6f 77 20 61 62 6f 75 74 20 61 6e 20 6f 70 65  now about an ope
3850: 6e 20 64 61 74 61 62 61 73 65 0a 2a 2f 0a 73 74  n database.*/.st
3860: 72 75 63 74 20 42 74 53 68 61 72 65 64 20 7b 0a  ruct BtShared {.
3870: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
3880: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
3890: 61 67 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 42  age cache */.  B
38a0: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 73 6f 72  tCursor *pCursor
38b0: 3b 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f  ;    /* A list o
38c0: 66 20 61 6c 6c 20 6f 70 65 6e 20 63 75 72 73 6f  f all open curso
38d0: 72 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  rs */.  MemPage 
38e0: 2a 70 50 61 67 65 31 3b 20 20 20 20 20 20 2f 2a  *pPage1;      /*
38f0: 20 46 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   First page of t
3900: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
3910: 20 75 38 20 69 6e 53 74 6d 74 3b 20 20 20 20 20   u8 inStmt;     
3920: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
3930: 66 20 77 65 20 61 72 65 20 69 6e 20 61 20 73 74  f we are in a st
3940: 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  atement subtrans
3950: 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 72  action */.  u8 r
3960: 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20  eadOnly;        
3970: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
3980: 20 75 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65   underlying file
3990: 20 69 73 20 72 65 61 64 6f 6e 6c 79 20 2a 2f 0a   is readonly */.
39a0: 20 20 75 38 20 6d 61 78 45 6d 62 65 64 46 72 61    u8 maxEmbedFra
39b0: 63 3b 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d  c;      /* Maxim
39c0: 75 6d 20 70 61 79 6c 6f 61 64 20 61 73 20 25 20  um payload as % 
39d0: 6f 66 20 74 6f 74 61 6c 20 70 61 67 65 20 73 69  of total page si
39e0: 7a 65 20 2a 2f 0a 20 20 75 38 20 6d 69 6e 45 6d  ze */.  u8 minEm
39f0: 62 65 64 46 72 61 63 3b 20 20 20 20 20 20 2f 2a  bedFrac;      /*
3a00: 20 4d 69 6e 69 6d 75 6d 20 70 61 79 6c 6f 61 64   Minimum payload
3a10: 20 61 73 20 25 20 6f 66 20 74 6f 74 61 6c 20 70   as % of total p
3a20: 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 75 38  age size */.  u8
3a30: 20 6d 69 6e 4c 65 61 66 46 72 61 63 3b 20 20 20   minLeafFrac;   
3a40: 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c      /* Minimum l
3a50: 65 61 66 20 70 61 79 6c 6f 61 64 20 61 73 20 25  eaf payload as %
3a60: 20 6f 66 20 74 6f 74 61 6c 20 70 61 67 65 20 73   of total page s
3a70: 69 7a 65 20 2a 2f 0a 20 20 75 38 20 70 61 67 65  ize */.  u8 page
3a80: 53 69 7a 65 46 69 78 65 64 3b 20 20 20 20 20 2f  SizeFixed;     /
3a90: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 70 61  * True if the pa
3aa0: 67 65 20 73 69 7a 65 20 63 61 6e 20 6e 6f 20 6c  ge size can no l
3ab0: 6f 6e 67 65 72 20 62 65 20 63 68 61 6e 67 65 64  onger be changed
3ac0: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
3ad0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
3ae0: 55 4d 0a 20 20 75 38 20 61 75 74 6f 56 61 63 75  UM.  u8 autoVacu
3af0: 75 6d 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  um;        /* Tr
3b00: 75 65 20 69 66 20 64 61 74 61 62 61 73 65 20 73  ue if database s
3b10: 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63  upports auto-vac
3b20: 75 75 6d 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  uum */.#endif.  
3b30: 75 31 36 20 70 61 67 65 53 69 7a 65 3b 20 20 20  u16 pageSize;   
3b40: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
3b50: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
3b60: 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 75 31  n a page */.  u1
3b70: 36 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20  6 usableSize;   
3b80: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3b90: 20 75 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e   usable bytes on
3ba0: 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20   each page */.  
3bb0: 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 20  int maxLocal;   
3bc0: 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
3bd0: 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 20 69   local payload i
3be0: 6e 20 6e 6f 6e 2d 4c 45 41 46 44 41 54 41 20 74  n non-LEAFDATA t
3bf0: 61 62 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6d  ables */.  int m
3c00: 69 6e 4c 6f 63 61 6c 3b 20 20 20 20 20 20 20 20  inLocal;        
3c10: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c 6f 63 61   /* Minimum loca
3c20: 6c 20 70 61 79 6c 6f 61 64 20 69 6e 20 6e 6f 6e  l payload in non
3c30: 2d 4c 45 41 46 44 41 54 41 20 74 61 62 6c 65 73  -LEAFDATA tables
3c40: 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 4c 65 61   */.  int maxLea
3c50: 66 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  f;          /* M
3c60: 61 78 69 6d 75 6d 20 6c 6f 63 61 6c 20 70 61 79  aximum local pay
3c70: 6c 6f 61 64 20 69 6e 20 61 20 4c 45 41 46 44 41  load in a LEAFDA
3c80: 54 41 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  TA table */.  in
3c90: 74 20 6d 69 6e 4c 65 61 66 3b 20 20 20 20 20 20  t minLeaf;      
3ca0: 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c      /* Minimum l
3cb0: 6f 63 61 6c 20 70 61 79 6c 6f 61 64 20 69 6e 20  ocal payload in 
3cc0: 61 20 4c 45 41 46 44 41 54 41 20 74 61 62 6c 65  a LEAFDATA table
3cd0: 20 2a 2f 0a 20 20 42 75 73 79 48 61 6e 64 6c 65   */.  BusyHandle
3ce0: 72 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 3b  r *pBusyHandler;
3cf0: 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66     /* Callback f
3d00: 6f 72 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  or when there is
3d10: 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e   lock contention
3d20: 20 2a 2f 0a 20 20 75 38 20 69 6e 54 72 61 6e 73   */.  u8 inTrans
3d30: 61 63 74 69 6f 6e 3b 20 20 20 20 20 2f 2a 20 54  action;     /* T
3d40: 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65  ransaction state
3d50: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
3d60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3d70: 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
3d80: 63 65 73 20 74 6f 20 74 68 69 73 20 73 74 72 75  ces to this stru
3d90: 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  cture */.  int n
3da0: 54 72 61 6e 73 61 63 74 69 6f 6e 3b 20 20 20 20  Transaction;    
3db0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 70   /* Number of op
3dc0: 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  en transactions 
3dd0: 28 72 65 61 64 20 2b 20 77 72 69 74 65 29 20 2a  (read + write) *
3de0: 2f 0a 20 20 76 6f 69 64 20 2a 70 53 63 68 65 6d  /.  void *pSchem
3df0: 61 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  a;        /* Poi
3e00: 6e 74 65 72 20 74 6f 20 73 70 61 63 65 20 61 6c  nter to space al
3e10: 6c 6f 63 61 74 65 64 20 62 79 20 73 71 6c 69 74  located by sqlit
3e20: 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 29 20  e3BtreeSchema() 
3e30: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 46 72 65  */.  void (*xFre
3e40: 65 53 63 68 65 6d 61 29 28 76 6f 69 64 2a 29 3b  eSchema)(void*);
3e50: 20 20 2f 2a 20 44 65 73 74 72 75 63 74 6f 72 20    /* Destructor 
3e60: 66 6f 72 20 42 74 53 68 61 72 65 64 2e 70 53 63  for BtShared.pSc
3e70: 68 65 6d 61 20 2a 2f 0a 23 69 66 6e 64 65 66 20  hema */.#ifndef 
3e80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
3e90: 45 44 5f 43 41 43 48 45 0a 20 20 42 74 4c 6f 63  ED_CACHE.  BtLoc
3ea0: 6b 20 2a 70 4c 6f 63 6b 3b 20 20 20 20 20 20 20  k *pLock;       
3eb0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6c 6f 63 6b   /* List of lock
3ec0: 73 20 68 65 6c 64 20 6f 6e 20 74 68 69 73 20 73  s held on this s
3ed0: 68 61 72 65 64 2d 62 74 72 65 65 20 73 74 72 75  hared-btree stru
3ee0: 63 74 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  ct */.  BtShared
3ef0: 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 2f 2a   *pNext;      /*
3f00: 20 4e 65 78 74 20 69 6e 20 54 68 72 65 61 64 44   Next in ThreadD
3f10: 61 74 61 2e 70 42 74 72 65 65 20 6c 69 6e 6b 65  ata.pBtree linke
3f20: 64 20 6c 69 73 74 20 2a 2f 0a 23 65 6e 64 69 66  d list */.#endif
3f30: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  .};../*.** An in
3f40: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
3f50: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
3f60: 65 20 69 73 20 75 73 65 64 20 74 6f 20 68 6f 6c  e is used to hol
3f70: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  d information.**
3f80: 20 61 62 6f 75 74 20 61 20 63 65 6c 6c 2e 20 20   about a cell.  
3f90: 54 68 65 20 70 61 72 73 65 43 65 6c 6c 50 74 72  The parseCellPtr
3fa0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 69 6c 6c  () function fill
3fb0: 73 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  s in this struct
3fc0: 75 72 65 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20  ure.** based on 
3fd0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 65 78 74 72  information extr
3fe0: 61 63 74 20 66 72 6f 6d 20 74 68 65 20 72 61 77  act from the raw
3ff0: 20 64 69 73 6b 20 70 61 67 65 2e 0a 2a 2f 0a 74   disk page..*/.t
4000: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 43 65  ypedef struct Ce
4010: 6c 6c 49 6e 66 6f 20 43 65 6c 6c 49 6e 66 6f 3b  llInfo CellInfo;
4020: 0a 73 74 72 75 63 74 20 43 65 6c 6c 49 6e 66 6f  .struct CellInfo
4030: 20 7b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20   {.  u8 *pCell; 
4040: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
4050: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 63  o the start of c
4060: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  ell content */. 
4070: 20 69 36 34 20 6e 4b 65 79 3b 20 20 20 20 20 20   i64 nKey;      
4080: 2f 2a 20 54 68 65 20 6b 65 79 20 66 6f 72 20 49  /* The key for I
4090: 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 6f 72  NTKEY tables, or
40a0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
40b0: 20 69 6e 20 6b 65 79 20 2a 2f 0a 20 20 75 33 32   in key */.  u32
40c0: 20 6e 44 61 74 61 3b 20 20 20 20 20 2f 2a 20 4e   nData;     /* N
40d0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
40e0: 66 20 64 61 74 61 20 2a 2f 0a 20 20 75 31 36 20  f data */.  u16 
40f0: 6e 48 65 61 64 65 72 3b 20 20 20 2f 2a 20 53 69  nHeader;   /* Si
4100: 7a 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63  ze of the cell c
4110: 6f 6e 74 65 6e 74 20 68 65 61 64 65 72 20 69 6e  ontent header in
4120: 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 31 36 20   bytes */.  u16 
4130: 6e 4c 6f 63 61 6c 3b 20 20 20 20 2f 2a 20 41 6d  nLocal;    /* Am
4140: 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
4150: 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a  held locally */.
4160: 20 20 75 31 36 20 69 4f 76 65 72 66 6c 6f 77 3b    u16 iOverflow;
4170: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 6f 76   /* Offset to ov
4180: 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62  erflow page numb
4190: 65 72 2e 20 20 5a 65 72 6f 20 69 66 20 6e 6f 20  er.  Zero if no 
41a0: 6f 76 65 72 66 6c 6f 77 20 2a 2f 0a 20 20 75 31  overflow */.  u1
41b0: 36 20 6e 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20  6 nSize;     /* 
41c0: 53 69 7a 65 20 6f 66 20 74 68 65 20 63 65 6c 6c  Size of the cell
41d0: 20 63 6f 6e 74 65 6e 74 20 6f 6e 20 74 68 65 20   content on the 
41e0: 6d 61 69 6e 20 62 2d 74 72 65 65 20 70 61 67 65  main b-tree page
41f0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20   */.};../*.** A 
4200: 63 75 72 73 6f 72 20 69 73 20 61 20 70 6f 69 6e  cursor is a poin
4210: 74 65 72 20 74 6f 20 61 20 70 61 72 74 69 63 75  ter to a particu
4220: 6c 61 72 20 65 6e 74 72 79 20 69 6e 20 74 68 65  lar entry in the
4230: 20 42 54 72 65 65 2e 0a 2a 2a 20 54 68 65 20 65   BTree..** The e
4240: 6e 74 72 79 20 69 73 20 69 64 65 6e 74 69 66 69  ntry is identifi
4250: 65 64 20 62 79 20 69 74 73 20 4d 65 6d 50 61 67  ed by its MemPag
4260: 65 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  e and the index 
4270: 69 6e 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 43  in.** MemPage.aC
4280: 65 6c 6c 5b 5d 20 6f 66 20 74 68 65 20 65 6e 74  ell[] of the ent
4290: 72 79 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 42 74  ry..*/.struct Bt
42a0: 43 75 72 73 6f 72 20 7b 0a 20 20 42 74 72 65 65  Cursor {.  Btree
42b0: 20 2a 70 42 74 72 65 65 3b 20 20 20 20 20 20 20   *pBtree;       
42c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 42 74 72 65       /* The Btre
42d0: 65 20 74 6f 20 77 68 69 63 68 20 74 68 69 73 20  e to which this 
42e0: 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 2a  cursor belongs *
42f0: 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 4e  /.  BtCursor *pN
4300: 65 78 74 2c 20 2a 70 50 72 65 76 3b 20 20 2f 2a  ext, *pPrev;  /*
4310: 20 46 6f 72 6d 73 20 61 20 6c 69 6e 6b 65 64 20   Forms a linked 
4320: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 75 72 73  list of all curs
4330: 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  ors */.  int (*x
4340: 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69  Compare)(void*,i
4350: 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69  nt,const void*,i
4360: 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 3b  nt,const void*);
4370: 20 2f 2a 20 4b 65 79 20 63 6f 6d 70 20 66 75 6e   /* Key comp fun
4380: 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72  c */.  void *pAr
4390: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
43a0: 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f   /* First arg to
43b0: 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20   xCompare() */. 
43c0: 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 3b 20   Pgno pgnoRoot; 
43d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
43e0: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
43f0: 68 69 73 20 74 72 65 65 20 2a 2f 0a 20 20 4d 65  his tree */.  Me
4400: 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20  mPage *pPage;   
4410: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
4420: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
4430: 65 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74  e entry */.  int
4440: 20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 20   idx;           
4450: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
4460: 6f 66 20 74 68 65 20 65 6e 74 72 79 20 69 6e 20  of the entry in 
4470: 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 2a  pPage->aCell[] *
4480: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  /.  CellInfo inf
4490: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  o;            /*
44a0: 20 41 20 70 61 72 73 65 20 6f 66 20 74 68 65 20   A parse of the 
44b0: 63 65 6c 6c 20 77 65 20 61 72 65 20 70 6f 69 6e  cell we are poin
44c0: 74 69 6e 67 20 61 74 20 2a 2f 0a 20 20 75 38 20  ting at */.  u8 
44d0: 77 72 46 6c 61 67 3b 20 20 20 20 20 20 20 20 20  wrFlag;         
44e0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
44f0: 66 20 77 72 69 74 61 62 6c 65 20 2a 2f 0a 20 20  f writable */.  
4500: 75 38 20 65 53 74 61 74 65 3b 20 20 20 20 20 20  u8 eState;      
4510: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
4520: 20 6f 66 20 74 68 65 20 43 55 52 53 4f 52 5f 58   of the CURSOR_X
4530: 58 58 20 63 6f 6e 73 74 61 6e 74 73 20 28 73 65  XX constants (se
4540: 65 20 62 65 6c 6f 77 29 20 2a 2f 0a 23 69 66 6e  e below) */.#ifn
4550: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
4560: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 76  SHARED_CACHE.  v
4570: 6f 69 64 20 2a 70 4b 65 79 3b 20 20 20 20 20 20  oid *pKey;      
4580: 2f 2a 20 53 61 76 65 64 20 6b 65 79 20 74 68 61  /* Saved key tha
4590: 74 20 77 61 73 20 63 75 72 73 6f 72 27 73 20 6c  t was cursor's l
45a0: 61 73 74 20 6b 6e 6f 77 6e 20 70 6f 73 69 74 69  ast known positi
45b0: 6f 6e 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79  on */.  i64 nKey
45c0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  ;        /* Size
45d0: 20 6f 66 20 70 4b 65 79 2c 20 6f 72 20 6c 61 73   of pKey, or las
45e0: 74 20 69 6e 74 65 67 65 72 20 6b 65 79 20 2a 2f  t integer key */
45f0: 0a 20 20 69 6e 74 20 73 6b 69 70 3b 20 20 20 20  .  int skip;    
4600: 20 20 20 20 2f 2a 20 28 73 6b 69 70 3c 30 29 20      /* (skip<0) 
4610: 2d 3e 20 50 72 65 76 28 29 20 69 73 20 61 20 6e  -> Prev() is a n
4620: 6f 2d 6f 70 2e 20 28 73 6b 69 70 3e 30 29 20 2d  o-op. (skip>0) -
4630: 3e 20 4e 65 78 74 28 29 20 69 73 20 2a 2f 0a 23  > Next() is */.#
4640: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
4650: 50 6f 74 65 6e 74 69 61 6c 20 76 61 6c 75 65 73  Potential values
4660: 20 66 6f 72 20 42 74 43 75 72 73 6f 72 2e 65 53   for BtCursor.eS
4670: 74 61 74 65 2e 20 54 68 65 20 66 69 72 73 74 20  tate. The first 
4680: 74 77 6f 20 76 61 6c 75 65 73 20 28 56 41 4c 49  two values (VALI
4690: 44 20 61 6e 64 20 0a 2a 2a 20 49 4e 56 41 4c 49  D and .** INVALI
46a0: 44 29 20 6d 61 79 20 6f 63 63 75 72 20 69 6e 20  D) may occur in 
46b0: 61 6e 79 20 62 75 69 6c 64 2e 20 54 68 65 20 74  any build. The t
46c0: 68 69 72 64 20 28 52 45 51 55 49 52 45 53 45 45  hird (REQUIRESEE
46d0: 4b 29 20 6d 61 79 20 6f 6e 6c 79 20 6f 63 63 75  K) may only occu
46e0: 72 20 0a 2a 2a 20 69 66 20 73 71 6c 69 74 65 20  r .** if sqlite 
46f0: 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74  was compiled wit
4700: 68 6f 75 74 20 74 68 65 20 4f 4d 49 54 5f 53 48  hout the OMIT_SH
4710: 41 52 45 44 5f 43 41 43 48 45 20 73 79 6d 62 6f  ARED_CACHE symbo
4720: 6c 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a  l defined..**.**
4730: 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3a 0a 2a   CURSOR_VALID:.*
4740: 2a 20 20 20 43 75 72 73 6f 72 20 70 6f 69 6e 74  *   Cursor point
4750: 73 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74  s to a valid ent
4760: 72 79 2e 20 67 65 74 50 61 79 6c 6f 61 64 28 29  ry. getPayload()
4770: 20 65 74 63 2e 20 6d 61 79 20 62 65 20 63 61 6c   etc. may be cal
4780: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 55 52 53 4f  led..**.** CURSO
4790: 52 5f 49 4e 56 41 4c 49 44 3a 0a 2a 2a 20 20 20  R_INVALID:.**   
47a0: 43 75 72 73 6f 72 20 64 6f 65 73 20 6e 6f 74 20  Cursor does not 
47b0: 70 6f 69 6e 74 20 74 6f 20 61 20 76 61 6c 69 64  point to a valid
47c0: 20 65 6e 74 72 79 2e 20 54 68 69 73 20 63 61 6e   entry. This can
47d0: 20 68 61 70 70 65 6e 20 28 66 6f 72 20 65 78 61   happen (for exa
47e0: 6d 70 6c 65 29 20 0a 2a 2a 20 20 20 62 65 63 61  mple) .**   beca
47f0: 75 73 65 20 74 68 65 20 74 61 62 6c 65 20 69 73  use the table is
4800: 20 65 6d 70 74 79 20 6f 72 20 62 65 63 61 75 73   empty or becaus
4810: 65 20 42 74 72 65 65 43 75 72 73 6f 72 46 69 72  e BtreeCursorFir
4820: 73 74 28 29 20 68 61 73 20 6e 6f 74 20 62 65 65  st() has not bee
4830: 6e 0a 2a 2a 20 20 20 63 61 6c 6c 65 64 2e 0a 2a  n.**   called..*
4840: 2a 0a 2a 2a 20 43 55 52 53 4f 52 5f 52 45 51 55  *.** CURSOR_REQU
4850: 49 52 45 53 45 45 4b 3a 0a 2a 2a 20 20 20 54 68  IRESEEK:.**   Th
4860: 65 20 74 61 62 6c 65 20 74 68 61 74 20 74 68 69  e table that thi
4870: 73 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  s cursor was ope
4880: 6e 65 64 20 6f 6e 20 73 74 69 6c 6c 20 65 78 69  ned on still exi
4890: 73 74 73 2c 20 62 75 74 20 68 61 73 20 62 65 65  sts, but has bee
48a0: 6e 20 0a 2a 2a 20 20 20 6d 6f 64 69 66 69 65 64  n .**   modified
48b0: 20 73 69 6e 63 65 20 74 68 65 20 63 75 72 73 6f   since the curso
48c0: 72 20 77 61 73 20 6c 61 73 74 20 75 73 65 64 2e  r was last used.
48d0: 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f 73 69   The cursor posi
48e0: 74 69 6f 6e 20 69 73 20 73 61 76 65 64 0a 2a 2a  tion is saved.**
48f0: 20 20 20 69 6e 20 76 61 72 69 61 62 6c 65 73 20     in variables 
4900: 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 20 61 6e  BtCursor.pKey an
4910: 64 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 2e  d BtCursor.nKey.
4920: 20 57 68 65 6e 20 61 20 63 75 72 73 6f 72 20 69   When a cursor i
4930: 73 20 69 6e 20 0a 2a 2a 20 20 20 74 68 69 73 20  s in .**   this 
4940: 73 74 61 74 65 2c 20 72 65 73 74 6f 72 65 4f 72  state, restoreOr
4950: 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  ClearCursorPosit
4960: 69 6f 6e 28 29 20 63 61 6e 20 62 65 20 63 61 6c  ion() can be cal
4970: 6c 65 64 20 74 6f 20 61 74 74 65 6d 70 74 20 74  led to attempt t
4980: 6f 0a 2a 2a 20 20 20 73 65 65 6b 20 74 68 65 20  o.**   seek the 
4990: 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 73 61  cursor to the sa
49a0: 76 65 64 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f  ved position..*/
49b0: 0a 23 64 65 66 69 6e 65 20 43 55 52 53 4f 52 5f  .#define CURSOR_
49c0: 49 4e 56 41 4c 49 44 20 20 20 20 20 20 20 20 20  INVALID         
49d0: 20 20 30 0a 23 64 65 66 69 6e 65 20 43 55 52 53    0.#define CURS
49e0: 4f 52 5f 56 41 4c 49 44 20 20 20 20 20 20 20 20  OR_VALID        
49f0: 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20 43       1.#define C
4a00: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
4a10: 4b 20 20 20 20 20 20 20 32 0a 0a 2f 2a 0a 2a 2a  K       2../*.**
4a20: 20 54 68 65 20 54 52 41 43 45 20 6d 61 63 72 6f   The TRACE macro
4a30: 20 77 69 6c 6c 20 70 72 69 6e 74 20 68 69 67 68   will print high
4a40: 2d 6c 65 76 65 6c 20 73 74 61 74 75 73 20 69 6e  -level status in
4a50: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
4a60: 74 68 65 0a 2a 2a 20 62 74 72 65 65 20 6f 70 65  the.** btree ope
4a70: 72 61 74 69 6f 6e 20 77 68 65 6e 20 74 68 65 20  ration when the 
4a80: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
4a90: 73 71 6c 69 74 65 33 5f 62 74 72 65 65 5f 74 72  sqlite3_btree_tr
4aa0: 61 63 65 20 69 73 0a 2a 2a 20 65 6e 61 62 6c 65  ace is.** enable
4ab0: 64 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  d..*/.#if SQLITE
4ac0: 5f 54 45 53 54 0a 23 20 64 65 66 69 6e 65 20 54  _TEST.# define T
4ad0: 52 41 43 45 28 58 29 20 20 20 69 66 28 20 73 71  RACE(X)   if( sq
4ae0: 6c 69 74 65 33 5f 62 74 72 65 65 5f 74 72 61 63  lite3_btree_trac
4af0: 65 20 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20  e )\.           
4b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 73               { s
4b10: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
4b20: 66 20 58 3b 20 66 66 6c 75 73 68 28 73 74 64 6f  f X; fflush(stdo
4b30: 75 74 29 3b 20 7d 0a 69 6e 74 20 73 71 6c 69 74  ut); }.int sqlit
4b40: 65 33 5f 62 74 72 65 65 5f 74 72 61 63 65 3d 30  e3_btree_trace=0
4b50: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
4b60: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
4b70: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 54  #else.# define T
4b80: 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a  RACE(X).#endif..
4b90: 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65  /*.** Forward de
4ba0: 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61  claration.*/.sta
4bb0: 74 69 63 20 69 6e 74 20 63 68 65 63 6b 52 65 61  tic int checkRea
4bc0: 64 4c 6f 63 6b 73 28 42 74 53 68 61 72 65 64 2a  dLocks(BtShared*
4bd0: 2c 50 67 6e 6f 2c 42 74 43 75 72 73 6f 72 2a 29  ,Pgno,BtCursor*)
4be0: 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 6f 72  ;../*.** Read or
4bf0: 20 77 72 69 74 65 20 61 20 74 77 6f 2d 20 61 6e   write a two- an
4c00: 64 20 66 6f 75 72 2d 62 79 74 65 20 62 69 67 2d  d four-byte big-
4c10: 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 76  endian integer v
4c20: 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  alues..*/.static
4c30: 20 75 33 32 20 67 65 74 32 62 79 74 65 28 75 6e   u32 get2byte(un
4c40: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 29 7b  signed char *p){
4c50: 0a 20 20 72 65 74 75 72 6e 20 28 70 5b 30 5d 3c  .  return (p[0]<
4c60: 3c 38 29 20 7c 20 70 5b 31 5d 3b 0a 7d 0a 73 74  <8) | p[1];.}.st
4c70: 61 74 69 63 20 75 33 32 20 67 65 74 34 62 79 74  atic u32 get4byt
4c80: 65 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  e(unsigned char 
4c90: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70  *p){.  return (p
4ca0: 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 70 5b 31 5d  [0]<<24) | (p[1]
4cb0: 3c 3c 31 36 29 20 7c 20 28 70 5b 32 5d 3c 3c 38  <<16) | (p[2]<<8
4cc0: 29 20 7c 20 70 5b 33 5d 3b 0a 7d 0a 73 74 61 74  ) | p[3];.}.stat
4cd0: 69 63 20 76 6f 69 64 20 70 75 74 32 62 79 74 65  ic void put2byte
4ce0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
4cf0: 70 2c 20 75 33 32 20 76 29 7b 0a 20 20 70 5b 30  p, u32 v){.  p[0
4d00: 5d 20 3d 20 76 3e 3e 38 3b 0a 20 20 70 5b 31 5d  ] = v>>8;.  p[1]
4d10: 20 3d 20 76 3b 0a 7d 0a 73 74 61 74 69 63 20 76   = v;.}.static v
4d20: 6f 69 64 20 70 75 74 34 62 79 74 65 28 75 6e 73  oid put4byte(uns
4d30: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 2c 20 75  igned char *p, u
4d40: 33 32 20 76 29 7b 0a 20 20 70 5b 30 5d 20 3d 20  32 v){.  p[0] = 
4d50: 76 3e 3e 32 34 3b 0a 20 20 70 5b 31 5d 20 3d 20  v>>24;.  p[1] = 
4d60: 76 3e 3e 31 36 3b 0a 20 20 70 5b 32 5d 20 3d 20  v>>16;.  p[2] = 
4d70: 76 3e 3e 38 3b 0a 20 20 70 5b 33 5d 20 3d 20 76  v>>8;.  p[3] = v
4d80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69  ;.}../*.** Routi
4d90: 6e 65 73 20 74 6f 20 72 65 61 64 20 61 6e 64 20  nes to read and 
4da0: 77 72 69 74 65 20 76 61 72 69 61 62 6c 65 2d 6c  write variable-l
4db0: 65 6e 67 74 68 20 69 6e 74 65 67 65 72 73 2e 20  ength integers. 
4dc0: 20 54 68 65 73 65 20 75 73 65 64 20 74 6f 0a 2a   These used to.*
4dd0: 2a 20 62 65 20 64 65 66 69 6e 65 64 20 6c 6f 63  * be defined loc
4de0: 61 6c 6c 79 2c 20 62 75 74 20 6e 6f 77 20 77 65  ally, but now we
4df0: 20 75 73 65 20 74 68 65 20 76 61 72 69 6e 74 20   use the varint 
4e00: 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 65 20  routines in the 
4e10: 75 74 69 6c 2e 63 0a 2a 2a 20 66 69 6c 65 2e 0a  util.c.** file..
4e20: 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65 74 56 61  */.#define getVa
4e30: 72 69 6e 74 20 20 20 20 73 71 6c 69 74 65 33 47  rint    sqlite3G
4e40: 65 74 56 61 72 69 6e 74 0a 2f 2a 20 23 64 65 66  etVarint./* #def
4e50: 69 6e 65 20 67 65 74 56 61 72 69 6e 74 33 32 20  ine getVarint32 
4e60: 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e   sqlite3GetVarin
4e70: 74 33 32 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67  t32 */.#define g
4e80: 65 74 56 61 72 69 6e 74 33 32 28 41 2c 42 29 20  etVarint32(A,B) 
4e90: 20 28 28 2a 42 3d 2a 28 41 29 29 3c 3d 30 78 37   ((*B=*(A))<=0x7
4ea0: 66 3f 31 3a 73 71 6c 69 74 65 33 47 65 74 56 61  f?1:sqlite3GetVa
4eb0: 72 69 6e 74 33 32 28 41 2c 42 29 29 0a 23 64 65  rint32(A,B)).#de
4ec0: 66 69 6e 65 20 70 75 74 56 61 72 69 6e 74 20 20  fine putVarint  
4ed0: 20 20 73 71 6c 69 74 65 33 50 75 74 56 61 72 69    sqlite3PutVari
4ee0: 6e 74 0a 0a 2f 2a 20 54 68 65 20 64 61 74 61 62  nt../* The datab
4ef0: 61 73 65 20 70 61 67 65 20 74 68 65 20 50 45 4e  ase page the PEN
4f00: 44 49 4e 47 5f 42 59 54 45 20 6f 63 63 75 70 69  DING_BYTE occupi
4f10: 65 73 2e 20 54 68 69 73 20 70 61 67 65 20 69 73  es. This page is
4f20: 20 6e 65 76 65 72 20 75 73 65 64 2e 0a 2a 2a 20   never used..** 
4f30: 54 4f 44 4f 3a 20 54 68 69 73 20 6d 61 63 72 6f  TODO: This macro
4f40: 20 69 73 20 76 65 72 79 20 73 69 6d 69 6c 61 72   is very similar
4f50: 79 20 74 6f 20 50 41 47 45 52 5f 4d 4a 5f 50 47  y to PAGER_MJ_PG
4f60: 4e 4f 28 29 20 69 6e 20 70 61 67 65 72 2e 63 2e  NO() in pager.c.
4f70: 20 54 68 65 79 0a 2a 2a 20 73 68 6f 75 6c 64 20   They.** should 
4f80: 70 6f 73 73 69 62 6c 79 20 62 65 20 63 6f 6e 73  possibly be cons
4f90: 6f 6c 69 64 61 74 65 64 20 28 70 72 65 73 75 6d  olidated (presum
4fa0: 61 62 6c 79 20 69 6e 20 70 61 67 65 72 2e 68 29  ably in pager.h)
4fb0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 69 73 6b 20  ..**.** If disk 
4fc0: 49 2f 4f 20 69 73 20 6f 6d 69 74 74 65 64 20 28  I/O is omitted (
4fd0: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 74 68 65  meaning that the
4fe0: 20 64 61 74 61 62 61 73 65 20 69 73 20 73 74 6f   database is sto
4ff0: 72 65 64 20 70 75 72 65 6c 79 0a 2a 2a 20 69 6e  red purely.** in
5000: 20 6d 65 6d 6f 72 79 29 20 74 68 65 6e 20 74 68   memory) then th
5010: 65 72 65 20 69 73 20 6e 6f 20 70 65 6e 64 69 6e  ere is no pendin
5020: 67 20 62 79 74 65 2e 0a 2a 2f 0a 23 69 66 64 65  g byte..*/.#ifde
5030: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  f SQLITE_OMIT_DI
5040: 53 4b 49 4f 0a 23 20 64 65 66 69 6e 65 20 50 45  SKIO.# define PE
5050: 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
5060: 70 42 74 29 20 20 30 78 37 66 66 66 66 66 66 66  pBt)  0x7fffffff
5070: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
5080: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
5090: 45 28 70 42 74 29 20 28 28 50 45 4e 44 49 4e 47  E(pBt) ((PENDING
50a0: 5f 42 59 54 45 2f 28 70 42 74 29 2d 3e 70 61 67  _BYTE/(pBt)->pag
50b0: 65 53 69 7a 65 29 2b 31 29 0a 23 65 6e 64 69 66  eSize)+1).#endif
50c0: 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 6e 6b 65 64  ../*.** A linked
50d0: 20 6c 69 73 74 20 6f 66 20 74 68 65 20 66 6f 6c   list of the fol
50e0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
50f0: 73 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 42  s is stored at B
5100: 74 53 68 61 72 65 64 2e 70 4c 6f 63 6b 2e 0a 2a  tShared.pLock..*
5110: 2a 20 4c 6f 63 6b 73 20 61 72 65 20 61 64 64 65  * Locks are adde
5120: 64 20 28 6f 72 20 75 70 67 72 61 64 65 64 20 66  d (or upgraded f
5130: 72 6f 6d 20 52 45 41 44 5f 4c 4f 43 4b 20 74 6f  rom READ_LOCK to
5140: 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 77 68 65   WRITE_LOCK) whe
5150: 6e 20 61 20 63 75 72 73 6f 72 20 0a 2a 2a 20 69  n a cursor .** i
5160: 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20  s opened on the 
5170: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 20  table with root 
5180: 70 61 67 65 20 42 74 53 68 61 72 65 64 2e 69 54  page BtShared.iT
5190: 61 62 6c 65 2e 20 4c 6f 63 6b 73 20 61 72 65 20  able. Locks are 
51a0: 72 65 6d 6f 76 65 64 0a 2a 2a 20 66 72 6f 6d 20  removed.** from 
51b0: 74 68 69 73 20 6c 69 73 74 20 77 68 65 6e 20 61  this list when a
51c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
51d0: 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
51e0: 6c 65 64 20 62 61 63 6b 2c 20 6f 72 20 77 68 65  led back, or whe
51f0: 6e 0a 2a 2a 20 61 20 62 74 72 65 65 20 68 61 6e  n.** a btree han
5200: 64 6c 65 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a  dle is closed..*
5210: 2f 0a 73 74 72 75 63 74 20 42 74 4c 6f 63 6b 20  /.struct BtLock 
5220: 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  {.  Btree *pBtre
5230: 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72  e;        /* Btr
5240: 65 65 20 68 61 6e 64 6c 65 20 68 6f 6c 64 69 6e  ee handle holdin
5250: 67 20 74 68 69 73 20 6c 6f 63 6b 20 2a 2f 0a 20  g this lock */. 
5260: 20 50 67 6e 6f 20 69 54 61 62 6c 65 3b 20 20 20   Pgno iTable;   
5270: 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
5280: 61 67 65 20 6f 66 20 74 61 62 6c 65 20 2a 2f 0a  age of table */.
5290: 20 20 75 38 20 65 4c 6f 63 6b 3b 20 20 20 20 20    u8 eLock;     
52a0: 20 20 20 20 20 20 20 20 2f 2a 20 52 45 41 44 5f          /* READ_
52b0: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
52c0: 43 4b 20 2a 2f 0a 20 20 42 74 4c 6f 63 6b 20 2a  CK */.  BtLock *
52d0: 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 2f 2a  pNext;        /*
52e0: 20 4e 65 78 74 20 69 6e 20 42 74 53 68 61 72 65   Next in BtShare
52f0: 64 2e 70 4c 6f 63 6b 20 6c 69 73 74 20 2a 2f 0a  d.pLock list */.
5300: 7d 3b 0a 0a 2f 2a 20 43 61 6e 64 69 64 61 74 65  };../* Candidate
5310: 20 76 61 6c 75 65 73 20 66 6f 72 20 42 74 4c 6f   values for BtLo
5320: 63 6b 2e 65 4c 6f 63 6b 20 2a 2f 0a 23 64 65 66  ck.eLock */.#def
5330: 69 6e 65 20 52 45 41 44 5f 4c 4f 43 4b 20 20 20  ine READ_LOCK   
5340: 20 20 31 0a 23 64 65 66 69 6e 65 20 57 52 49 54    1.#define WRIT
5350: 45 5f 4c 4f 43 4b 20 20 20 20 32 0a 0a 23 69 66  E_LOCK    2..#if
5360: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5370: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
5380: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
5390: 69 6f 6e 73 20 71 75 65 72 79 54 61 62 6c 65 4c  ions queryTableL
53a0: 6f 63 6b 28 29 2c 20 6c 6f 63 6b 54 61 62 6c 65  ock(), lockTable
53b0: 28 29 20 61 6e 64 20 75 6e 6c 6f 63 6b 41 6c 6c  () and unlockAll
53c0: 54 61 62 6c 65 73 28 29 0a 20 20 2a 2a 20 6d 61  Tables().  ** ma
53d0: 6e 69 70 75 6c 61 74 65 20 65 6e 74 72 69 65 73  nipulate entries
53e0: 20 69 6e 20 74 68 65 20 42 74 53 68 61 72 65 64   in the BtShared
53f0: 2e 70 4c 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69  .pLock linked li
5400: 73 74 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  st used to store
5410: 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63  .  ** shared-cac
5420: 68 65 20 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c  he table level l
5430: 6f 63 6b 73 2e 20 49 66 20 74 68 65 20 6c 69 62  ocks. If the lib
5440: 72 61 72 79 20 69 73 20 63 6f 6d 70 69 6c 65 64  rary is compiled
5450: 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73   with the.  ** s
5460: 68 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74  hared-cache feat
5470: 75 72 65 20 64 69 73 61 62 6c 65 64 2c 20 74 68  ure disabled, th
5480: 65 6e 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79  en there is only
5490: 20 65 76 65 72 20 6f 6e 65 20 75 73 65 72 0a 20   ever one user. 
54a0: 20 2a 2a 20 6f 66 20 65 61 63 68 20 42 74 53 68   ** of each BtSh
54b0: 61 72 65 64 20 73 74 72 75 63 74 75 72 65 20 61  ared structure a
54c0: 6e 64 20 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69  nd so this locki
54d0: 6e 67 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  ng is not necess
54e0: 61 72 79 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65  ary. .  ** So de
54f0: 66 69 6e 65 20 74 68 65 20 6c 6f 63 6b 20 72 65  fine the lock re
5500: 6c 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 73 20  lated functions 
5510: 61 73 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a  as no-ops..  */.
5520: 20 20 23 64 65 66 69 6e 65 20 71 75 65 72 79 54    #define queryT
5530: 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20  ableLock(a,b,c) 
5540: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66  SQLITE_OK.  #def
5550: 69 6e 65 20 6c 6f 63 6b 54 61 62 6c 65 28 61 2c  ine lockTable(a,
5560: 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20  b,c) SQLITE_OK. 
5570: 20 23 64 65 66 69 6e 65 20 75 6e 6c 6f 63 6b 41   #define unlockA
5580: 6c 6c 54 61 62 6c 65 73 28 61 29 0a 20 20 23 64  llTables(a).  #d
5590: 65 66 69 6e 65 20 72 65 73 74 6f 72 65 4f 72 43  efine restoreOrC
55a0: 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
55b0: 6f 6e 28 61 2c 62 29 20 53 51 4c 49 54 45 5f 4f  on(a,b) SQLITE_O
55c0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 61 76 65  K.  #define save
55d0: 41 6c 6c 43 75 72 73 6f 72 73 28 61 2c 62 2c 63  AllCursors(a,b,c
55e0: 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 0a 23 65 6c  ) SQLITE_OK..#el
55f0: 73 65 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  se..static void 
5600: 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50  releasePage(MemP
5610: 61 67 65 20 2a 70 50 61 67 65 29 3b 0a 0a 2f 2a  age *pPage);../*
5620: 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75 72  .** Save the cur
5630: 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69  rent cursor posi
5640: 74 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72 69  tion in the vari
5650: 61 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e 6e  ables BtCursor.n
5660: 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75  Key .** and BtCu
5670: 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20 63  rsor.pKey. The c
5680: 75 72 73 6f 72 27 73 20 73 74 61 74 65 20 69 73  ursor's state is
5690: 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 52   set to CURSOR_R
56a0: 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2f 0a 73  EQUIRESEEK..*/.s
56b0: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43 75  tatic int saveCu
56c0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43  rsorPosition(BtC
56d0: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
56e0: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
56f0: 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  t( CURSOR_VALID=
5700: 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b  =pCur->eState );
5710: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43  .  assert( 0==pC
5720: 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 72  ur->pKey );..  r
5730: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
5740: 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 70  KeySize(pCur, &p
5750: 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 0a 20 20 2f  Cur->nKey);..  /
5760: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
5770: 69 6e 74 4b 65 79 20 74 61 62 6c 65 2c 20 74 68  intKey table, th
5780: 65 6e 20 74 68 65 20 61 62 6f 76 65 20 63 61 6c  en the above cal
5790: 6c 20 74 6f 20 42 74 72 65 65 4b 65 79 53 69 7a  l to BtreeKeySiz
57a0: 65 28 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20  e().  ** stores 
57b0: 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20  the integer key 
57c0: 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 2e 20 49  in pCur->nKey. I
57d0: 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73  n this case this
57e0: 20 76 61 6c 75 65 20 69 73 0a 20 20 2a 2a 20 61   value is.  ** a
57f0: 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69  ll that is requi
5800: 72 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  red. Otherwise, 
5810: 69 66 20 70 43 75 72 20 69 73 20 6e 6f 74 20 6f  if pCur is not o
5820: 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b 65 79  pen on an intKey
5830: 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65  .  ** table, the
5840: 6e 20 6d 61 6c 6c 6f 63 20 73 70 61 63 65 20 66  n malloc space f
5850: 6f 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  or and store the
5860: 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65   pCur->nKey byte
5870: 73 20 6f 66 20 6b 65 79 20 0a 20 20 2a 2a 20 64  s of key .  ** d
5880: 61 74 61 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ata..  */.  if( 
5890: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
58a0: 20 30 3d 3d 70 43 75 72 2d 3e 70 50 61 67 65 2d   0==pCur->pPage-
58b0: 3e 69 6e 74 4b 65 79 29 7b 0a 20 20 20 20 76 6f  >intKey){.    vo
58c0: 69 64 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74  id *pKey = sqlit
58d0: 65 4d 61 6c 6c 6f 63 28 70 43 75 72 2d 3e 6e 4b  eMalloc(pCur->nK
58e0: 65 79 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65  ey);.    if( pKe
58f0: 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  y ){.      rc = 
5900: 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28  sqlite3BtreeKey(
5910: 70 43 75 72 2c 20 30 2c 20 70 43 75 72 2d 3e 6e  pCur, 0, pCur->n
5920: 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20  Key, pKey);.    
5930: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5940: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
5950: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79  Cur->pKey = pKey
5960: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
5970: 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
5980: 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d  e(pKey);.      }
5990: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
59a0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
59b0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
59c0: 20 61 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e   assert( !pCur->
59d0: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c  pPage->intKey ||
59e0: 20 21 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a   !pCur->pKey );.
59f0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
5a00: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 6c 65  E_OK ){.    rele
5a10: 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 70 50  asePage(pCur->pP
5a20: 61 67 65 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  age);.    pCur->
5a30: 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 70  pPage = 0;.    p
5a40: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
5a50: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
5a60: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
5a70: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76  rc;.}../*.** Sav
5a80: 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20  e the positions 
5a90: 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 65  of all cursors e
5aa0: 78 63 65 70 74 20 70 45 78 63 65 70 74 20 6f 70  xcept pExcept op
5ab0: 65 6e 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  en on the table 
5ac0: 0a 2a 2a 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  .** with root-pa
5ad0: 67 65 20 69 52 6f 6f 74 2e 20 55 73 75 61 6c 6c  ge iRoot. Usuall
5ae0: 79 2c 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  y, this is calle
5af0: 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63 75  d just before cu
5b00: 72 73 6f 72 0a 2a 2a 20 70 45 78 63 65 70 74 20  rsor.** pExcept 
5b10: 69 73 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66  is used to modif
5b20: 79 20 74 68 65 20 74 61 62 6c 65 20 28 42 74 72  y the table (Btr
5b30: 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74  eeDelete() or Bt
5b40: 72 65 65 49 6e 73 65 72 74 28 29 29 2e 0a 2a 2f  reeInsert())..*/
5b50: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
5b60: 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61  AllCursors(BtSha
5b70: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69  red *pBt, Pgno i
5b80: 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a  Root, BtCursor *
5b90: 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75  pExcept){.  BtCu
5ba0: 72 73 6f 72 20 2a 70 3b 0a 20 20 69 66 28 20 73  rsor *p;.  if( s
5bb0: 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61  qlite3ThreadData
5bc0: 52 65 61 64 4f 6e 6c 79 28 29 2d 3e 75 73 65 53  ReadOnly()->useS
5bd0: 68 61 72 65 64 44 61 74 61 20 29 7b 0a 20 20 20  haredData ){.   
5be0: 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72   for(p=pBt->pCur
5bf0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
5c00: 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  xt){.      if( p
5c10: 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d  !=pExcept && (0=
5c20: 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e  =iRoot || p->pgn
5c30: 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 26 26  oRoot==iRoot) &&
5c40: 20 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 65   .          p->e
5c50: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
5c60: 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 69  LID ){.        i
5c70: 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75 72 73  nt rc = saveCurs
5c80: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20  orPosition(p);. 
5c90: 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54         if( SQLIT
5ca0: 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
5cb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
5cc0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5cd0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
5ce0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
5cf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72  .}../*.** Restor
5d00: 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
5d10: 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20  the position it 
5d20: 77 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c  was in (or as cl
5d30: 6f 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62  ose to as possib
5d40: 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65  le).** when save
5d50: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
5d60: 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74   was called. Not
5d70: 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c  e that this call
5d80: 20 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a   deletes the .**
5d90: 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20   saved position 
5da0: 69 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73  info stored by s
5db0: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
5dc0: 6e 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61  n(), so there ca
5dd0: 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20  n be.** at most 
5de0: 6f 6e 65 20 65 66 66 65 63 74 69 76 65 20 72 65  one effective re
5df0: 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73  storeOrClearCurs
5e00: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c  orPosition() cal
5e10: 6c 20 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a  l after each .**
5e20: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
5e30: 69 6f 6e 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ion()..**.** If 
5e40: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
5e50: 65 6e 74 20 61 72 67 75 6d 65 6e 74 20 2d 20 64  ent argument - d
5e60: 6f 53 65 65 6b 20 2d 20 69 73 20 66 61 6c 73 65  oSeek - is false
5e70: 2c 20 74 68 65 6e 20 69 6e 73 74 65 61 64 20 6f  , then instead o
5e80: 66 20 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 20  f .** returning 
5e90: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 69 74  the cursor to it
5ea0: 27 73 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f  's saved positio
5eb0: 6e 2c 20 61 6e 79 20 73 61 76 65 64 20 70 6f 73  n, any saved pos
5ec0: 69 74 69 6f 6e 20 69 73 20 64 65 6c 65 74 65 64  ition is deleted
5ed0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 75 72 73  .** and the curs
5ee0: 6f 72 20 73 74 61 74 65 20 73 65 74 20 74 6f 20  or state set to 
5ef0: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 2e 0a  CURSOR_INVALID..
5f00: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
5f10: 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73  storeOrClearCurs
5f20: 6f 72 50 6f 73 69 74 69 6f 6e 58 28 42 74 43 75  orPositionX(BtCu
5f30: 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
5f40: 64 6f 53 65 65 6b 29 7b 0a 20 20 69 6e 74 20 72  doSeek){.  int r
5f50: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
5f60: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
5f70: 54 68 72 65 61 64 44 61 74 61 52 65 61 64 4f 6e  ThreadDataReadOn
5f80: 6c 79 28 29 2d 3e 75 73 65 53 68 61 72 65 64 44  ly()->useSharedD
5f90: 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ata );.  assert(
5fa0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
5fb0: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
5fc0: 4b 20 29 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74  K );.  pCur->eSt
5fd0: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
5fe0: 41 4c 49 44 3b 0a 20 20 69 66 28 20 64 6f 53 65  ALID;.  if( doSe
5ff0: 65 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  ek ){.    rc = s
6000: 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
6010: 6f 28 70 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b  o(pCur, pCur->pK
6020: 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20  ey, pCur->nKey, 
6030: 26 70 43 75 72 2d 3e 73 6b 69 70 29 3b 0a 20 20  &pCur->skip);.  
6040: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
6050: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
6060: 69 74 65 46 72 65 65 28 70 43 75 72 2d 3e 70 4b  iteFree(pCur->pK
6070: 65 79 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70  ey);.    pCur->p
6080: 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  Key = 0;.    ass
6090: 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49  ert( CURSOR_VALI
60a0: 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
60b0: 7c 7c 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  || CURSOR_INVALI
60c0: 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
60d0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
60e0: 72 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72  rc;.}..#define r
60f0: 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72  estoreOrClearCur
6100: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 2c 78 29  sorPosition(p,x)
6110: 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74 65 3d   \.  (p->eState=
6120: 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
6130: 45 45 4b 3f 72 65 73 74 6f 72 65 4f 72 43 6c 65  EEK?restoreOrCle
6140: 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  arCursorPosition
6150: 58 28 70 2c 78 29 3a 53 51 4c 49 54 45 5f 4f 4b  X(p,x):SQLITE_OK
6160: 29 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74  )../*.** Query t
6170: 6f 20 73 65 65 20 69 66 20 62 74 72 65 65 20 68  o see if btree h
6180: 61 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61  andle p may obta
6190: 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70  in a lock of typ
61a0: 65 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41  e eLock .** (REA
61b0: 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f  D_LOCK or WRITE_
61c0: 4c 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62  LOCK) on the tab
61d0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
61e0: 65 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a  e iTab. Return.*
61f0: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74  * SQLITE_OK if t
6200: 68 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f  he lock may be o
6210: 62 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c  btained (by call
6220: 69 6e 67 20 6c 6f 63 6b 54 61 62 6c 65 28 29 29  ing lockTable())
6230: 2c 20 6f 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c  , or.** SQLITE_L
6240: 4f 43 4b 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f  OCKED if not..*/
6250: 0a 73 74 61 74 69 63 20 69 6e 74 20 71 75 65 72  .static int quer
6260: 79 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  yTableLock(Btree
6270: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20   *p, Pgno iTab, 
6280: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
6290: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
62a0: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
62b0: 49 74 65 72 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  Iter;..  /* This
62c0: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
62d0: 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  he shared-cache 
62e0: 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a  is not enabled *
62f0: 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74  /.  if( 0==sqlit
6300: 65 33 54 68 72 65 61 64 44 61 74 61 52 65 61 64  e3ThreadDataRead
6310: 4f 6e 6c 79 28 29 2d 3e 75 73 65 53 68 61 72 65  Only()->useShare
6320: 64 44 61 74 61 20 29 7b 0a 20 20 20 20 72 65 74  dData ){.    ret
6330: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
6340: 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 28 61   }..  /* This (a
6350: 6c 6f 6e 67 20 77 69 74 68 20 6c 6f 63 6b 54 61  long with lockTa
6360: 62 6c 65 28 29 29 20 69 73 20 77 68 65 72 65 20  ble()) is where 
6370: 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74  the ReadUncommit
6380: 74 65 64 20 66 6c 61 67 20 69 73 0a 20 20 2a 2a  ted flag is.  **
6390: 20 64 65 61 6c 74 20 77 69 74 68 2e 20 49 66 20   dealt with. If 
63a0: 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 71 75  the caller is qu
63b0: 65 72 79 69 6e 67 20 66 6f 72 20 61 20 72 65 61  erying for a rea
63c0: 64 2d 6c 6f 63 6b 20 61 6e 64 20 74 68 65 20 66  d-lock and the f
63d0: 6c 61 67 20 69 73 0a 20 20 2a 2a 20 73 65 74 2c  lag is.  ** set,
63e0: 20 69 74 20 69 73 20 75 6e 63 6f 6e 64 69 74 69   it is unconditi
63f0: 6f 6e 61 6c 6c 79 20 67 72 61 6e 74 65 64 20 2d  onally granted -
6400: 20 65 76 65 6e 20 69 66 20 74 68 65 72 65 20 61   even if there a
6410: 72 65 20 77 72 69 74 65 2d 6c 6f 63 6b 73 0a 20  re write-locks. 
6420: 20 2a 2a 20 6f 6e 20 74 68 65 20 74 61 62 6c 65   ** on the table
6430: 2e 20 49 66 20 61 20 77 72 69 74 65 2d 6c 6f 63  . If a write-loc
6440: 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  k is requested, 
6450: 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74  the ReadUncommit
6460: 74 65 64 20 66 6c 61 67 0a 20 20 2a 2a 20 69 73  ted flag.  ** is
6470: 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 2e   not considered.
6480: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 66 75  .  **.  ** In fu
6490: 6e 63 74 69 6f 6e 20 6c 6f 63 6b 54 61 62 6c 65  nction lockTable
64a0: 28 29 2c 20 69 66 20 61 20 72 65 61 64 2d 6c 6f  (), if a read-lo
64b0: 63 6b 20 69 73 20 64 65 6d 61 6e 64 65 64 20 61  ck is demanded a
64c0: 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20 52 65 61  nd the .  ** Rea
64d0: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61  dUncommitted fla
64e0: 67 20 69 73 20 73 65 74 2c 20 6e 6f 20 65 6e 74  g is set, no ent
64f0: 72 79 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ry is added to t
6500: 68 65 20 6c 6f 63 6b 73 20 6c 69 73 74 20 0a 20  he locks list . 
6510: 20 2a 2a 20 28 42 74 53 68 61 72 65 64 2e 70 4c   ** (BtShared.pL
6520: 6f 63 6b 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ock)..  **.  ** 
6530: 54 6f 20 73 75 6d 6d 61 72 69 7a 65 3a 20 49 66  To summarize: If
6540: 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69   the ReadUncommi
6550: 74 74 65 64 20 66 6c 61 67 20 69 73 20 73 65 74  tted flag is set
6560: 2c 20 74 68 65 6e 20 72 65 61 64 20 63 75 72 73  , then read curs
6570: 6f 72 73 20 64 6f 0a 20 20 2a 2a 20 6e 6f 74 20  ors do.  ** not 
6580: 63 72 65 61 74 65 20 6f 72 20 72 65 73 70 65 63  create or respec
6590: 74 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2e 20 54  t table locks. T
65a0: 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 63 65  he locking proce
65b0: 64 75 72 65 20 66 6f 72 20 61 20 0a 20 20 2a 2a  dure for a .  **
65c0: 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 64 6f   write-cursor do
65d0: 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 2e 0a 20  es not change.. 
65e0: 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20 20 21   */.  if( .    !
65f0: 70 2d 3e 70 53 71 6c 69 74 65 20 7c 7c 20 0a 20  p->pSqlite || . 
6600: 20 20 20 30 3d 3d 28 70 2d 3e 70 53 71 6c 69 74     0==(p->pSqlit
6610: 65 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  e->flags&SQLITE_
6620: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29  ReadUncommitted)
6630: 20 7c 7c 20 0a 20 20 20 20 65 4c 6f 63 6b 3d 3d   || .    eLock==
6640: 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 0a 20 20  WRITE_LOCK ||.  
6650: 20 20 69 54 61 62 3d 3d 4d 41 53 54 45 52 5f 52    iTab==MASTER_R
6660: 4f 4f 54 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72  OOT.  ){.    for
6670: 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
6680: 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
6690: 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
66a0: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
66b0: 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49 74  pBtree!=p && pIt
66c0: 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62  er->iTable==iTab
66d0: 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 28   && .          (
66e0: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c  pIter->eLock!=eL
66f0: 6f 63 6b 20 7c 7c 20 65 4c 6f 63 6b 21 3d 52 45  ock || eLock!=RE
6700: 41 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20  AD_LOCK) ){.    
6710: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6720: 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20  E_LOCKED;.      
6730: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
6740: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6750: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c  }../*.** Add a l
6760: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
6770: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
6780: 69 54 61 62 6c 65 20 74 6f 20 74 68 65 20 73 68  iTable to the sh
6790: 61 72 65 64 2d 62 74 72 65 65 20 75 73 65 64 0a  ared-btree used.
67a0: 2a 2a 20 62 79 20 42 74 72 65 65 20 68 61 6e 64  ** by Btree hand
67b0: 6c 65 20 70 2e 20 50 61 72 61 6d 65 74 65 72 20  le p. Parameter 
67c0: 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 65 69  eLock must be ei
67d0: 74 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20 6f  ther READ_LOCK o
67e0: 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43 4b  r .** WRITE_LOCK
67f0: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
6800: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
6810: 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64   the lock is add
6820: 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e  ed successfully.
6830: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64   SQLITE_BUSY and
6840: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
6850: 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 72 65 74   may also be ret
6860: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
6870: 20 69 6e 74 20 6c 6f 63 6b 54 61 62 6c 65 28 42   int lockTable(B
6880: 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54  tree *p, Pgno iT
6890: 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b  able, u8 eLock){
68a0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
68b0: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c   = p->pBt;.  BtL
68c0: 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a  ock *pLock = 0;.
68d0: 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b    BtLock *pIter;
68e0: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61  ..  /* This is a
68f0: 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68   no-op if the sh
6900: 61 72 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f  ared-cache is no
6910: 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69  t enabled */.  i
6920: 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 54 68 72  f( 0==sqlite3Thr
6930: 65 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79 28  eadDataReadOnly(
6940: 29 2d 3e 75 73 65 53 68 61 72 65 64 44 61 74 61  )->useSharedData
6950: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
6960: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
6970: 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
6980: 4f 4b 3d 3d 71 75 65 72 79 54 61 62 6c 65 4c 6f  OK==queryTableLo
6990: 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c  ck(p, iTable, eL
69a0: 6f 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  ock) );..  /* If
69b0: 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d   the read-uncomm
69c0: 69 74 74 65 64 20 66 6c 61 67 20 69 73 20 73 65  itted flag is se
69d0: 74 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63  t and a read-loc
69e0: 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 0a  k is requested,.
69f0: 20 20 2a 2a 20 72 65 74 75 72 6e 20 65 61 72 6c    ** return earl
6a00: 79 20 77 69 74 68 6f 75 74 20 61 64 64 69 6e 67  y without adding
6a10: 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65   an entry to the
6a20: 20 42 74 53 68 61 72 65 64 2e 70 4c 6f 63 6b 20   BtShared.pLock 
6a30: 6c 69 73 74 2e 20 53 65 65 0a 20 20 2a 2a 20 63  list. See.  ** c
6a40: 6f 6d 6d 65 6e 74 20 69 6e 20 66 75 6e 63 74 69  omment in functi
6a50: 6f 6e 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63  on queryTableLoc
6a60: 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 69 6e 66  k() for more inf
6a70: 6f 20 6f 6e 20 68 61 6e 64 6c 69 6e 67 20 0a 20  o on handling . 
6a80: 20 2a 2a 20 74 68 65 20 52 65 61 64 55 6e 63 6f   ** the ReadUnco
6a90: 6d 6d 69 74 74 65 64 20 66 6c 61 67 2e 0a 20 20  mmitted flag..  
6aa0: 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20 20 28 70  */.  if( .    (p
6ab0: 2d 3e 70 53 71 6c 69 74 65 29 20 26 26 20 0a 20  ->pSqlite) && . 
6ac0: 20 20 20 28 70 2d 3e 70 53 71 6c 69 74 65 2d 3e     (p->pSqlite->
6ad0: 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61  flags&SQLITE_Rea
6ae0: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 20 26 26  dUncommitted) &&
6af0: 20 0a 20 20 20 20 28 65 4c 6f 63 6b 3d 3d 52 45   .    (eLock==RE
6b00: 41 44 5f 4c 4f 43 4b 29 20 26 26 0a 20 20 20 20  AD_LOCK) &&.    
6b10: 69 54 61 62 6c 65 21 3d 4d 41 53 54 45 52 5f 52  iTable!=MASTER_R
6b20: 4f 4f 54 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  OOT.  ){.    ret
6b30: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
6b40: 20 7d 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 73   }..  /* First s
6b50: 65 61 72 63 68 20 74 68 65 20 6c 69 73 74 20 66  earch the list f
6b60: 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6c  or an existing l
6b70: 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74 61 62 6c  ock on this tabl
6b80: 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49 74 65  e. */.  for(pIte
6b90: 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
6ba0: 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
6bb0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
6bc0: 28 20 70 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d  ( pIter->iTable=
6bd0: 3d 69 54 61 62 6c 65 20 26 26 20 70 49 74 65 72  =iTable && pIter
6be0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
6bf0: 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20 70 49 74       pLock = pIt
6c00: 65 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  er;.      break;
6c10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
6c20: 20 49 66 20 74 68 65 20 61 62 6f 76 65 20 73 65   If the above se
6c30: 61 72 63 68 20 64 69 64 20 6e 6f 74 20 66 69 6e  arch did not fin
6c40: 64 20 61 20 42 74 4c 6f 63 6b 20 73 74 72 75 63  d a BtLock struc
6c50: 74 20 61 73 73 6f 63 69 61 74 69 6e 67 20 42 74  t associating Bt
6c60: 72 65 65 20 70 0a 20 20 2a 2a 20 77 69 74 68 20  ree p.  ** with 
6c70: 74 61 62 6c 65 20 69 54 61 62 6c 65 2c 20 61 6c  table iTable, al
6c80: 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e 64 20 6c  locate one and l
6c90: 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74 68 65 20  ink it into the 
6ca0: 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  list..  */.  if(
6cb0: 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70   !pLock ){.    p
6cc0: 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63 6b 20 2a  Lock = (BtLock *
6cd0: 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 69  )sqliteMalloc(si
6ce0: 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20  zeof(BtLock));. 
6cf0: 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b     if( !pLock ){
6d00: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
6d10: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
6d20: 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61  }.    pLock->iTa
6d30: 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20  ble = iTable;.  
6d40: 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20    pLock->pBtree 
6d50: 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  = p;.    pLock->
6d60: 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f  pNext = pBt->pLo
6d70: 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f  ck;.    pBt->pLo
6d80: 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = pLock;.  }.
6d90: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 42 74  .  /* Set the Bt
6da0: 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61  Lock.eLock varia
6db0: 62 6c 65 20 74 6f 20 74 68 65 20 6d 61 78 69 6d  ble to the maxim
6dc0: 75 6d 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  um of the curren
6dd0: 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20  t lock.  ** and 
6de0: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
6df0: 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69  ck. This means i
6e00: 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77  f a write-lock w
6e10: 61 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 0a  as already held.
6e20: 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 61 64 2d    ** and a read-
6e30: 6c 6f 63 6b 20 72 65 71 75 65 73 74 65 64 2c 20  lock requested, 
6e40: 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65  we don't incorre
6e50: 63 74 6c 79 20 64 6f 77 6e 67 72 61 64 65 20 74  ctly downgrade t
6e60: 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  he lock..  */.  
6e70: 61 73 73 65 72 74 28 20 57 52 49 54 45 5f 4c 4f  assert( WRITE_LO
6e80: 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a  CK>READ_LOCK );.
6e90: 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63    if( eLock>pLoc
6ea0: 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k->eLock ){.    
6eb0: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65  pLock->eLock = e
6ec0: 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Lock;.  }..  ret
6ed0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
6ee0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
6ef0: 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f  all the table lo
6f00: 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69  cks (locks obtai
6f10: 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f  ned via calls to
6f20: 20 74 68 65 20 6c 6f 63 6b 54 61 62 6c 65 28 29   the lockTable()
6f30: 0a 2a 2a 20 70 72 6f 63 65 64 75 72 65 29 20 68  .** procedure) h
6f40: 65 6c 64 20 62 79 20 42 74 72 65 65 20 68 61 6e  eld by Btree han
6f50: 64 6c 65 20 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  dle p..*/.static
6f60: 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 41 6c 6c 54   void unlockAllT
6f70: 61 62 6c 65 73 28 42 74 72 65 65 20 2a 70 29 7b  ables(Btree *p){
6f80: 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49 74  .  BtLock **ppIt
6f90: 65 72 20 3d 20 26 70 2d 3e 70 42 74 2d 3e 70 4c  er = &p->pBt->pL
6fa0: 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ock;..  /* If th
6fb0: 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 65  e shared-cache e
6fc0: 78 74 65 6e 73 69 6f 6e 20 69 73 20 6e 6f 74 20  xtension is not 
6fd0: 65 6e 61 62 6c 65 64 2c 20 74 68 65 72 65 20 73  enabled, there s
6fe0: 68 6f 75 6c 64 20 62 65 20 6e 6f 0a 20 20 2a 2a  hould be no.  **
6ff0: 20 6c 6f 63 6b 73 20 69 6e 20 74 68 65 20 42 74   locks in the Bt
7000: 53 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 73  Shared.pLock lis
7010: 74 2c 20 6d 61 6b 69 6e 67 20 74 68 69 73 20 70  t, making this p
7020: 72 6f 63 65 64 75 72 65 20 61 20 6e 6f 2d 6f 70  rocedure a no-op
7030: 2e 20 41 73 73 65 72 74 0a 20 20 2a 2a 20 74 68  . Assert.  ** th
7040: 61 74 20 74 68 69 73 20 69 73 20 74 68 65 20 63  at this is the c
7050: 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ase..  */.  asse
7060: 72 74 28 20 73 71 6c 69 74 65 33 54 68 72 65 61  rt( sqlite3Threa
7070: 64 44 61 74 61 52 65 61 64 4f 6e 6c 79 28 29 2d  dDataReadOnly()-
7080: 3e 75 73 65 53 68 61 72 65 64 44 61 74 61 20 7c  >useSharedData |
7090: 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29 3b 0a  | 0==*ppIter );.
70a0: 0a 20 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65  .  while( *ppIte
70b0: 72 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20  r ){.    BtLock 
70c0: 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72  *pLock = *ppIter
70d0: 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d  ;.    if( pLock-
70e0: 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20  >pBtree==p ){.  
70f0: 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70 4c      *ppIter = pL
7100: 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ock->pNext;.    
7110: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 6f    sqliteFree(pLo
7120: 63 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ck);.    }else{.
7130: 20 20 20 20 20 20 70 70 49 74 65 72 20 3d 20 26        ppIter = &
7140: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20  pLock->pNext;.  
7150: 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
7160: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
7170: 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a  SHARED_CACHE */.
7180: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7190: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
71a0: 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 6d 61 63 72  /*.** These macr
71b0: 6f 73 20 64 65 66 69 6e 65 20 74 68 65 20 6c 6f  os define the lo
71c0: 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 6f  cation of the po
71d0: 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20  inter-map entry 
71e0: 66 6f 72 20 61 20 0a 2a 2a 20 64 61 74 61 62 61  for a .** databa
71f0: 73 65 20 70 61 67 65 2e 20 54 68 65 20 66 69 72  se page. The fir
7200: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 65  st argument to e
7210: 61 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ach is the numbe
7220: 72 20 6f 66 20 75 73 61 62 6c 65 0a 2a 2a 20 62  r of usable.** b
7230: 79 74 65 73 20 6f 6e 20 65 61 63 68 20 70 61 67  ytes on each pag
7240: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
7250: 65 20 28 6f 66 74 65 6e 20 31 30 32 34 29 2e 20  e (often 1024). 
7260: 54 68 65 20 73 65 63 6f 6e 64 20 69 73 20 74 68  The second is th
7270: 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72  e.** page number
7280: 20 74 6f 20 6c 6f 6f 6b 20 75 70 20 69 6e 20 74   to look up in t
7290: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a  he pointer map..
72a0: 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 50 41 47  **.** PTRMAP_PAG
72b0: 45 4e 4f 20 72 65 74 75 72 6e 73 20 74 68 65 20  ENO returns the 
72c0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6e 75  database page nu
72d0: 6d 62 65 72 20 6f 66 20 74 68 65 20 70 6f 69 6e  mber of the poin
72e0: 74 65 72 2d 6d 61 70 0a 2a 2a 20 70 61 67 65 20  ter-map.** page 
72f0: 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65 20  that stores the 
7300: 72 65 71 75 69 72 65 64 20 70 6f 69 6e 74 65 72  required pointer
7310: 2e 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53  . PTRMAP_PTROFFS
7320: 45 54 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68  ET returns.** th
7330: 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20  e offset of the 
7340: 72 65 71 75 65 73 74 65 64 20 6d 61 70 20 65 6e  requested map en
7350: 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  try..**.** If th
7360: 65 20 70 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20  e pgno argument 
7370: 70 61 73 73 65 64 20 74 6f 20 50 54 52 4d 41 50  passed to PTRMAP
7380: 5f 50 41 47 45 4e 4f 20 69 73 20 61 20 70 6f 69  _PAGENO is a poi
7390: 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 0a 2a  nter-map page,.*
73a0: 2a 20 74 68 65 6e 20 70 67 6e 6f 20 69 73 20 72  * then pgno is r
73b0: 65 74 75 72 6e 65 64 2e 20 53 6f 20 28 70 67 6e  eturned. So (pgn
73c0: 6f 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f  o==PTRMAP_PAGENO
73d0: 28 70 67 73 7a 2c 20 70 67 6e 6f 29 29 20 63 61  (pgsz, pgno)) ca
73e0: 6e 20 62 65 0a 2a 2a 20 75 73 65 64 20 74 6f 20  n be.** used to 
73f0: 74 65 73 74 20 69 66 20 70 67 6e 6f 20 69 73 20  test if pgno is 
7400: 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
7410: 67 65 2e 20 50 54 52 4d 41 50 5f 49 53 50 41 47  ge. PTRMAP_ISPAG
7420: 45 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20  E implements.** 
7430: 74 68 69 73 20 74 65 73 74 2e 0a 2a 2f 0a 23 64  this test..*/.#d
7440: 65 66 69 6e 65 20 50 54 52 4d 41 50 5f 50 41 47  efine PTRMAP_PAG
7450: 45 4e 4f 28 70 42 74 2c 20 70 67 6e 6f 29 20 70  ENO(pBt, pgno) p
7460: 74 72 6d 61 70 50 61 67 65 6e 6f 28 70 42 74 2c  trmapPageno(pBt,
7470: 20 70 67 6e 6f 29 0a 23 64 65 66 69 6e 65 20 50   pgno).#define P
7480: 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28  TRMAP_PTROFFSET(
7490: 70 42 74 2c 20 70 67 6e 6f 29 20 28 35 2a 28 70  pBt, pgno) (5*(p
74a0: 67 6e 6f 2d 70 74 72 6d 61 70 50 61 67 65 6e 6f  gno-ptrmapPageno
74b0: 28 70 42 74 2c 20 70 67 6e 6f 29 2d 31 29 29 0a  (pBt, pgno)-1)).
74c0: 23 64 65 66 69 6e 65 20 50 54 52 4d 41 50 5f 49  #define PTRMAP_I
74d0: 53 50 41 47 45 28 70 42 74 2c 20 70 67 6e 6f 29  SPAGE(pBt, pgno)
74e0: 20 28 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28   (PTRMAP_PAGENO(
74f0: 28 70 42 74 29 2c 28 70 67 6e 6f 29 29 3d 3d 28  (pBt),(pgno))==(
7500: 70 67 6e 6f 29 29 0a 0a 73 74 61 74 69 63 20 50  pgno))..static P
7510: 67 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f  gno ptrmapPageno
7520: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
7530: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e  Pgno pgno){.  in
7540: 74 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61  t nPagesPerMapPa
7550: 67 65 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c  ge = (pBt->usabl
7560: 65 53 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 6e  eSize/5)+1;.  in
7570: 74 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67 6e  t iPtrMap = (pgn
7580: 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d 61  o-2)/nPagesPerMa
7590: 70 50 61 67 65 3b 0a 20 20 69 6e 74 20 72 65 74  pPage;.  int ret
75a0: 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50 61 67   = (iPtrMap*nPag
75b0: 65 73 50 65 72 4d 61 70 50 61 67 65 29 20 2b 20  esPerMapPage) + 
75c0: 32 3b 20 0a 20 20 69 66 28 20 72 65 74 3d 3d 50  2; .  if( ret==P
75d0: 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
75e0: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65 74  (pBt) ){.    ret
75f0: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
7600: 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   ret;.}../*.** T
7610: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 69  he pointer map i
7620: 73 20 61 20 6c 6f 6f 6b 75 70 20 74 61 62 6c 65  s a lookup table
7630: 20 74 68 61 74 20 69 64 65 6e 74 69 66 69 65 73   that identifies
7640: 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
7650: 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20 63 68 69   for.** each chi
7660: 6c 64 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ld page in the d
7670: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
7680: 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 69  he parent page i
7690: 73 20 74 68 65 20 70 61 67 65 20 74 68 61 74 0a  s the page that.
76a0: 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  ** contains a po
76b0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 68 69  inter to the chi
76c0: 6c 64 2e 20 20 45 76 65 72 79 20 70 61 67 65 20  ld.  Every page 
76d0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
76e0: 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 30 20 6f 72  contains.** 0 or
76f0: 20 31 20 70 61 72 65 6e 74 20 70 61 67 65 73 2e   1 parent pages.
7700: 20 20 28 49 6e 20 74 68 69 73 20 63 6f 6e 74 65    (In this conte
7710: 78 74 20 27 64 61 74 61 62 61 73 65 20 70 61 67  xt 'database pag
7720: 65 27 20 72 65 66 65 72 73 0a 2a 2a 20 74 6f 20  e' refers.** to 
7730: 61 6e 79 20 70 61 67 65 20 74 68 61 74 20 69 73  any page that is
7740: 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 74 68 65   not part of the
7750: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 69 74 73   pointer map its
7760: 65 6c 66 2e 29 20 20 45 61 63 68 20 70 6f 69 6e  elf.)  Each poin
7770: 74 65 72 20 6d 61 70 0a 2a 2a 20 65 6e 74 72 79  ter map.** entry
7780: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
7790: 69 6e 67 6c 65 20 62 79 74 65 20 27 74 79 70 65  ingle byte 'type
77a0: 27 20 61 6e 64 20 61 20 34 20 62 79 74 65 20 70  ' and a 4 byte p
77b0: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
77c0: 72 2e 0a 2a 2a 20 54 68 65 20 50 54 52 4d 41 50  r..** The PTRMAP
77d0: 5f 58 58 58 20 69 64 65 6e 74 69 66 69 65 72 73  _XXX identifiers
77e0: 20 62 65 6c 6f 77 20 61 72 65 20 74 68 65 20 76   below are the v
77f0: 61 6c 69 64 20 74 79 70 65 73 2e 0a 2a 2a 0a 2a  alid types..**.*
7800: 2a 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66  * The purpose of
7810: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
7820: 20 69 73 20 74 6f 20 66 61 63 69 6c 69 74 79 20   is to facility 
7830: 6d 6f 76 69 6e 67 20 70 61 67 65 73 20 66 72 6f  moving pages fro
7840: 6d 20 6f 6e 65 0a 2a 2a 20 70 6f 73 69 74 69 6f  m one.** positio
7850: 6e 20 69 6e 20 74 68 65 20 66 69 6c 65 20 74 6f  n in the file to
7860: 20 61 6e 6f 74 68 65 72 20 61 73 20 70 61 72 74   another as part
7870: 20 6f 66 20 61 75 74 6f 76 61 63 75 75 6d 2e 20   of autovacuum. 
7880: 20 57 68 65 6e 20 61 20 70 61 67 65 0a 2a 2a 20   When a page.** 
7890: 69 73 20 6d 6f 76 65 64 2c 20 74 68 65 20 70 6f  is moved, the po
78a0: 69 6e 74 65 72 20 69 6e 20 69 74 73 20 70 61 72  inter in its par
78b0: 65 6e 74 20 6d 75 73 74 20 62 65 20 75 70 64 61  ent must be upda
78c0: 74 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ted to point to 
78d0: 74 68 65 0a 2a 2a 20 6e 65 77 20 6c 6f 63 61 74  the.** new locat
78e0: 69 6f 6e 2e 20 20 54 68 65 20 70 6f 69 6e 74 65  ion.  The pointe
78f0: 72 20 6d 61 70 20 69 73 20 75 73 65 64 20 74 6f  r map is used to
7900: 20 6c 6f 63 61 74 65 20 74 68 65 20 70 61 72 65   locate the pare
7910: 6e 74 20 70 61 67 65 20 71 75 69 63 6b 6c 79 2e  nt page quickly.
7920: 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 52 4f  .**.** PTRMAP_RO
7930: 4f 54 50 41 47 45 3a 20 54 68 65 20 64 61 74 61  OTPAGE: The data
7940: 62 61 73 65 20 70 61 67 65 20 69 73 20 61 20 72  base page is a r
7950: 6f 6f 74 2d 70 61 67 65 2e 20 54 68 65 20 70 61  oot-page. The pa
7960: 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6e 6f 74  ge-number is not
7970: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
7980: 20 20 20 20 20 75 73 65 64 20 69 6e 20 74 68 69       used in thi
7990: 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 54  s case..**.** PT
79a0: 52 4d 41 50 5f 46 52 45 45 50 41 47 45 3a 20 54  RMAP_FREEPAGE: T
79b0: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
79c0: 20 69 73 20 61 6e 20 75 6e 75 73 65 64 20 28 66   is an unused (f
79d0: 72 65 65 29 20 70 61 67 65 2e 20 54 68 65 20 70  ree) page. The p
79e0: 61 67 65 2d 6e 75 6d 62 65 72 20 0a 2a 2a 20 20  age-number .**  
79f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a00: 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 20 74  is not used in t
7a10: 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
7a20: 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
7a30: 3a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 70  : The database p
7a40: 61 67 65 20 69 73 20 74 68 65 20 66 69 72 73 74  age is the first
7a50: 20 70 61 67 65 20 69 6e 20 61 20 6c 69 73 74 20   page in a list 
7a60: 6f 66 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  of .**          
7a70: 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f           overflo
7a80: 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 61 67  w pages. The pag
7a90: 65 20 6e 75 6d 62 65 72 20 69 64 65 6e 74 69 66  e number identif
7aa0: 69 65 73 20 74 68 65 20 70 61 67 65 20 74 68 61  ies the page tha
7ab0: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
7ac0: 20 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 73 20         contains 
7ad0: 74 68 65 20 63 65 6c 6c 20 77 69 74 68 20 61 20  the cell with a 
7ae0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20  pointer to this 
7af0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a  overflow page..*
7b00: 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52  *.** PTRMAP_OVER
7b10: 46 4c 4f 57 32 3a 20 54 68 65 20 64 61 74 61 62  FLOW2: The datab
7b20: 61 73 65 20 70 61 67 65 20 69 73 20 74 68 65 20  ase page is the 
7b30: 73 65 63 6f 6e 64 20 6f 72 20 6c 61 74 65 72 20  second or later 
7b40: 70 61 67 65 20 69 6e 20 61 20 6c 69 73 74 20 6f  page in a list o
7b50: 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  f.**            
7b60: 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20         overflow 
7b70: 70 61 67 65 73 2e 20 54 68 65 20 70 61 67 65 2d  pages. The page-
7b80: 6e 75 6d 62 65 72 20 69 64 65 6e 74 69 66 69 65  number identifie
7b90: 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a 2a  s the previous.*
7ba0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
7bb0: 20 20 20 20 70 61 67 65 20 69 6e 20 74 68 65 20      page in the 
7bc0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6c 69  overflow page li
7bd0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  st..**.** PTRMAP
7be0: 5f 42 54 52 45 45 3a 20 54 68 65 20 64 61 74 61  _BTREE: The data
7bf0: 62 61 73 65 20 70 61 67 65 20 69 73 20 61 20 6e  base page is a n
7c00: 6f 6e 2d 72 6f 6f 74 20 62 74 72 65 65 20 70 61  on-root btree pa
7c10: 67 65 2e 20 54 68 65 20 70 61 67 65 20 6e 75 6d  ge. The page num
7c20: 62 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ber.**          
7c30: 20 20 20 20 20 69 64 65 6e 74 69 66 69 65 73 20       identifies 
7c40: 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
7c50: 69 6e 20 74 68 65 20 62 74 72 65 65 2e 0a 2a 2f  in the btree..*/
7c60: 0a 23 64 65 66 69 6e 65 20 50 54 52 4d 41 50 5f  .#define PTRMAP_
7c70: 52 4f 4f 54 50 41 47 45 20 31 0a 23 64 65 66 69  ROOTPAGE 1.#defi
7c80: 6e 65 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41  ne PTRMAP_FREEPA
7c90: 47 45 20 32 0a 23 64 65 66 69 6e 65 20 50 54 52  GE 2.#define PTR
7ca0: 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 33 0a  MAP_OVERFLOW1 3.
7cb0: 23 64 65 66 69 6e 65 20 50 54 52 4d 41 50 5f 4f  #define PTRMAP_O
7cc0: 56 45 52 46 4c 4f 57 32 20 34 0a 23 64 65 66 69  VERFLOW2 4.#defi
7cd0: 6e 65 20 50 54 52 4d 41 50 5f 42 54 52 45 45 20  ne PTRMAP_BTREE 
7ce0: 35 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  5../*.** Write a
7cf0: 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  n entry into the
7d00: 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a   pointer map..**
7d10: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
7d20: 20 75 70 64 61 74 65 73 20 74 68 65 20 70 6f 69   updates the poi
7d30: 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
7d40: 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27  or page number '
7d50: 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61 74 20  key'.** so that 
7d60: 69 74 20 6d 61 70 73 20 74 6f 20 74 79 70 65 20  it maps to type 
7d70: 27 65 54 79 70 65 27 20 61 6e 64 20 70 61 72 65  'eType' and pare
7d80: 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27  nt page number '
7d90: 70 67 6e 6f 27 2e 0a 2a 2a 20 41 6e 20 65 72 72  pgno'..** An err
7da0: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
7db0: 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67  ned if something
7dc0: 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68   goes wrong, oth
7dd0: 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b  erwise SQLITE_OK
7de0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7df0: 70 74 72 6d 61 70 50 75 74 28 42 74 53 68 61 72  ptrmapPut(BtShar
7e00: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65  ed *pBt, Pgno ke
7e10: 79 2c 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e  y, u8 eType, Pgn
7e20: 6f 20 70 61 72 65 6e 74 29 7b 0a 20 20 75 38 20  o parent){.  u8 
7e30: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 2f 2a 20  *pPtrmap;    /* 
7e40: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
7e50: 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  page */.  Pgno i
7e60: 50 74 72 6d 61 70 3b 20 20 20 2f 2a 20 54 68 65  Ptrmap;   /* The
7e70: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
7e80: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  e number */.  in
7e90: 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 2f 2a  t offset;     /*
7ea0: 20 4f 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74   Offset in point
7eb0: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
7ec0: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54   int rc;..  /* T
7ed0: 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
7ee0: 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6d 75  l page number mu
7ef0: 73 74 20 6e 65 76 65 72 20 62 65 20 75 73 65 64  st never be used
7f00: 20 61 73 20 61 20 70 6f 69 6e 74 65 72 20 6d 61   as a pointer ma
7f10: 70 20 70 61 67 65 20 2a 2f 0a 20 20 61 73 73 65  p page */.  asse
7f20: 72 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53  rt( 0==PTRMAP_IS
7f30: 50 41 47 45 28 70 42 74 2c 20 50 45 4e 44 49 4e  PAGE(pBt, PENDIN
7f40: 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
7f50: 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ) );..  assert( 
7f60: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
7f70: 29 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30 20  );.  if( key==0 
7f80: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
7f90: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
7fa0: 54 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61 70  T;.  }.  iPtrmap
7fb0: 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f   = PTRMAP_PAGENO
7fc0: 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63  (pBt, key);.  rc
7fd0: 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
7fe0: 67 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  get(pBt->pPager,
7ff0: 20 69 50 74 72 6d 61 70 2c 20 28 76 6f 69 64 20   iPtrmap, (void 
8000: 2a 2a 29 26 70 50 74 72 6d 61 70 29 3b 0a 20 20  **)&pPtrmap);.  
8010: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
8020: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
8030: 72 63 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74  rc;.  }.  offset
8040: 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46   = PTRMAP_PTROFF
8050: 53 45 54 28 70 42 74 2c 20 6b 65 79 29 3b 0a 0a  SET(pBt, key);..
8060: 20 20 69 66 28 20 65 54 79 70 65 21 3d 70 50 74    if( eType!=pPt
8070: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20  rmap[offset] || 
8080: 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61  get4byte(&pPtrma
8090: 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70 61  p[offset+1])!=pa
80a0: 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41 43  rent ){.    TRAC
80b0: 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41 54  E(("PTRMAP_UPDAT
80c0: 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e  E: %d->(%d,%d)\n
80d0: 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70  ", key, eType, p
80e0: 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 72 63 20  arent));.    rc 
80f0: 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77  = sqlite3pager_w
8100: 72 69 74 65 28 70 50 74 72 6d 61 70 29 3b 0a 20  rite(pPtrmap);. 
8110: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
8120: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
8130: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20  trmap[offset] = 
8140: 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74  eType;.      put
8150: 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f  4byte(&pPtrmap[o
8160: 66 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74  ffset+1], parent
8170: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
8180: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72  sqlite3pager_unr
8190: 65 66 28 70 50 74 72 6d 61 70 29 3b 0a 20 20 72  ef(pPtrmap);.  r
81a0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
81b0: 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79  ** Read an entry
81c0: 20 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65   from the pointe
81d0: 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  r map..**.** Thi
81e0: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65  s routine retrie
81f0: 76 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ves the pointer 
8200: 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61  map entry for pa
8210: 67 65 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e  ge 'key', writin
8220: 67 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e  g.** the type an
8230: 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75  d parent page nu
8240: 6d 62 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20  mber to *pEType 
8250: 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65  and *pPgno respe
8260: 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65  ctively..** An e
8270: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
8280: 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69  urned if somethi
8290: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f  ng goes wrong, o
82a0: 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f  therwise SQLITE_
82b0: 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
82c0: 74 20 70 74 72 6d 61 70 47 65 74 28 42 74 53 68  t ptrmapGet(BtSh
82d0: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
82e0: 6b 65 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c  key, u8 *pEType,
82f0: 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20   Pgno *pPgno){. 
8300: 20 69 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20   int iPtrmap;   
8310: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
8320: 61 70 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f  ap page index */
8330: 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20  .  u8 *pPtrmap; 
8340: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
8350: 20 6d 61 70 20 70 61 67 65 20 64 61 74 61 20 2a   map page data *
8360: 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20  /.  int offset; 
8370: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
8380: 20 6f 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69   of entry in poi
8390: 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e  nter map */.  in
83a0: 74 20 72 63 3b 0a 0a 20 20 69 50 74 72 6d 61 70  t rc;..  iPtrmap
83b0: 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f   = PTRMAP_PAGENO
83c0: 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63  (pBt, key);.  rc
83d0: 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
83e0: 67 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  get(pBt->pPager,
83f0: 20 69 50 74 72 6d 61 70 2c 20 28 76 6f 69 64 20   iPtrmap, (void 
8400: 2a 2a 29 26 70 50 74 72 6d 61 70 29 3b 0a 20 20  **)&pPtrmap);.  
8410: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
8420: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
8430: 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d  .  offset = PTRM
8440: 41 50 5f 50 54 52 4f 46 46 53 45 54 28 70 42 74  AP_PTROFFSET(pBt
8450: 2c 20 6b 65 79 29 3b 0a 20 20 61 73 73 65 72 74  , key);.  assert
8460: 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20  ( pEType!=0 );. 
8470: 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d   *pEType = pPtrm
8480: 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66  ap[offset];.  if
8490: 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f  ( pPgno ) *pPgno
84a0: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 74   = get4byte(&pPt
84b0: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b  rmap[offset+1]);
84c0: 0a 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72  ..  sqlite3pager
84d0: 5f 75 6e 72 65 66 28 70 50 74 72 6d 61 70 29 3b  _unref(pPtrmap);
84e0: 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31  .  if( *pEType<1
84f0: 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20   || *pEType>5 ) 
8500: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
8510: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65  RRUPT_BKPT;.  re
8520: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
8530: 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
8540: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
8550: 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69  UUM */../*.** Gi
8560: 76 65 6e 20 61 20 62 74 72 65 65 20 70 61 67 65  ven a btree page
8570: 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65   and a cell inde
8580: 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66  x (0 means the f
8590: 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20  irst cell on.** 
85a0: 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e  the page, 1 mean
85b0: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c  s the second cel
85c0: 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29  l, and so forth)
85d0: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
85e0: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c  r.** to the cell
85f0: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   content..**.** 
8600: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72  This routine wor
8610: 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65  ks only for page
8620: 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f  s that do not co
8630: 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63  ntain overflow c
8640: 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ells..*/.static 
8650: 75 38 20 2a 66 69 6e 64 43 65 6c 6c 28 4d 65 6d  u8 *findCell(Mem
8660: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
8670: 20 69 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 64   iCell){.  u8 *d
8680: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
8690: 74 61 3b 0a 20 20 61 73 73 65 72 74 28 20 69 43  ta;.  assert( iC
86a0: 65 6c 6c 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65  ell>=0 );.  asse
86b0: 72 74 28 20 69 43 65 6c 6c 3c 67 65 74 32 62 79  rt( iCell<get2by
86c0: 74 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d 3e  te(&data[pPage->
86d0: 68 64 72 4f 66 66 73 65 74 2b 33 5d 29 20 29 3b  hdrOffset+3]) );
86e0: 0a 20 20 72 65 74 75 72 6e 20 64 61 74 61 20 2b  .  return data +
86f0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
8700: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
8710: 74 2b 32 2a 69 43 65 6c 6c 5d 29 3b 0a 7d 0a 0a  t+2*iCell]);.}..
8720: 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 20 6d 6f 72  /*.** This a mor
8730: 65 20 63 6f 6d 70 6c 65 78 20 76 65 72 73 69 6f  e complex versio
8740: 6e 20 6f 66 20 66 69 6e 64 43 65 6c 6c 28 29 20  n of findCell() 
8750: 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a  that works for.*
8760: 2a 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20  * pages that do 
8770: 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77  contain overflow
8780: 20 63 65 6c 6c 73 2e 20 20 53 65 65 20 69 6e 73   cells.  See ins
8790: 65 72 74 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38  ert.*/.static u8
87a0: 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65   *findOverflowCe
87b0: 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ll(MemPage *pPag
87c0: 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20  e, int iCell){. 
87d0: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
87e0: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
87f0: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
8800: 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 73      int k;.    s
8810: 74 72 75 63 74 20 5f 4f 76 66 6c 43 65 6c 6c 20  truct _OvflCell 
8820: 2a 70 4f 76 66 6c 3b 0a 20 20 20 20 70 4f 76 66  *pOvfl;.    pOvf
8830: 6c 20 3d 20 26 70 50 61 67 65 2d 3e 61 4f 76 66  l = &pPage->aOvf
8840: 6c 5b 69 5d 3b 0a 20 20 20 20 6b 20 3d 20 70 4f  l[i];.    k = pO
8850: 76 66 6c 2d 3e 69 64 78 3b 0a 20 20 20 20 69 66  vfl->idx;.    if
8860: 28 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20 20  ( k<=iCell ){.  
8870: 20 20 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c 6c      if( k==iCell
8880: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
8890: 72 6e 20 70 4f 76 66 6c 2d 3e 70 43 65 6c 6c 3b  rn pOvfl->pCell;
88a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
88b0: 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  Cell--;.    }.  
88c0: 7d 0a 20 20 72 65 74 75 72 6e 20 66 69 6e 64 43  }.  return findC
88d0: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
88e0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73  );.}../*.** Pars
88f0: 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  e a cell content
8900: 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20   block and fill 
8910: 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20  in the CellInfo 
8920: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 72  structure.  Ther
8930: 65 0a 2a 2a 20 61 72 65 20 74 77 6f 20 76 65 72  e.** are two ver
8940: 73 69 6f 6e 73 20 6f 66 20 74 68 69 73 20 66 75  sions of this fu
8950: 6e 63 74 69 6f 6e 2e 20 20 70 61 72 73 65 43 65  nction.  parseCe
8960: 6c 6c 28 29 20 74 61 6b 65 73 20 61 20 63 65 6c  ll() takes a cel
8970: 6c 20 69 6e 64 65 78 0a 2a 2a 20 61 73 20 74 68  l index.** as th
8980: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
8990: 74 20 61 6e 64 20 70 61 72 73 65 43 65 6c 6c 50  t and parseCellP
89a0: 74 72 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69  tr() takes a poi
89b0: 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 62  nter to the.** b
89c0: 6f 64 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ody of the cell 
89d0: 61 73 20 69 74 73 20 73 65 63 6f 6e 64 20 61 72  as its second ar
89e0: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
89f0: 63 20 76 6f 69 64 20 70 61 72 73 65 43 65 6c 6c  c void parseCell
8a00: 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Ptr(.  MemPage *
8a10: 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f  pPage,         /
8a20: 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
8a30: 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  g the cell */.  
8a40: 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  u8 *pCell,      
8a50: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
8a60: 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74  er to the cell t
8a70: 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  ext. */.  CellIn
8a80: 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
8a90: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69    /* Fill in thi
8aa0: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  s structure */.)
8ab0: 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  {.  int n;      
8ac0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
8ad0: 75 6d 62 65 72 20 62 79 74 65 73 20 69 6e 20 63  umber bytes in c
8ae0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 65 61 64  ell content head
8af0: 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79  er */.  u32 nPay
8b00: 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20  load;           
8b10: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
8b20: 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f  es of cell paylo
8b30: 61 64 20 2a 2f 0a 0a 20 20 70 49 6e 66 6f 2d 3e  ad */..  pInfo->
8b40: 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20  pCell = pCell;. 
8b50: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
8b60: 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65  leaf==0 || pPage
8b70: 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 6e  ->leaf==1 );.  n
8b80: 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   = pPage->childP
8b90: 74 72 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  trSize;.  assert
8ba0: 28 20 6e 3d 3d 34 2d 34 2a 70 50 61 67 65 2d 3e  ( n==4-4*pPage->
8bb0: 6c 65 61 66 20 29 3b 0a 20 20 69 66 28 20 70 50  leaf );.  if( pP
8bc0: 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a  age->hasData ){.
8bd0: 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69      n += getVari
8be0: 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20  nt32(&pCell[n], 
8bf0: 26 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 7d 65  &nPayload);.  }e
8c00: 6c 73 65 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61  lse{.    nPayloa
8c10: 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 49 6e  d = 0;.  }.  pIn
8c20: 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 6e 50 61 79  fo->nData = nPay
8c30: 6c 6f 61 64 3b 0a 20 20 69 66 28 20 70 50 61 67  load;.  if( pPag
8c40: 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
8c50: 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28   n += getVarint(
8c60: 26 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34 20  &pCell[n], (u64 
8c70: 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b  *)&pInfo->nKey);
8c80: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 33  .  }else{.    u3
8c90: 32 20 78 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65  2 x;.    n += ge
8ca0: 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c  tVarint32(&pCell
8cb0: 5b 6e 5d 2c 20 26 78 29 3b 0a 20 20 20 20 70 49  [n], &x);.    pI
8cc0: 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 78 3b 0a 20  nfo->nKey = x;. 
8cd0: 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 78     nPayload += x
8ce0: 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e  ;.  }.  pInfo->n
8cf0: 48 65 61 64 65 72 20 3d 20 6e 3b 0a 20 20 69 66  Header = n;.  if
8d00: 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67  ( nPayload<=pPag
8d10: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
8d20: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
8d30: 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20  e (easy) common 
8d40: 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65  case where the e
8d50: 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69  ntire payload fi
8d60: 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  ts.    ** on the
8d70: 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f   local page.  No
8d80: 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71   overflow is req
8d90: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
8da0: 20 20 69 6e 74 20 6e 53 69 7a 65 3b 20 20 20 20    int nSize;    
8db0: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73        /* Total s
8dc0: 69 7a 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74  ize of cell cont
8dd0: 65 6e 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ent in bytes */.
8de0: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
8df0: 6c 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  l = nPayload;.  
8e00: 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c    pInfo->iOverfl
8e10: 6f 77 20 3d 20 30 3b 0a 20 20 20 20 6e 53 69 7a  ow = 0;.    nSiz
8e20: 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 6e  e = nPayload + n
8e30: 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c  ;.    if( nSize<
8e40: 34 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65  4 ){.      nSize
8e50: 20 3d 20 34 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 4;        /* 
8e60: 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a  Minimum cell siz
8e70: 65 20 69 73 20 34 20 2a 2f 0a 20 20 20 20 7d 0a  e is 4 */.    }.
8e80: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65      pInfo->nSize
8e90: 20 3d 20 6e 53 69 7a 65 3b 0a 20 20 7d 65 6c 73   = nSize;.  }els
8ea0: 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  e{.    /* If the
8eb0: 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f   payload will no
8ec0: 74 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79  t fit completely
8ed0: 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
8ee0: 67 65 2c 20 77 65 20 68 61 76 65 0a 20 20 20 20  ge, we have.    
8ef0: 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f 77  ** to decide how
8f00: 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20 6c   much to store l
8f10: 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d  ocally and how m
8f20: 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74  uch to spill ont
8f30: 6f 0a 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f  o.    ** overflo
8f40: 77 20 70 61 67 65 73 2e 20 20 54 68 65 20 73 74  w pages.  The st
8f50: 72 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e  rategy is to min
8f60: 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74  imize the amount
8f70: 20 6f 66 20 75 6e 75 73 65 64 0a 20 20 20 20 2a   of unused.    *
8f80: 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72 66  * space on overf
8f90: 6c 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65 20  low pages while 
8fa0: 6b 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f 75  keeping the amou
8fb0: 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72  nt of local stor
8fc0: 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 62 65  age.    ** in be
8fd0: 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61  tween minLocal a
8fe0: 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 20  nd maxLocal..   
8ff0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 61 72 6e 69   **.    ** Warni
9000: 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67 20 74 68  ng:  changing th
9010: 65 20 77 61 79 20 6f 76 65 72 66 6c 6f 77 20 70  e way overflow p
9020: 61 79 6c 6f 61 64 20 69 73 20 64 69 73 74 72 69  ayload is distri
9030: 62 75 74 65 64 20 69 6e 20 61 6e 79 0a 20 20 20  buted in any.   
9040: 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65 73   ** way will res
9050: 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70  ult in an incomp
9060: 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d  atible file form
9070: 61 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  at..    */.    i
9080: 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a  nt minLocal;  /*
9090: 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20   Minimum amount 
90a0: 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20  of payload held 
90b0: 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69  locally */.    i
90c0: 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a  nt maxLocal;  /*
90d0: 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20   Maximum amount 
90e0: 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20  of payload held 
90f0: 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69  locally */.    i
9100: 6e 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a  nt surplus;   /*
9110: 20 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61   Overflow payloa
9120: 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  d available for 
9130: 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f  local storage */
9140: 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d  ..    minLocal =
9150: 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
9160: 3b 0a 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20 3d  ;.    maxLocal =
9170: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
9180: 3b 0a 20 20 20 20 73 75 72 70 6c 75 73 20 3d 20  ;.    surplus = 
9190: 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50 61 79  minLocal + (nPay
91a0: 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29  load - minLocal)
91b0: 25 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  %(pPage->pBt->us
91c0: 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20  ableSize - 4);. 
91d0: 20 20 20 69 66 28 20 73 75 72 70 6c 75 73 20 3c     if( surplus <
91e0: 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  = maxLocal ){.  
91f0: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
9200: 6c 20 3d 20 73 75 72 70 6c 75 73 3b 0a 20 20 20  l = surplus;.   
9210: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49   }else{.      pI
9220: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 6d 69  nfo->nLocal = mi
9230: 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20  nLocal;.    }.  
9240: 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c    pInfo->iOverfl
9250: 6f 77 20 3d 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  ow = pInfo->nLoc
9260: 61 6c 20 2b 20 6e 3b 0a 20 20 20 20 70 49 6e 66  al + n;.    pInf
9270: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70 49 6e 66 6f  o->nSize = pInfo
9280: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 2b 20 34 3b  ->iOverflow + 4;
9290: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
92a0: 69 64 20 70 61 72 73 65 43 65 6c 6c 28 0a 20 20  id parseCell(.  
92b0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
92c0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
92d0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
92e0: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  ell */.  int iCe
92f0: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
9300: 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64   /* The cell ind
9310: 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20  ex.  First cell 
9320: 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  is 0 */.  CellIn
9330: 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
9340: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69    /* Fill in thi
9350: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  s structure */.)
9360: 7b 0a 20 20 70 61 72 73 65 43 65 6c 6c 50 74 72  {.  parseCellPtr
9370: 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c  (pPage, findCell
9380: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 2c 20  (pPage, iCell), 
9390: 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pInfo);.}../*.**
93a0: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74   Compute the tot
93b0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  al number of byt
93c0: 65 73 20 74 68 61 74 20 61 20 43 65 6c 6c 20 6e  es that a Cell n
93d0: 65 65 64 73 20 69 6e 20 74 68 65 20 63 65 6c 6c  eeds in the cell
93e0: 0a 2a 2a 20 64 61 74 61 20 61 72 65 61 20 6f 66  .** data area of
93f0: 20 74 68 65 20 62 74 72 65 65 2d 70 61 67 65 2e   the btree-page.
9400: 20 20 54 68 65 20 72 65 74 75 72 6e 20 6e 75 6d    The return num
9410: 62 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68 65  ber includes the
9420: 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65   cell.** data he
9430: 61 64 65 72 20 61 6e 64 20 74 68 65 20 6c 6f 63  ader and the loc
9440: 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75 74 20  al payload, but 
9450: 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77  not any overflow
9460: 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20   page or.** the 
9470: 73 70 61 63 65 20 75 73 65 64 20 62 79 20 74 68  space used by th
9480: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a  e cell pointer..
9490: 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
94a0: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63 65 6c  G.static int cel
94b0: 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70  lSize(MemPage *p
94c0: 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29  Page, int iCell)
94d0: 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  {.  CellInfo inf
94e0: 6f 3b 0a 20 20 70 61 72 73 65 43 65 6c 6c 28 70  o;.  parseCell(p
94f0: 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 26 69 6e  Page, iCell, &in
9500: 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e  fo);.  return in
9510: 66 6f 2e 6e 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64  fo.nSize;.}.#end
9520: 69 66 0a 73 74 61 74 69 63 20 69 6e 74 20 63 65  if.static int ce
9530: 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50 61 67  llSizePtr(MemPag
9540: 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43  e *pPage, u8 *pC
9550: 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f  ell){.  CellInfo
9560: 20 69 6e 66 6f 3b 0a 20 20 70 61 72 73 65 43 65   info;.  parseCe
9570: 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
9580: 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 72 65  ll, &info);.  re
9590: 74 75 72 6e 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b  turn info.nSize;
95a0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
95b0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
95c0: 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  UM./*.** If the 
95d0: 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74  cell pCell, part
95e0: 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63   of page pPage c
95f0: 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
9600: 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66  r.** to an overf
9610: 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74  low page, insert
9620: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
9630: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a  he pointer-map.*
9640: 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  * for the overfl
9650: 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ow page..*/.stat
9660: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74  ic int ptrmapPut
9670: 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20  OvflPtr(MemPage 
9680: 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c  *pPage, u8 *pCel
9690: 6c 29 7b 0a 20 20 69 66 28 20 70 43 65 6c 6c 20  l){.  if( pCell 
96a0: 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20  ){.    CellInfo 
96b0: 69 6e 66 6f 3b 0a 20 20 20 20 70 61 72 73 65 43  info;.    parseC
96c0: 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
96d0: 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  ell, &info);.   
96e0: 20 69 66 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61   if( (info.nData
96f0: 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f  +(pPage->intKey?
9700: 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3e 69 6e  0:info.nKey))>in
9710: 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  fo.nLocal ){.   
9720: 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67     Pgno ovfl = g
9730: 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
9740: 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b  nfo.iOverflow]);
9750: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 74  .      return pt
9760: 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70  rmapPut(pPage->p
9770: 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50  Bt, ovfl, PTRMAP
9780: 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67  _OVERFLOW1, pPag
9790: 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a  e->pgno);.    }.
97a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
97b0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20  ITE_OK;.}./*.** 
97c0: 49 66 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68  If the cell with
97d0: 20 69 6e 64 65 78 20 69 43 65 6c 6c 20 6f 6e 20   index iCell on 
97e0: 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74 61  page pPage conta
97f0: 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  ins a pointer.**
9800: 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
9810: 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20  page, insert an 
9820: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70  entry into the p
9830: 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f  ointer-map.** fo
9840: 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
9850: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  age..*/.static i
9860: 6e 74 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c  nt ptrmapPutOvfl
9870: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
9880: 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 75   int iCell){.  u
9890: 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 70 43 65 6c  8 *pCell;.  pCel
98a0: 6c 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77  l = findOverflow
98b0: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
98c0: 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 74 72  l);.  return ptr
98d0: 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50  mapPutOvflPtr(pP
98e0: 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 7d 0a 23  age, pCell);.}.#
98f0: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 6f  endif.../*.** Do
9900: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
9910: 20 6f 6e 20 61 20 70 61 67 65 2e 20 20 54 68 72   on a page.  Thr
9920: 6f 77 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20  ow an exception 
9930: 69 66 20 61 6e 79 74 68 69 6e 67 20 69 73 0a 2a  if anything is.*
9940: 2a 20 6e 6f 74 20 72 69 67 68 74 2e 0a 2a 2a 0a  * not right..**.
9950: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
9960: 69 73 20 75 73 65 64 20 66 6f 72 20 69 6e 74 65  is used for inte
9970: 72 6e 61 6c 20 65 72 72 6f 72 20 63 68 65 63 6b  rnal error check
9980: 69 6e 67 20 6f 6e 6c 79 2e 20 20 49 74 20 69 73  ing only.  It is
9990: 20 6f 6d 69 74 74 65 64 0a 2a 2a 20 66 72 6f 6d   omitted.** from
99a0: 20 6d 6f 73 74 20 62 75 69 6c 64 73 2e 0a 2a 2f   most builds..*/
99b0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 42 54 52  .#if defined(BTR
99c0: 45 45 5f 44 45 42 55 47 29 20 26 26 20 21 64 65  EE_DEBUG) && !de
99d0: 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26  fined(NDEBUG) &&
99e0: 20 30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 5f   0.static void _
99f0: 70 61 67 65 49 6e 74 65 67 72 69 74 79 28 4d 65  pageIntegrity(Me
9a00: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
9a10: 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
9a20: 0a 20 20 75 38 20 2a 64 61 74 61 3b 0a 20 20 69  .  u8 *data;.  i
9a30: 6e 74 20 69 2c 20 6a 2c 20 69 64 78 2c 20 63 2c  nt i, j, idx, c,
9a40: 20 70 63 2c 20 68 64 72 2c 20 6e 46 72 65 65 3b   pc, hdr, nFree;
9a50: 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65  .  int cellOffse
9a60: 74 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20  t;.  int nCell, 
9a70: 63 65 6c 6c 4c 69 6d 69 74 3b 0a 20 20 75 38 20  cellLimit;.  u8 
9a80: 2a 75 73 65 64 3b 0a 0a 20 20 75 73 65 64 20 3d  *used;..  used =
9a90: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
9aa0: 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61  ( pPage->pBt->pa
9ab0: 67 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20  geSize );.  if( 
9ac0: 75 73 65 64 3d 3d 30 20 29 20 72 65 74 75 72 6e  used==0 ) return
9ad0: 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ;.  usableSize =
9ae0: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
9af0: 62 6c 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72  bleSize;.  asser
9b00: 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3d  t( pPage->aData=
9b10: 3d 26 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  =&((unsigned cha
9b20: 72 2a 29 70 50 61 67 65 29 5b 2d 70 50 61 67 65  r*)pPage)[-pPage
9b30: 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  ->pBt->pageSize]
9b40: 20 29 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67   );.  hdr = pPag
9b50: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
9b60: 61 73 73 65 72 74 28 20 68 64 72 3d 3d 28 70 50  assert( hdr==(pP
9b70: 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31  age->pgno==1 ? 1
9b80: 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73  00 : 0) );.  ass
9b90: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ert( pPage->pgno
9ba0: 3d 3d 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70  ==sqlite3pager_p
9bb0: 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d  agenumber(pPage-
9bc0: 3e 61 44 61 74 61 29 20 29 3b 0a 20 20 63 20 3d  >aData) );.  c =
9bd0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 68 64   pPage->aData[hd
9be0: 72 5d 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  r];.  if( pPage-
9bf0: 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 61  >isInit ){.    a
9c00: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
9c10: 61 66 20 3d 3d 20 28 28 63 20 26 20 50 54 46 5f  af == ((c & PTF_
9c20: 4c 45 41 46 29 21 3d 30 29 20 29 3b 0a 20 20 20  LEAF)!=0) );.   
9c30: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
9c40: 7a 65 72 6f 44 61 74 61 20 3d 3d 20 28 28 63 20  zeroData == ((c 
9c50: 26 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 29 21  & PTF_ZERODATA)!
9c60: 3d 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  =0) );.    asser
9c70: 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61  t( pPage->leafDa
9c80: 74 61 20 3d 3d 20 28 28 63 20 26 20 50 54 46 5f  ta == ((c & PTF_
9c90: 4c 45 41 46 44 41 54 41 29 21 3d 30 29 20 29 3b  LEAFDATA)!=0) );
9ca0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
9cb0: 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 3d 20 28 28  ge->intKey == ((
9cc0: 63 20 26 20 28 50 54 46 5f 49 4e 54 4b 45 59 7c  c & (PTF_INTKEY|
9cd0: 50 54 46 5f 4c 45 41 46 44 41 54 41 29 29 21 3d  PTF_LEAFDATA))!=
9ce0: 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  0) );.    assert
9cf0: 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
9d00: 20 3d 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20   ==.            
9d10: 20 21 28 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61   !(pPage->zeroDa
9d20: 74 61 20 7c 7c 20 28 21 70 50 61 67 65 2d 3e 6c  ta || (!pPage->l
9d30: 65 61 66 20 26 26 20 70 50 61 67 65 2d 3e 6c 65  eaf && pPage->le
9d40: 61 66 44 61 74 61 29 29 20 29 3b 0a 20 20 20 20  afData)) );.    
9d50: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63  assert( pPage->c
9d60: 65 6c 6c 4f 66 66 73 65 74 3d 3d 70 50 61 67 65  ellOffset==pPage
9d70: 2d 3e 68 64 72 4f 66 66 73 65 74 2b 31 32 2d 34  ->hdrOffset+12-4
9d80: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a  *pPage->leaf );.
9d90: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
9da0: 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62  e->nCell = get2b
9db0: 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
9dc0: 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 7d  a[hdr+3]) );.  }
9dd0: 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
9de0: 3e 61 44 61 74 61 3b 0a 20 20 6d 65 6d 73 65 74  >aData;.  memset
9df0: 28 75 73 65 64 2c 20 30 2c 20 75 73 61 62 6c 65  (used, 0, usable
9e00: 53 69 7a 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Size);.  for(i=0
9e10: 3b 20 69 3c 68 64 72 2b 31 30 2d 70 50 61 67 65  ; i<hdr+10-pPage
9e20: 2d 3e 6c 65 61 66 2a 34 3b 20 69 2b 2b 29 20 75  ->leaf*4; i++) u
9e30: 73 65 64 5b 69 5d 20 3d 20 31 3b 0a 20 20 6e 46  sed[i] = 1;.  nF
9e40: 72 65 65 20 3d 20 30 3b 0a 20 20 70 63 20 3d 20  ree = 0;.  pc = 
9e50: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
9e60: 64 72 2b 31 5d 29 3b 0a 20 20 77 68 69 6c 65 28  dr+1]);.  while(
9e70: 20 70 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 73   pc ){.    int s
9e80: 69 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ize;.    assert(
9e90: 20 70 63 3e 30 20 26 26 20 70 63 3c 75 73 61 62   pc>0 && pc<usab
9ea0: 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20  leSize-4 );.    
9eb0: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
9ec0: 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20  &data[pc+2]);.  
9ed0: 20 20 61 73 73 65 72 74 28 20 70 63 2b 73 69 7a    assert( pc+siz
9ee0: 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  e<=usableSize );
9ef0: 0a 20 20 20 20 6e 46 72 65 65 20 2b 3d 20 73 69  .    nFree += si
9f00: 7a 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 63  ze;.    for(i=pc
9f10: 3b 20 69 3c 70 63 2b 73 69 7a 65 3b 20 69 2b 2b  ; i<pc+size; i++
9f20: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
9f30: 20 75 73 65 64 5b 69 5d 3d 3d 30 20 29 3b 0a 20   used[i]==0 );. 
9f40: 20 20 20 20 20 75 73 65 64 5b 69 5d 20 3d 20 31       used[i] = 1
9f50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 63 20 3d  ;.    }.    pc =
9f60: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
9f70: 70 63 5d 29 3b 0a 20 20 7d 0a 20 20 69 64 78 20  pc]);.  }.  idx 
9f80: 3d 20 30 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 67  = 0;.  nCell = g
9f90: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
9fa0: 72 2b 33 5d 29 3b 0a 20 20 63 65 6c 6c 4c 69 6d  r+3]);.  cellLim
9fb0: 69 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  it = get2byte(&d
9fc0: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 61  ata[hdr+5]);.  a
9fd0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
9fe0: 49 6e 69 74 3d 3d 30 20 0a 20 20 20 20 20 20 20  Init==0 .       
9ff0: 20 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 46 72 65    || pPage->nFre
a000: 65 3d 3d 6e 46 72 65 65 2b 64 61 74 61 5b 68 64  e==nFree+data[hd
a010: 72 2b 37 5d 2b 63 65 6c 6c 4c 69 6d 69 74 2d 28  r+7]+cellLimit-(
a020: 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65  cellOffset+2*nCe
a030: 6c 6c 29 20 29 3b 0a 20 20 63 65 6c 6c 4f 66 66  ll) );.  cellOff
a040: 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  set = pPage->cel
a050: 6c 4f 66 66 73 65 74 3b 0a 20 20 66 6f 72 28 69  lOffset;.  for(i
a060: 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
a070: 29 7b 0a 20 20 20 20 69 6e 74 20 73 69 7a 65 3b  ){.    int size;
a080: 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
a090: 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66  te(&data[cellOff
a0a0: 73 65 74 2b 32 2a 69 5d 29 3b 0a 20 20 20 20 61  set+2*i]);.    a
a0b0: 73 73 65 72 74 28 20 70 63 3e 30 20 26 26 20 70  ssert( pc>0 && p
a0c0: 63 3c 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29  c<usableSize-4 )
a0d0: 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 63 65 6c  ;.    size = cel
a0e0: 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 26 64 61  lSize(pPage, &da
a0f0: 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 61 73 73  ta[pc]);.    ass
a100: 65 72 74 28 20 70 63 2b 73 69 7a 65 3c 3d 75 73  ert( pc+size<=us
a110: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  ableSize );.    
a120: 66 6f 72 28 6a 3d 70 63 3b 20 6a 3c 70 63 2b 73  for(j=pc; j<pc+s
a130: 69 7a 65 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  ize; j++){.     
a140: 20 61 73 73 65 72 74 28 20 75 73 65 64 5b 6a 5d   assert( used[j]
a150: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 75 73 65  ==0 );.      use
a160: 64 5b 6a 5d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  d[j] = 1;.    }.
a170: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 63 65 6c 6c    }.  for(i=cell
a180: 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 3b 20  Offset+2*nCell; 
a190: 69 3c 63 65 6c 6c 69 6d 69 74 3b 20 69 2b 2b 29  i<cellimit; i++)
a1a0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 75 73  {.    assert( us
a1b0: 65 64 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20 20 20  ed[i]==0 );.    
a1c0: 75 73 65 64 5b 69 5d 20 3d 20 31 3b 0a 20 20 7d  used[i] = 1;.  }
a1d0: 0a 20 20 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20  .  nFree = 0;.  
a1e0: 66 6f 72 28 69 3d 30 3b 20 69 3c 75 73 61 62 6c  for(i=0; i<usabl
a1f0: 65 53 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  eSize; i++){.   
a200: 20 61 73 73 65 72 74 28 20 75 73 65 64 5b 69 5d   assert( used[i]
a210: 3c 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 75  <=1 );.    if( u
a220: 73 65 64 5b 69 5d 3d 3d 30 20 29 20 6e 46 72 65  sed[i]==0 ) nFre
a230: 65 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  e++;.  }.  asser
a240: 74 28 20 6e 46 72 65 65 3d 3d 64 61 74 61 5b 68  t( nFree==data[h
a250: 64 72 2b 37 5d 20 29 3b 0a 20 20 73 71 6c 69 74  dr+7] );.  sqlit
a260: 65 46 72 65 65 28 75 73 65 64 29 3b 0a 7d 0a 23  eFree(used);.}.#
a270: 64 65 66 69 6e 65 20 70 61 67 65 49 6e 74 65 67  define pageInteg
a280: 72 69 74 79 28 58 29 20 5f 70 61 67 65 49 6e 74  rity(X) _pageInt
a290: 65 67 72 69 74 79 28 58 29 0a 23 65 6c 73 65 0a  egrity(X).#else.
a2a0: 23 20 64 65 66 69 6e 65 20 70 61 67 65 49 6e 74  # define pageInt
a2b0: 65 67 72 69 74 79 28 58 29 0a 23 65 6e 64 69 66  egrity(X).#endif
a2c0: 0a 0a 2f 2a 20 41 20 62 75 6e 63 68 20 6f 66 20  ../* A bunch of 
a2d0: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
a2e0: 6e 74 73 20 74 6f 20 63 68 65 63 6b 20 74 68 65  nts to check the
a2f0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
a300: 74 65 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20  te variables.** 
a310: 6f 66 20 68 61 6e 64 6c 65 20 70 20 28 74 79 70  of handle p (typ
a320: 65 20 42 74 72 65 65 2a 29 20 61 72 65 20 69 6e  e Btree*) are in
a330: 74 65 72 6e 61 6c 6c 79 20 63 6f 6e 73 69 73 74  ternally consist
a340: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
a350: 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
a360: 29 20 5c 0a 20 20 61 73 73 65 72 74 28 20 70 2d  ) \.  assert( p-
a370: 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f  >inTrans!=TRANS_
a380: 4e 4f 4e 45 20 7c 7c 20 70 2d 3e 70 42 74 2d 3e  NONE || p->pBt->
a390: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3c 70 2d 3e  nTransaction<p->
a3a0: 70 42 74 2d 3e 6e 52 65 66 20 29 3b 20 5c 0a 20  pBt->nRef ); \. 
a3b0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74 2d   assert( p->pBt-
a3c0: 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3c 3d 70  >nTransaction<=p
a3d0: 2d 3e 70 42 74 2d 3e 6e 52 65 66 20 29 3b 20 5c  ->pBt->nRef ); \
a3e0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 42  .  assert( p->pB
a3f0: 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
a400: 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 7c 7c 20  !=TRANS_NONE || 
a410: 70 2d 3e 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  p->pBt->nTransac
a420: 74 69 6f 6e 3d 3d 30 20 29 3b 20 5c 0a 20 20 61  tion==0 ); \.  a
a430: 73 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 69  ssert( p->pBt->i
a440: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 3d 70 2d  nTransaction>=p-
a450: 3e 69 6e 54 72 61 6e 73 20 29 3b 20 0a 0a 2f 2a  >inTrans ); ../*
a460: 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20 74  .** Defragment t
a470: 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20 20  he page given.  
a480: 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f  All Cells are mo
a490: 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e  ved to the.** en
a4a0: 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 6e  d of the page an
a4b0: 64 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65  d all free space
a4c0: 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e   is collected in
a4d0: 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72  to one.** big Fr
a4e0: 65 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75 72  eeBlk that occur
a4f0: 73 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  s in between the
a500: 20 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c 6c   header and cell
a510: 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72 61  .** pointer arra
a520: 79 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63  y and the cell c
a530: 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a  ontent area..*/.
a540: 73 74 61 74 69 63 20 69 6e 74 20 64 65 66 72 61  static int defra
a550: 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67  gmentPage(MemPag
a560: 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74  e *pPage){.  int
a570: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
a580: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
a590: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
a5a0: 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   pc;            
a5b0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
a5c0: 73 73 20 6f 66 20 61 20 69 2d 74 68 20 63 65 6c  ss of a i-th cel
a5d0: 6c 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b  l */.  int addr;
a5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5f0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66    /* Offset of f
a600: 69 72 73 74 20 62 79 74 65 20 61 66 74 65 72 20  irst byte after 
a610: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
a620: 61 79 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b  ay */.  int hdr;
a630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a640: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
a650: 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20  the page header 
a660: 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20  */.  int size;  
a670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a680: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c  /* Size of a cel
a690: 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  l */.  int usabl
a6a0: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
a6b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
a6c0: 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61  sable bytes on a
a6d0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63   page */.  int c
a6e0: 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20  ellOffset;      
a6f0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
a700: 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  to the cell poin
a710: 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69  ter array */.  i
a720: 6e 74 20 62 72 6b 3b 20 20 20 20 20 20 20 20 20  nt brk;         
a730: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
a740: 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
a750: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
a760: 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20    int nCell;    
a770: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a780: 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
a790: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
a7a0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
a7b0: 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54  data;       /* T
a7c0: 68 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  he page data */.
a7d0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
a7e0: 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20  *temp;       /* 
a7f0: 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65  Temp area for ce
a800: 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20  ll content */.. 
a810: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a820: 70 61 67 65 72 5f 69 73 77 72 69 74 65 61 62 6c  pager_iswriteabl
a830: 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 20  e(pPage->aData) 
a840: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
a850: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
a860: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
a870: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c  Bt->usableSize <
a880: 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  = SQLITE_MAX_PAG
a890: 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73 73 65  E_SIZE );.  asse
a8a0: 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
a8b0: 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 74 65 6d  flow==0 );.  tem
a8c0: 70 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  p = sqliteMalloc
a8d0: 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61  ( pPage->pBt->pa
a8e0: 67 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20  geSize );.  if( 
a8f0: 74 65 6d 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  temp==0 ) return
a900: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
a910: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
a920: 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50  Data;.  hdr = pP
a930: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
a940: 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70    cellOffset = p
a950: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
a960: 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67  ;.  nCell = pPag
a970: 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65  e->nCell;.  asse
a980: 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62  rt( nCell==get2b
a990: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
a9a0: 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a  ) );.  usableSiz
a9b0: 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  e = pPage->pBt->
a9c0: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 62 72  usableSize;.  br
a9d0: 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  k = get2byte(&da
a9e0: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65  ta[hdr+5]);.  me
a9f0: 6d 63 70 79 28 26 74 65 6d 70 5b 62 72 6b 5d 2c  mcpy(&temp[brk],
aa00: 20 26 64 61 74 61 5b 62 72 6b 5d 2c 20 75 73 61   &data[brk], usa
aa10: 62 6c 65 53 69 7a 65 20 2d 20 62 72 6b 29 3b 0a  bleSize - brk);.
aa20: 20 20 62 72 6b 20 3d 20 75 73 61 62 6c 65 53 69    brk = usableSi
aa30: 7a 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ze;.  for(i=0; i
aa40: 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
aa50: 20 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20    u8 *pAddr;    
aa60: 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c   /* The i-th cel
aa70: 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20  l pointer */.   
aa80: 20 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63   pAddr = &data[c
aa90: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d  ellOffset + i*2]
aaa0: 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62  ;.    pc = get2b
aab0: 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20  yte(pAddr);.    
aac0: 61 73 73 65 72 74 28 20 70 63 3c 70 50 61 67 65  assert( pc<pPage
aad0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
aae0: 65 20 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20  e );.    size = 
aaf0: 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
ab00: 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29 3b 0a 20  e, &temp[pc]);. 
ab10: 20 20 20 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a     brk -= size;.
ab20: 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
ab30: 5b 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63 5d  [brk], &temp[pc]
ab40: 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 70 75 74  , size);.    put
ab50: 32 62 79 74 65 28 70 41 64 64 72 2c 20 62 72 6b  2byte(pAddr, brk
ab60: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
ab70: 20 62 72 6b 3e 3d 63 65 6c 6c 4f 66 66 73 65 74   brk>=cellOffset
ab80: 2b 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20 70 75  +2*nCell );.  pu
ab90: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
aba0: 2b 35 5d 2c 20 62 72 6b 29 3b 0a 20 20 64 61 74  +5], brk);.  dat
abb0: 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20  a[hdr+1] = 0;.  
abc0: 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b  data[hdr+2] = 0;
abd0: 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d  .  data[hdr+7] =
abe0: 20 30 3b 0a 20 20 61 64 64 72 20 3d 20 63 65 6c   0;.  addr = cel
abf0: 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 3b  lOffset+2*nCell;
ac00: 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
ac10: 61 64 64 72 5d 2c 20 30 2c 20 62 72 6b 2d 61 64  addr], 0, brk-ad
ac20: 64 72 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  dr);.  sqliteFre
ac30: 65 28 74 65 6d 70 29 3b 0a 20 20 72 65 74 75 72  e(temp);.  retur
ac40: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
ac50: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e  /*.** Allocate n
ac60: 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 73 70  Byte bytes of sp
ac70: 61 63 65 20 6f 6e 20 61 20 70 61 67 65 2e 0a 2a  ace on a page..*
ac80: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
ac90: 69 6e 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65  index into pPage
aca0: 2d 3e 61 44 61 74 61 5b 5d 20 6f 66 20 74 68 65  ->aData[] of the
acb0: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 0a 2a   first byte of.*
acc0: 2a 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61  * the new alloca
acd0: 74 69 6f 6e 2e 20 4f 72 20 72 65 74 75 72 6e 20  tion. Or return 
ace0: 30 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  0 if there is no
acf0: 74 20 65 6e 6f 75 67 68 20 66 72 65 65 0a 2a 2a  t enough free.**
ad00: 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61   space on the pa
ad10: 67 65 20 74 6f 20 73 61 74 69 73 66 79 20 74 68  ge to satisfy th
ad20: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72 65 71  e allocation req
ad30: 75 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  uest..**.** If t
ad40: 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73  he page contains
ad50: 20 6e 42 79 74 65 73 20 6f 66 20 66 72 65 65 20   nBytes of free 
ad60: 73 70 61 63 65 20 62 75 74 20 64 6f 65 73 20 6e  space but does n
ad70: 6f 74 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 42  ot contain.** nB
ad80: 79 74 65 73 20 6f 66 20 63 6f 6e 74 69 67 75 6f  ytes of contiguo
ad90: 75 73 20 66 72 65 65 20 73 70 61 63 65 2c 20 74  us free space, t
ada0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
adb0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 2a   automatically.*
adc0: 2a 20 63 61 6c 6c 73 20 64 65 66 72 61 67 65 6d  * calls defragem
add0: 65 6e 74 50 61 67 65 28 29 20 74 6f 20 63 6f 6e  entPage() to con
ade0: 73 6f 6c 69 64 61 74 65 20 61 6c 6c 20 66 72 65  solidate all fre
adf0: 65 20 73 70 61 63 65 20 62 65 66 6f 72 65 20 0a  e space before .
ae00: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68  ** allocating th
ae10: 65 20 6e 65 77 20 63 68 75 6e 6b 2e 0a 2a 2f 0a  e new chunk..*/.
ae20: 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
ae30: 61 74 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65  ateSpace(MemPage
ae40: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 42 79   *pPage, int nBy
ae50: 74 65 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c  te){.  int addr,
ae60: 20 70 63 2c 20 68 64 72 3b 0a 20 20 69 6e 74 20   pc, hdr;.  int 
ae70: 73 69 7a 65 3b 0a 20 20 69 6e 74 20 6e 46 72 61  size;.  int nFra
ae80: 67 3b 0a 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20  g;.  int top;.  
ae90: 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 69 6e 74  int nCell;.  int
aea0: 20 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 75   cellOffset;.  u
aeb0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
aec0: 74 61 3b 0a 20 20 0a 20 20 64 61 74 61 20 3d 20  ta;.  .  data = 
aed0: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
aee0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 70  assert( sqlite3p
aef0: 61 67 65 72 5f 69 73 77 72 69 74 65 61 62 6c 65  ager_iswriteable
af00: 28 64 61 74 61 29 20 29 3b 0a 20 20 61 73 73 65  (data) );.  asse
af10: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29  rt( pPage->pBt )
af20: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3c 34 20  ;.  if( nByte<4 
af30: 29 20 6e 42 79 74 65 20 3d 20 34 3b 0a 20 20 69  ) nByte = 4;.  i
af40: 66 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c  f( pPage->nFree<
af50: 6e 42 79 74 65 20 7c 7c 20 70 50 61 67 65 2d 3e  nByte || pPage->
af60: 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 20 72 65  nOverflow>0 ) re
af70: 74 75 72 6e 20 30 3b 0a 20 20 70 50 61 67 65 2d  turn 0;.  pPage-
af80: 3e 6e 46 72 65 65 20 2d 3d 20 6e 42 79 74 65 3b  >nFree -= nByte;
af90: 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
afa0: 68 64 72 4f 66 66 73 65 74 3b 0a 0a 20 20 6e 46  hdrOffset;..  nF
afb0: 72 61 67 20 3d 20 64 61 74 61 5b 68 64 72 2b 37  rag = data[hdr+7
afc0: 5d 3b 0a 20 20 69 66 28 20 6e 46 72 61 67 3c 36  ];.  if( nFrag<6
afd0: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72  0 ){.    /* Sear
afe0: 63 68 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  ch the freelist 
aff0: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 73 6c  looking for a sl
b000: 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  ot big enough to
b010: 20 73 61 74 69 73 66 79 20 74 68 65 0a 20 20 20   satisfy the.   
b020: 20 2a 2a 20 73 70 61 63 65 20 72 65 71 75 65 73   ** space reques
b030: 74 2e 20 2a 2f 0a 20 20 20 20 61 64 64 72 20 3d  t. */.    addr =
b040: 20 68 64 72 2b 31 3b 0a 20 20 20 20 77 68 69 6c   hdr+1;.    whil
b050: 65 28 20 28 70 63 20 3d 20 67 65 74 32 62 79 74  e( (pc = get2byt
b060: 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3e  e(&data[addr]))>
b070: 30 20 29 7b 0a 20 20 20 20 20 20 73 69 7a 65 20  0 ){.      size 
b080: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
b090: 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69  [pc+2]);.      i
b0a0: 66 28 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29  f( size>=nByte )
b0b0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 69  {.        if( si
b0c0: 7a 65 3c 6e 42 79 74 65 2b 34 20 29 7b 0a 20 20  ze<nByte+4 ){.  
b0d0: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
b0e0: 64 61 74 61 5b 61 64 64 72 5d 2c 20 26 64 61 74  data[addr], &dat
b0f0: 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20  a[pc], 2);.     
b100: 20 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d       data[hdr+7]
b110: 20 3d 20 6e 46 72 61 67 20 2b 20 73 69 7a 65 20   = nFrag + size 
b120: 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20  - nByte;.       
b130: 20 20 20 72 65 74 75 72 6e 20 70 63 3b 0a 20 20     return pc;.  
b140: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
b150: 20 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28         put2byte(
b160: 26 64 61 74 61 5b 70 63 2b 32 5d 2c 20 73 69 7a  &data[pc+2], siz
b170: 65 2d 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20  e-nByte);.      
b180: 20 20 20 20 72 65 74 75 72 6e 20 70 63 20 2b 20      return pc + 
b190: 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20  size - nByte;.  
b1a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
b1b0: 20 20 20 20 20 20 61 64 64 72 20 3d 20 70 63 3b        addr = pc;
b1c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
b1d0: 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   Allocate memory
b1e0: 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20 69 6e   from the gap in
b1f0: 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 65 6c   between the cel
b200: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 0a  l pointer array.
b210: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63 65 6c    ** and the cel
b220: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a  l content area..
b230: 20 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74    */.  top = get
b240: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
b250: 35 5d 29 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 67  5]);.  nCell = g
b260: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
b270: 72 2b 33 5d 29 3b 0a 20 20 63 65 6c 6c 4f 66 66  r+3]);.  cellOff
b280: 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  set = pPage->cel
b290: 6c 4f 66 66 73 65 74 3b 0a 20 20 69 66 28 20 6e  lOffset;.  if( n
b2a0: 46 72 61 67 3e 3d 36 30 20 7c 7c 20 63 65 6c 6c  Frag>=60 || cell
b2b0: 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c  Offset + 2*nCell
b2c0: 20 3e 20 74 6f 70 20 2d 20 6e 42 79 74 65 20 29   > top - nByte )
b2d0: 7b 0a 20 20 20 20 69 66 28 20 64 65 66 72 61 67  {.    if( defrag
b2e0: 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 29 20  mentPage(pPage) 
b2f0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
b300: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
b310: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
b320: 7d 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65  }.  top -= nByte
b330: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 65 6c 6c  ;.  assert( cell
b340: 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c  Offset + 2*nCell
b350: 20 3c 3d 20 74 6f 70 20 29 3b 0a 20 20 70 75 74   <= top );.  put
b360: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
b370: 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 72 65 74 75  5], top);.  retu
b380: 72 6e 20 74 6f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn top;.}../*.**
b390: 20 52 65 74 75 72 6e 20 61 20 73 65 63 74 69 6f   Return a sectio
b3a0: 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d 3e  n of the pPage->
b3b0: 61 44 61 74 61 20 74 6f 20 74 68 65 20 66 72 65  aData to the fre
b3c0: 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69  elist..** The fi
b3d0: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
b3e0: 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20 69  new free block i
b3f0: 73 20 70 50 61 67 65 2d 3e 61 44 69 73 6b 5b 73  s pPage->aDisk[s
b400: 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65  tart].** and the
b410: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f   size of the blo
b420: 63 6b 20 69 73 20 22 73 69 7a 65 22 20 62 79 74  ck is "size" byt
b430: 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 6f  es..**.** Most o
b440: 66 20 74 68 65 20 65 66 66 6f 72 74 20 68 65 72  f the effort her
b450: 65 20 69 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e  e is involved in
b460: 20 63 6f 61 6c 65 73 69 6e 67 20 61 64 6a 61 63   coalesing adjac
b470: 65 6e 74 0a 2a 2a 20 66 72 65 65 20 62 6c 6f 63  ent.** free bloc
b480: 6b 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65  ks into a single
b490: 20 62 69 67 20 66 72 65 65 20 62 6c 6f 63 6b 2e   big free block.
b4a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b4b0: 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61 67  freeSpace(MemPag
b4c0: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 73 74  e *pPage, int st
b4d0: 61 72 74 2c 20 69 6e 74 20 73 69 7a 65 29 7b 0a  art, int size){.
b4e0: 20 20 69 6e 74 20 61 64 64 72 2c 20 70 62 65 67    int addr, pbeg
b4f0: 69 6e 2c 20 68 64 72 3b 0a 20 20 75 6e 73 69 67  in, hdr;.  unsig
b500: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d  ned char *data =
b510: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 0a   pPage->aData;..
b520: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
b530: 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
b540: 65 72 74 28 20 73 71 6c 69 74 65 33 70 61 67 65  ert( sqlite3page
b550: 72 5f 69 73 77 72 69 74 65 61 62 6c 65 28 64 61  r_iswriteable(da
b560: 74 61 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ta) );.  assert(
b570: 20 73 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68   start>=pPage->h
b580: 64 72 4f 66 66 73 65 74 2b 36 2b 28 70 50 61 67  drOffset+6+(pPag
b590: 65 2d 3e 6c 65 61 66 3f 30 3a 34 29 20 29 3b 0a  e->leaf?0:4) );.
b5a0: 20 20 61 73 73 65 72 74 28 20 28 73 74 61 72 74    assert( (start
b5b0: 20 2b 20 73 69 7a 65 29 3c 3d 70 50 61 67 65 2d   + size)<=pPage-
b5c0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
b5d0: 20 29 3b 0a 20 20 69 66 28 20 73 69 7a 65 3c 34   );.  if( size<4
b5e0: 20 29 20 73 69 7a 65 20 3d 20 34 3b 0a 0a 23 69   ) size = 4;..#i
b5f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55  fdef SQLITE_SECU
b600: 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20 4f  RE_DELETE.  /* O
b610: 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64  verwrite deleted
b620: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74   information wit
b630: 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74 68 65  h zeros when the
b640: 20 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 0a   SECURE_DELETE .
b650: 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65    ** option is e
b660: 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c  nabled at compil
b670: 65 2d 74 69 6d 65 20 2a 2f 0a 20 20 6d 65 6d 73  e-time */.  mems
b680: 65 74 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c  et(&data[start],
b690: 20 30 2c 20 73 69 7a 65 29 3b 0a 23 65 6e 64 69   0, size);.#endi
b6a0: 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20  f..  /* Add the 
b6b0: 73 70 61 63 65 20 62 61 63 6b 20 69 6e 74 6f 20  space back into 
b6c0: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
b6d0: 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 2a 2f  of freeblocks */
b6e0: 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
b6f0: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 61 64 64  hdrOffset;.  add
b700: 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 77  r = hdr + 1;.  w
b710: 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20  hile( (pbegin = 
b720: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61  get2byte(&data[a
b730: 64 64 72 5d 29 29 3c 73 74 61 72 74 20 26 26 20  ddr]))<start && 
b740: 70 62 65 67 69 6e 3e 30 20 29 7b 0a 20 20 20 20  pbegin>0 ){.    
b750: 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d  assert( pbegin<=
b760: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
b770: 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20  leSize-4 );.    
b780: 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61  assert( pbegin>a
b790: 64 64 72 20 29 3b 0a 20 20 20 20 61 64 64 72 20  ddr );.    addr 
b7a0: 3d 20 70 62 65 67 69 6e 3b 0a 20 20 7d 0a 20 20  = pbegin;.  }.  
b7b0: 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d  assert( pbegin<=
b7c0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
b7d0: 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 61 73  leSize-4 );.  as
b7e0: 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64  sert( pbegin>add
b7f0: 72 20 7c 7c 20 70 62 65 67 69 6e 3d 3d 30 20 29  r || pbegin==0 )
b800: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
b810: 74 61 5b 61 64 64 72 5d 2c 20 73 74 61 72 74 29  ta[addr], start)
b820: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
b830: 74 61 5b 73 74 61 72 74 5d 2c 20 70 62 65 67 69  ta[start], pbegi
b840: 6e 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  n);.  put2byte(&
b850: 64 61 74 61 5b 73 74 61 72 74 2b 32 5d 2c 20 73  data[start+2], s
b860: 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ize);.  pPage->n
b870: 46 72 65 65 20 2b 3d 20 73 69 7a 65 3b 0a 0a 20  Free += size;.. 
b880: 20 2f 2a 20 43 6f 61 6c 65 73 63 65 20 61 64 6a   /* Coalesce adj
b890: 61 63 65 6e 74 20 66 72 65 65 20 62 6c 6f 63 6b  acent free block
b8a0: 73 20 2a 2f 0a 20 20 61 64 64 72 20 3d 20 70 50  s */.  addr = pP
b8b0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2b  age->hdrOffset +
b8c0: 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62   1;.  while( (pb
b8d0: 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28  egin = get2byte(
b8e0: 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 20  &data[addr]))>0 
b8f0: 29 7b 0a 20 20 20 20 69 6e 74 20 70 6e 65 78 74  ){.    int pnext
b900: 2c 20 70 73 69 7a 65 3b 0a 20 20 20 20 61 73 73  , psize;.    ass
b910: 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72  ert( pbegin>addr
b920: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
b930: 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70  pbegin<=pPage->p
b940: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  Bt->usableSize-4
b950: 20 29 3b 0a 20 20 20 20 70 6e 65 78 74 20 3d 20   );.    pnext = 
b960: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
b970: 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70 73 69  begin]);.    psi
b980: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ze = get2byte(&d
b990: 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a  ata[pbegin+2]);.
b9a0: 20 20 20 20 69 66 28 20 70 62 65 67 69 6e 20 2b      if( pbegin +
b9b0: 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20 70 6e   psize + 3 >= pn
b9c0: 65 78 74 20 26 26 20 70 6e 65 78 74 3e 30 20 29  ext && pnext>0 )
b9d0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 72 61 67  {.      int frag
b9e0: 20 3d 20 70 6e 65 78 74 20 2d 20 28 70 62 65 67   = pnext - (pbeg
b9f0: 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20 20 20  in+psize);.     
ba00: 20 61 73 73 65 72 74 28 20 66 72 61 67 3c 3d 64   assert( frag<=d
ba10: 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
ba20: 66 73 65 74 2b 37 5d 20 29 3b 0a 20 20 20 20 20  fset+7] );.     
ba30: 20 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72   data[pPage->hdr
ba40: 4f 66 66 73 65 74 2b 37 5d 20 2d 3d 20 66 72 61  Offset+7] -= fra
ba50: 67 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74  g;.      put2byt
ba60: 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c  e(&data[pbegin],
ba70: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
ba80: 70 6e 65 78 74 5d 29 29 3b 0a 20 20 20 20 20 20  pnext]));.      
ba90: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  put2byte(&data[p
baa0: 62 65 67 69 6e 2b 32 5d 2c 20 70 6e 65 78 74 2b  begin+2], pnext+
bab0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
bac0: 6e 65 78 74 2b 32 5d 29 2d 70 62 65 67 69 6e 29  next+2])-pbegin)
bad0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
bae0: 20 20 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e     addr = pbegin
baf0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
bb00: 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  * If the cell co
bb10: 6e 74 65 6e 74 20 61 72 65 61 20 62 65 67 69 6e  ntent area begin
bb20: 73 20 77 69 74 68 20 61 20 66 72 65 65 62 6c 6f  s with a freeblo
bb30: 63 6b 2c 20 72 65 6d 6f 76 65 20 69 74 2e 20 2a  ck, remove it. *
bb40: 2f 0a 20 20 69 66 28 20 64 61 74 61 5b 68 64 72  /.  if( data[hdr
bb50: 2b 31 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 35 5d  +1]==data[hdr+5]
bb60: 20 26 26 20 64 61 74 61 5b 68 64 72 2b 32 5d 3d   && data[hdr+2]=
bb70: 3d 64 61 74 61 5b 68 64 72 2b 36 5d 20 29 7b 0a  =data[hdr+6] ){.
bb80: 20 20 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 20      int top;.   
bb90: 20 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79   pbegin = get2by
bba0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29  te(&data[hdr+1])
bbb0: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
bbc0: 74 61 5b 68 64 72 2b 31 5d 2c 20 26 64 61 74 61  ta[hdr+1], &data
bbd0: 5b 70 62 65 67 69 6e 5d 2c 20 32 29 3b 0a 20 20  [pbegin], 2);.  
bbe0: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
bbf0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
bc00: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
bc10: 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 20 2b  ta[hdr+5], top +
bc20: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
bc30: 70 62 65 67 69 6e 2b 32 5d 29 29 3b 0a 20 20 7d  pbegin+2]));.  }
bc40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65  .}../*.** Decode
bc50: 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20   the flags byte 
bc60: 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20  (the first byte 
bc70: 6f 66 20 74 68 65 20 68 65 61 64 65 72 29 20 66  of the header) f
bc80: 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64  or a page.** and
bc90: 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c   initialize fiel
bca0: 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67  ds of the MemPag
bcb0: 65 20 73 74 72 75 63 74 75 72 65 20 61 63 63 6f  e structure acco
bcc0: 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 73 74 61 74  rdingly..*/.stat
bcd0: 69 63 20 76 6f 69 64 20 64 65 63 6f 64 65 46 6c  ic void decodeFl
bce0: 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ags(MemPage *pPa
bcf0: 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65  ge, int flagByte
bd00: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
bd10: 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70  Bt;     /* A cop
bd20: 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20  y of pPage->pBt 
bd30: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
bd40: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d  age->hdrOffset==
bd50: 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20  (pPage->pgno==1 
bd60: 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20  ? 100 : 0) );.  
bd70: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20  pPage->intKey = 
bd80: 28 66 6c 61 67 42 79 74 65 20 26 20 28 50 54 46  (flagByte & (PTF
bd90: 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46  _INTKEY|PTF_LEAF
bda0: 44 41 54 41 29 29 21 3d 30 3b 0a 20 20 70 50 61  DATA))!=0;.  pPa
bdb0: 67 65 2d 3e 7a 65 72 6f 44 61 74 61 20 3d 20 28  ge->zeroData = (
bdc0: 66 6c 61 67 42 79 74 65 20 26 20 50 54 46 5f 5a  flagByte & PTF_Z
bdd0: 45 52 4f 44 41 54 41 29 21 3d 30 3b 0a 20 20 70  ERODATA)!=0;.  p
bde0: 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 66 6c  Page->leaf = (fl
bdf0: 61 67 42 79 74 65 20 26 20 50 54 46 5f 4c 45 41  agByte & PTF_LEA
be00: 46 29 21 3d 30 3b 0a 20 20 70 50 61 67 65 2d 3e  F)!=0;.  pPage->
be10: 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34  childPtrSize = 4
be20: 2a 28 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30  *(pPage->leaf==0
be30: 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65  );.  pBt = pPage
be40: 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 66 6c 61  ->pBt;.  if( fla
be50: 67 42 79 74 65 20 26 20 50 54 46 5f 4c 45 41 46  gByte & PTF_LEAF
be60: 44 41 54 41 20 29 7b 0a 20 20 20 20 70 50 61 67  DATA ){.    pPag
be70: 65 2d 3e 6c 65 61 66 44 61 74 61 20 3d 20 31 3b  e->leafData = 1;
be80: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c  .    pPage->maxL
be90: 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c  ocal = pBt->maxL
bea0: 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  eaf;.    pPage->
beb0: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  minLocal = pBt->
bec0: 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65  minLeaf;.  }else
bed0: 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6c 65 61  {.    pPage->lea
bee0: 66 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70  fData = 0;.    p
bef0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d  Page->maxLocal =
bf00: 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a   pBt->maxLocal;.
bf10: 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f      pPage->minLo
bf20: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f  cal = pBt->minLo
bf30: 63 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  cal;.  }.  pPage
bf40: 2d 3e 68 61 73 44 61 74 61 20 3d 20 21 28 70 50  ->hasData = !(pP
bf50: 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61 20 7c 7c  age->zeroData ||
bf60: 20 28 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 26   (!pPage->leaf &
bf70: 26 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74  & pPage->leafDat
bf80: 61 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  a));.}../*.** In
bf90: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61 75 78  itialize the aux
bfa0: 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69  iliary informati
bfb0: 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20 62 6c  on for a disk bl
bfc0: 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ock..**.** The p
bfd0: 50 61 72 65 6e 74 20 70 61 72 61 6d 65 74 65 72  Parent parameter
bfe0: 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e 74   must be a point
bff0: 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67  er to the MemPag
c000: 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 74 68  e which.** is th
c010: 65 20 70 61 72 65 6e 74 20 6f 66 20 74 68 65 20  e parent of the 
c020: 70 61 67 65 20 62 65 69 6e 67 20 69 6e 69 74 69  page being initi
c030: 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 72 6f 6f  alized.  The roo
c040: 74 20 6f 66 20 61 0a 2a 2a 20 42 54 72 65 65 20  t of a.** BTree 
c050: 68 61 73 20 6e 6f 20 70 61 72 65 6e 74 20 61 6e  has no parent an
c060: 64 20 73 6f 20 66 6f 72 20 74 68 61 74 20 70 61  d so for that pa
c070: 67 65 2c 20 70 50 61 72 65 6e 74 3d 3d 4e 55 4c  ge, pParent==NUL
c080: 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  L..**.** Return 
c090: 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
c0a0: 63 65 73 73 2e 20 20 49 66 20 77 65 20 73 65 65  cess.  If we see
c0b0: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 64   that the page d
c0c0: 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61  oes.** not conta
c0d0: 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  in a well-formed
c0e0: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20   database page, 
c0f0: 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20  then return .** 
c100: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20  SQLITE_CORRUPT. 
c110: 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65 74   Note that a ret
c120: 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b  urn of SQLITE_OK
c130: 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61   does not.** gua
c140: 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20  rantee that the 
c150: 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72  page is well-for
c160: 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68  med.  It only sh
c170: 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20 66  ows that.** we f
c180: 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20  ailed to detect 
c190: 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  any corruption..
c1a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
c1b0: 69 74 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67  itPage(.  MemPag
c1c0: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
c1d0: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20   /* The page to 
c1e0: 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a  be initialized *
c1f0: 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
c200: 72 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 54 68  rent       /* Th
c210: 65 20 70 61 72 65 6e 74 2e 20 20 4d 69 67 68 74  e parent.  Might
c220: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   be NULL */.){. 
c230: 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20   int pc;        
c240: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
c250: 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69  f a freeblock wi
c260: 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74  thin pPage->aDat
c270: 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72  a[] */.  int hdr
c280: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  ;           /* O
c290: 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69  ffset to beginni
c2a0: 6e 67 20 6f 66 20 70 61 67 65 20 68 65 61 64 65  ng of page heade
c2b0: 72 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  r */.  u8 *data;
c2c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75            /* Equ
c2d0: 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61  al to pPage->aDa
c2e0: 74 61 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  ta */.  BtShared
c2f0: 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a   *pBt;        /*
c300: 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20   The main btree 
c310: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69  structure */.  i
c320: 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20  nt usableSize;  
c330: 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75    /* Amount of u
c340: 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65  sable space on e
c350: 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ach page */.  in
c360: 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20  t cellOffset;   
c370: 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20   /* Offset from 
c380: 73 74 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f  start of page to
c390: 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e   first cell poin
c3a0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72  ter */.  int nFr
c3b0: 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ee;         /* N
c3c0: 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20  umber of unused 
c3d0: 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67  bytes on the pag
c3e0: 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20  e */.  int top; 
c3f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
c400: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63  st byte of the c
c410: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
c420: 20 2a 2f 0a 0a 20 20 70 42 74 20 3d 20 70 50 61   */..  pBt = pPa
c430: 67 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72  ge->pBt;.  asser
c440: 74 28 20 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  t( pBt!=0 );.  a
c450: 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 3d 3d  ssert( pParent==
c460: 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 70 42  0 || pParent->pB
c470: 74 3d 3d 70 42 74 20 29 3b 0a 20 20 61 73 73 65  t==pBt );.  asse
c480: 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d  rt( pPage->pgno=
c490: 3d 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61  =sqlite3pager_pa
c4a0: 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e  genumber(pPage->
c4b0: 61 44 61 74 61 29 20 29 3b 0a 20 20 61 73 73 65  aData) );.  asse
c4c0: 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
c4d0: 20 3d 3d 20 26 28 28 75 6e 73 69 67 6e 65 64 20   == &((unsigned 
c4e0: 63 68 61 72 2a 29 70 50 61 67 65 29 5b 2d 70 42  char*)pPage)[-pB
c4f0: 74 2d 3e 70 61 67 65 53 69 7a 65 5d 20 29 3b 0a  t->pageSize] );.
c500: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61    if( pPage->pPa
c510: 72 65 6e 74 21 3d 70 50 61 72 65 6e 74 20 26 26  rent!=pParent &&
c520: 20 28 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74   (pPage->pParent
c530: 21 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 69 73  !=0 || pPage->is
c540: 49 6e 69 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20  Init) ){.    /* 
c550: 54 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  The parent page 
c560: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 63 68 61  should never cha
c570: 6e 67 65 20 75 6e 6c 65 73 73 20 74 68 65 20 66  nge unless the f
c580: 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74 20 2a  ile is corrupt *
c590: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
c5a0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
c5b0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
c5c0: 65 2d 3e 69 73 49 6e 69 74 20 29 20 72 65 74 75  e->isInit ) retu
c5d0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
c5e0: 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65  if( pPage->pPare
c5f0: 6e 74 3d 3d 30 20 26 26 20 70 50 61 72 65 6e 74  nt==0 && pParent
c600: 21 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  !=0 ){.    pPage
c610: 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 50 61 72  ->pParent = pPar
c620: 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ent;.    sqlite3
c630: 70 61 67 65 72 5f 72 65 66 28 70 50 61 72 65 6e  pager_ref(pParen
c640: 74 2d 3e 61 44 61 74 61 29 3b 0a 20 20 7d 0a 20  t->aData);.  }. 
c650: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
c660: 72 4f 66 66 73 65 74 3b 0a 20 20 64 61 74 61 20  rOffset;.  data 
c670: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
c680: 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50    decodeFlags(pP
c690: 61 67 65 2c 20 64 61 74 61 5b 68 64 72 5d 29 3b  age, data[hdr]);
c6a0: 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  .  pPage->nOverf
c6b0: 6c 6f 77 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  low = 0;.  pPage
c6c0: 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 30 3b 0a  ->idxShift = 0;.
c6d0: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
c6e0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
c6f0: 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66    pPage->cellOff
c700: 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  set = cellOffset
c710: 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a   = hdr + 12 - 4*
c720: 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 74  pPage->leaf;.  t
c730: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
c740: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 70  ata[hdr+5]);.  p
c750: 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65  Page->nCell = ge
c760: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
c770: 2b 33 5d 29 3b 0a 20 20 69 66 28 20 70 50 61 67  +3]);.  if( pPag
c780: 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c  e->nCell>MX_CELL
c790: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20  (pBt) ){.    /* 
c7a0: 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f  To many cells fo
c7b0: 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e  r a single page.
c7c0: 20 20 54 68 65 20 70 61 67 65 20 6d 75 73 74 20    The page must 
c7d0: 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20  be corrupt */.  
c7e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c7f0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
c800: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  }.  if( pPage->n
c810: 43 65 6c 6c 3d 3d 30 20 26 26 20 70 50 61 72 65  Cell==0 && pPare
c820: 6e 74 21 3d 30 20 26 26 20 70 50 61 72 65 6e 74  nt!=0 && pParent
c830: 2d 3e 70 67 6e 6f 21 3d 31 20 29 7b 0a 20 20 20  ->pgno!=1 ){.   
c840: 20 2f 2a 20 41 6c 6c 20 70 61 67 65 73 20 6d 75   /* All pages mu
c850: 73 74 20 68 61 76 65 20 61 74 20 6c 65 61 73 74  st have at least
c860: 20 6f 6e 65 20 63 65 6c 6c 2c 20 65 78 63 65 70   one cell, excep
c870: 74 20 66 6f 72 20 72 6f 6f 74 20 70 61 67 65 73  t for root pages
c880: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
c890: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
c8a0: 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  PT;.  }..  /* Co
c8b0: 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20  mpute the total 
c8c0: 66 72 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68  free space on th
c8d0: 65 20 70 61 67 65 20 2a 2f 0a 20 20 70 63 20 3d  e page */.  pc =
c8e0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
c8f0: 68 64 72 2b 31 5d 29 3b 0a 20 20 6e 46 72 65 65  hdr+1]);.  nFree
c900: 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b   = data[hdr+7] +
c910: 20 74 6f 70 20 2d 20 28 63 65 6c 6c 4f 66 66 73   top - (cellOffs
c920: 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
c930: 65 6c 6c 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  ell);.  while( p
c940: 63 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  c>0 ){.    int n
c950: 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20 69  ext, size;.    i
c960: 66 28 20 70 63 3e 75 73 61 62 6c 65 53 69 7a 65  f( pc>usableSize
c970: 2d 34 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46  -4 ){.      /* F
c980: 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 6f 66 66  ree block is off
c990: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20   the page */.   
c9a0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c9b0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
c9c0: 20 20 20 20 7d 0a 20 20 20 20 6e 65 78 74 20 3d      }.    next =
c9d0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
c9e0: 70 63 5d 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d  pc]);.    size =
c9f0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
ca00: 70 63 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20  pc+2]);.    if( 
ca10: 6e 65 78 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d  next>0 && next<=
ca20: 70 63 2b 73 69 7a 65 2b 33 20 29 7b 0a 20 20 20  pc+size+3 ){.   
ca30: 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b     /* Free block
ca40: 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61 63 63  s must be in acc
ca50: 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a  ending order */.
ca60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
ca70: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
ca80: 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 6e 46 72  ; .    }.    nFr
ca90: 65 65 20 2b 3d 20 73 69 7a 65 3b 0a 20 20 20 20  ee += size;.    
caa0: 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 7d 0a 20  pc = next;.  }. 
cab0: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
cac0: 6e 46 72 65 65 3b 0a 20 20 69 66 28 20 6e 46 72  nFree;.  if( nFr
cad0: 65 65 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  ee>=usableSize )
cae0: 7b 0a 20 20 20 20 2f 2a 20 46 72 65 65 20 73 70  {.    /* Free sp
caf0: 61 63 65 20 63 61 6e 6e 6f 74 20 65 78 63 65 65  ace cannot excee
cb00: 64 20 74 6f 74 61 6c 20 70 61 67 65 20 73 69 7a  d total page siz
cb10: 65 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  e */.    return 
cb20: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
cb30: 4b 50 54 3b 20 0a 20 20 7d 0a 0a 20 20 70 50 61  KPT; .  }..  pPa
cb40: 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a  ge->isInit = 1;.
cb50: 20 20 70 61 67 65 49 6e 74 65 67 72 69 74 79 28    pageIntegrity(
cb60: 70 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e  pPage);.  return
cb70: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
cb80: 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72 61  *.** Set up a ra
cb90: 77 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 69  w page so that i
cba0: 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64  t looks like a d
cbb0: 61 74 61 62 61 73 65 20 70 61 67 65 20 68 6f 6c  atabase page hol
cbc0: 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69  ding.** no entri
cbd0: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
cbe0: 69 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50  id zeroPage(MemP
cbf0: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
cc00: 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e  flags){.  unsign
cc10: 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20  ed char *data = 
cc20: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
cc30: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
cc40: 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e  pPage->pBt;.  in
cc50: 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68  t hdr = pPage->h
cc60: 64 72 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20  drOffset;.  int 
cc70: 66 69 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74  first;..  assert
cc80: 28 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70  ( sqlite3pager_p
cc90: 61 67 65 6e 75 6d 62 65 72 28 64 61 74 61 29 3d  agenumber(data)=
cca0: 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a  =pPage->pgno );.
ccb0: 20 20 61 73 73 65 72 74 28 20 26 64 61 74 61 5b    assert( &data[
ccc0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 20 3d  pBt->pageSize] =
ccd0: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
cce0: 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  *)pPage );.  ass
ccf0: 65 72 74 28 20 73 71 6c 69 74 65 33 70 61 67 65  ert( sqlite3page
cd00: 72 5f 69 73 77 72 69 74 65 61 62 6c 65 28 64 61  r_iswriteable(da
cd10: 74 61 29 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28  ta) );.  memset(
cd20: 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70  &data[hdr], 0, p
cd30: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
cd40: 20 68 64 72 29 3b 0a 20 20 64 61 74 61 5b 68 64   hdr);.  data[hd
cd50: 72 5d 20 3d 20 66 6c 61 67 73 3b 0a 20 20 66 69  r] = flags;.  fi
cd60: 72 73 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20  rst = hdr + 8 + 
cd70: 34 2a 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45  4*((flags&PTF_LE
cd80: 41 46 29 3d 3d 30 29 3b 0a 20 20 6d 65 6d 73 65  AF)==0);.  memse
cd90: 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20  t(&data[hdr+1], 
cda0: 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64  0, 4);.  data[hd
cdb0: 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32  r+7] = 0;.  put2
cdc0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
cdd0: 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ], pBt->usableSi
cde0: 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46  ze);.  pPage->nF
cdf0: 72 65 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ree = pBt->usabl
ce00: 65 53 69 7a 65 20 2d 20 66 69 72 73 74 3b 0a 20  eSize - first;. 
ce10: 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61   decodeFlags(pPa
ce20: 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50  ge, flags);.  pP
ce30: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d  age->hdrOffset =
ce40: 20 68 64 72 3b 0a 20 20 70 50 61 67 65 2d 3e 63   hdr;.  pPage->c
ce50: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73  ellOffset = firs
ce60: 74 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65  t;.  pPage->nOve
ce70: 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 70 50 61  rflow = 0;.  pPa
ce80: 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 30  ge->idxShift = 0
ce90: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ;.  pPage->nCell
cea0: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69   = 0;.  pPage->i
ceb0: 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 70 61 67  sInit = 1;.  pag
cec0: 65 49 6e 74 65 67 72 69 74 79 28 70 50 61 67 65  eIntegrity(pPage
ced0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  );.}../*.** Get 
cee0: 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
cef0: 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69  pager.  Initiali
cf00: 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70  ze the MemPage.p
cf10: 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67  Bt and.** MemPag
cf20: 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73  e.aData elements
cf30: 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73   if needed..*/.s
cf40: 74 61 74 69 63 20 69 6e 74 20 67 65 74 50 61 67  tatic int getPag
cf50: 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  e(BtShared *pBt,
cf60: 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 4d 65 6d 50   Pgno pgno, MemP
cf70: 61 67 65 20 2a 2a 70 70 50 61 67 65 29 7b 0a 20  age **ppPage){. 
cf80: 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67   int rc;.  unsig
cf90: 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 3b  ned char *aData;
cfa0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
cfb0: 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  e;.  rc = sqlite
cfc0: 33 70 61 67 65 72 5f 67 65 74 28 70 42 74 2d 3e  3pager_get(pBt->
cfd0: 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 76  pPager, pgno, (v
cfe0: 6f 69 64 2a 2a 29 26 61 44 61 74 61 29 3b 0a 20  oid**)&aData);. 
cff0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
d000: 20 72 63 3b 0a 20 20 70 50 61 67 65 20 3d 20 28   rc;.  pPage = (
d010: 4d 65 6d 50 61 67 65 2a 29 26 61 44 61 74 61 5b  MemPage*)&aData[
d020: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a  pBt->pageSize];.
d030: 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d    pPage->aData =
d040: 20 61 44 61 74 61 3b 0a 20 20 70 50 61 67 65 2d   aData;.  pPage-
d050: 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 50  >pBt = pBt;.  pP
d060: 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f  age->pgno = pgno
d070: 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  ;.  pPage->hdrOf
d080: 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 70 67  fset = pPage->pg
d090: 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b  no==1 ? 100 : 0;
d0a0: 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61  .  *ppPage = pPa
d0b0: 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ge;.  return SQL
d0c0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
d0d0: 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d   Get a page from
d0e0: 20 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69   the pager and i
d0f0: 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54  nitialize it.  T
d100: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
d110: 73 20 6a 75 73 74 20 61 20 63 6f 6e 76 65 6e 69  s just a conveni
d120: 65 6e 63 65 20 77 72 61 70 70 65 72 20 61 72 6f  ence wrapper aro
d130: 75 6e 64 20 73 65 70 61 72 61 74 65 20 63 61 6c  und separate cal
d140: 6c 73 20 74 6f 0a 2a 2a 20 67 65 74 50 61 67 65  ls to.** getPage
d150: 28 29 20 61 6e 64 20 69 6e 69 74 50 61 67 65 28  () and initPage(
d160: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
d170: 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
d180: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
d190: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
d1a0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
d1b0: 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
d1c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
d1d0: 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
d1e0: 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50  to get */.  MemP
d1f0: 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
d200: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61   /* Write the pa
d210: 67 65 20 70 6f 69 6e 74 65 72 20 68 65 72 65 20  ge pointer here 
d220: 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  */.  MemPage *pP
d230: 61 72 65 6e 74 20 20 20 20 20 2f 2a 20 50 61 72  arent     /* Par
d240: 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20  ent of the page 
d250: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
d260: 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b    if( pgno==0 ){
d270: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
d280: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
d290: 20 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67 65 74   .  }.  rc = get
d2a0: 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20  Page(pBt, pgno, 
d2b0: 70 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  ppPage);.  if( r
d2c0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
d2d0: 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69  (*ppPage)->isIni
d2e0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  t==0 ){.    rc =
d2f0: 20 69 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67   initPage(*ppPag
d300: 65 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d  e, pParent);.  }
d310: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
d320: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
d330: 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20   MemPage.  This 
d340: 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
d350: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70   once for each p
d360: 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20  rior.** call to 
d370: 67 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  getPage..*/.stat
d380: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
d390: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
d3a0: 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  ge){.  if( pPage
d3b0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
d3c0: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
d3d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
d3e0: 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20 61 73  e->pBt );.    as
d3f0: 73 65 72 74 28 20 26 70 50 61 67 65 2d 3e 61 44  sert( &pPage->aD
d400: 61 74 61 5b 70 50 61 67 65 2d 3e 70 42 74 2d 3e  ata[pPage->pBt->
d410: 70 61 67 65 53 69 7a 65 5d 3d 3d 28 75 6e 73 69  pageSize]==(unsi
d420: 67 6e 65 64 20 63 68 61 72 2a 29 70 50 61 67 65  gned char*)pPage
d430: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 70   );.    sqlite3p
d440: 61 67 65 72 5f 75 6e 72 65 66 28 70 50 61 67 65  ager_unref(pPage
d450: 2d 3e 61 44 61 74 61 29 3b 0a 20 20 7d 0a 7d 0a  ->aData);.  }.}.
d460: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
d470: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
d480: 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  en the reference
d490: 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67   count for a pag
d4a0: 65 0a 2a 2a 20 72 65 61 63 68 65 73 20 7a 65 72  e.** reaches zer
d4b0: 6f 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 75  o.  We need to u
d4c0: 6e 72 65 66 20 74 68 65 20 70 50 61 72 65 6e 74  nref the pParent
d4d0: 20 70 6f 69 6e 74 65 72 20 77 68 65 6e 20 74 68   pointer when th
d4e0: 61 74 0a 2a 2a 20 68 61 70 70 65 6e 73 2e 0a 2a  at.** happens..*
d4f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
d500: 67 65 44 65 73 74 72 75 63 74 6f 72 28 76 6f 69  geDestructor(voi
d510: 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 70 61  d *pData, int pa
d520: 67 65 53 69 7a 65 29 7b 0a 20 20 4d 65 6d 50 61  geSize){.  MemPa
d530: 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73  ge *pPage;.  ass
d540: 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26  ert( (pageSize &
d550: 20 37 29 3d 3d 30 20 29 3b 0a 20 20 70 50 61 67   7)==0 );.  pPag
d560: 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 26 28  e = (MemPage*)&(
d570: 28 63 68 61 72 2a 29 70 44 61 74 61 29 5b 70 61  (char*)pData)[pa
d580: 67 65 53 69 7a 65 5d 3b 0a 20 20 69 66 28 20 70  geSize];.  if( p
d590: 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 29 7b  Page->pParent ){
d5a0: 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
d5b0: 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70  arent = pPage->p
d5c0: 50 61 72 65 6e 74 3b 0a 20 20 20 20 70 50 61 67  Parent;.    pPag
d5d0: 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 30 3b 0a  e->pParent = 0;.
d5e0: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
d5f0: 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20  pParent);.  }.  
d600: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
d610: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69  0;.}../*.** Duri
d620: 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77  ng a rollback, w
d630: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 72 65  hen the pager re
d640: 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f  loads informatio
d650: 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  n into the cache
d660: 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20  .** so that the 
d670: 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65  cache is restore
d680: 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
d690: 6c 20 73 74 61 74 65 20 61 74 20 74 68 65 20 73  l state at the s
d6a0: 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74  tart of.** the t
d6b0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20  ransaction, for 
d6c0: 65 61 63 68 20 70 61 67 65 20 72 65 73 74 6f 72  each page restor
d6d0: 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ed this routine 
d6e0: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
d6f0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65   This routine ne
d700: 65 64 73 20 74 6f 20 72 65 73 65 74 20 74 68 65  eds to reset the
d710: 20 65 78 74 72 61 20 64 61 74 61 20 73 65 63 74   extra data sect
d720: 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ion at the end o
d730: 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f  f the.** page to
d740: 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20   agree with the 
d750: 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a  restored data..*
d760: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
d770: 67 65 52 65 69 6e 69 74 28 76 6f 69 64 20 2a 70  geReinit(void *p
d780: 44 61 74 61 2c 20 69 6e 74 20 70 61 67 65 53 69  Data, int pageSi
d790: 7a 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ze){.  MemPage *
d7a0: 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  pPage;.  assert(
d7b0: 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
d7c0: 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20  =0 );.  pPage = 
d7d0: 28 4d 65 6d 50 61 67 65 2a 29 26 28 28 63 68 61  (MemPage*)&((cha
d7e0: 72 2a 29 70 44 61 74 61 29 5b 70 61 67 65 53 69  r*)pData)[pageSi
d7f0: 7a 65 5d 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ze];.  if( pPage
d800: 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20  ->isInit ){.    
d810: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
d820: 30 3b 0a 20 20 20 20 69 6e 69 74 50 61 67 65 28  0;.    initPage(
d830: 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 50  pPage, pPage->pP
d840: 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  arent);.  }.}../
d850: 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61  *.** Open a data
d860: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a  base file..** .*
d870: 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74  * zFilename is t
d880: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
d890: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
d8a0: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
d8b0: 55 4c 4c 0a 2a 2a 20 61 20 6e 65 77 20 64 61 74  ULL.** a new dat
d8c0: 61 62 61 73 65 20 77 69 74 68 20 61 20 72 61 6e  abase with a ran
d8d0: 64 6f 6d 20 6e 61 6d 65 20 69 73 20 63 72 65 61  dom name is crea
d8e0: 74 65 64 2e 20 20 54 68 69 73 20 72 61 6e 64 6f  ted.  This rando
d8f0: 6d 6c 79 20 6e 61 6d 65 64 0a 2a 2a 20 64 61 74  mly named.** dat
d900: 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20  abase file will 
d910: 62 65 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  be deleted when 
d920: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
d930: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  e() is called..*
d940: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
d950: 65 65 4f 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20  eeOpen(.  const 
d960: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
d970: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
d980: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67   file containing
d990: 20 74 68 65 20 42 54 72 65 65 20 64 61 74 61 62   the BTree datab
d9a0: 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ase */.  sqlite3
d9b0: 20 2a 70 53 71 6c 69 74 65 2c 20 20 20 20 20 20   *pSqlite,      
d9c0: 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64   /* Associated d
d9d0: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
d9e0: 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42 74  /.  Btree **ppBt
d9f0: 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  ree,        /* P
da00: 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42 74  ointer to new Bt
da10: 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74 74  ree object writt
da20: 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  en here */.  int
da30: 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
da40: 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20       /* Options 
da50: 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64  */.){.  BtShared
da60: 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 20   *pBt;          
da70: 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74 20 6f  /* Shared part o
da80: 66 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  f btree structur
da90: 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b  e */.  Btree *p;
daa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dab0: 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 75  * Handle to retu
dac0: 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  rn */.  int rc;.
dad0: 20 20 69 6e 74 20 6e 52 65 73 65 72 76 65 3b 0a    int nReserve;.
dae0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
daf0: 7a 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 0a  zDbHeader[100];.
db00: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
db10: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
db20: 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
db30: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
db40: 49 53 4b 49 4f 29 0a 20 20 63 6f 6e 73 74 20 54  ISKIO).  const T
db50: 68 72 65 61 64 44 61 74 61 20 2a 70 54 73 64 72  hreadData *pTsdr
db60: 6f 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  o;.#endif..  /* 
db70: 53 65 74 20 74 68 65 20 76 61 72 69 61 62 6c 65  Set the variable
db80: 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65   isMemdb to true
db90: 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   for an in-memor
dba0: 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a  y database, or .
dbb0: 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61    ** false for a
dbc0: 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61   file-based data
dbd0: 62 61 73 65 2e 20 54 68 69 73 20 73 79 6d 62 6f  base. This symbo
dbe0: 6c 20 69 73 20 6f 6e 6c 79 20 72 65 71 75 69 72  l is only requir
dbf0: 65 64 20 69 66 0a 20 20 2a 2a 20 65 69 74 68 65  ed if.  ** eithe
dc00: 72 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 2d  r of the shared-
dc10: 64 61 74 61 20 6f 72 20 61 75 74 6f 76 61 63 75  data or autovacu
dc20: 75 6d 20 66 65 61 74 75 72 65 73 20 61 72 65 20  um features are 
dc30: 63 6f 6d 70 69 6c 65 64 20 0a 20 20 2a 2a 20 69  compiled .  ** i
dc40: 6e 74 6f 20 74 68 65 20 6c 69 62 72 61 72 79 2e  nto the library.
dc50: 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  .  */.#if !defin
dc60: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
dc70: 48 41 52 45 44 5f 43 41 43 48 45 29 20 7c 7c 20  HARED_CACHE) || 
dc80: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
dc90: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 29  OMIT_AUTOVACUUM)
dca0: 0a 20 20 23 69 66 64 65 66 20 53 51 4c 49 54 45  .  #ifdef SQLITE
dcb0: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20  _OMIT_MEMORYDB. 
dcc0: 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d   const int isMem
dcd0: 64 62 20 3d 20 21 7a 46 69 6c 65 6e 61 6d 65 3b  db = !zFilename;
dce0: 0a 20 20 23 65 6c 73 65 0a 20 20 63 6f 6e 73 74  .  #else.  const
dcf0: 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 21   int isMemdb = !
dd00: 7a 46 69 6c 65 6e 61 6d 65 20 7c 7c 20 28 73 74  zFilename || (st
dd10: 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  rcmp(zFilename, 
dd20: 22 3a 6d 65 6d 6f 72 79 3a 22 29 3f 30 3a 31 29  ":memory:")?0:1)
dd30: 3b 0a 20 20 23 65 6e 64 69 66 0a 23 65 6e 64 69  ;.  #endif.#endi
dd40: 66 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 4d  f..  p = sqliteM
dd50: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 42 74 72  alloc(sizeof(Btr
dd60: 65 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29  ee));.  if( !p )
dd70: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
dd80: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
dd90: 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
dda0: 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 70  ANS_NONE;.  p->p
ddb0: 53 71 6c 69 74 65 20 3d 20 70 53 71 6c 69 74 65  Sqlite = pSqlite
ddc0: 3b 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66  ;..  /* Try to f
ddd0: 69 6e 64 20 61 6e 20 65 78 69 73 74 69 6e 67 20  ind an existing 
dde0: 42 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  Btree structure 
ddf0: 6f 70 65 6e 65 64 20 6f 6e 20 7a 46 69 6c 65 6e  opened on zFilen
de00: 61 6d 65 2e 20 2a 2f 0a 23 69 66 20 21 64 65 66  ame. */.#if !def
de10: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
de20: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
de30: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
de40: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
de50: 20 70 54 73 64 72 6f 20 3d 20 73 71 6c 69 74 65   pTsdro = sqlite
de60: 33 54 68 72 65 61 64 44 61 74 61 52 65 61 64 4f  3ThreadDataReadO
de70: 6e 6c 79 28 29 3b 0a 20 20 69 66 28 20 70 54 73  nly();.  if( pTs
de80: 64 72 6f 2d 3e 75 73 65 53 68 61 72 65 64 44 61  dro->useSharedDa
de90: 74 61 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 20  ta && zFilename 
dea0: 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20  && !isMemdb ){. 
deb0: 20 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61     char *zFullPa
dec0: 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
ded0: 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a  OsFullPathname(z
dee0: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69  Filename);.    i
def0: 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  f( !zFullPathnam
df00: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
df10: 65 46 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  eFree(p);.      
df20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
df30: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  MEM;.    }.    f
df40: 6f 72 28 70 42 74 3d 70 54 73 64 72 6f 2d 3e 70  or(pBt=pTsdro->p
df50: 42 74 72 65 65 3b 20 70 42 74 3b 20 70 42 74 3d  Btree; pBt; pBt=
df60: 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  pBt->pNext){.   
df70: 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
df80: 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20 20  nRef>0 );.      
df90: 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46  if( 0==strcmp(zF
dfa0: 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c  ullPathname, sql
dfb0: 69 74 65 33 70 61 67 65 72 5f 66 69 6c 65 6e 61  ite3pager_filena
dfc0: 6d 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29  me(pBt->pPager))
dfd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70   ){.        p->p
dfe0: 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20  Bt = pBt;.      
dff0: 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a    *ppBtree = p;.
e000: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65          pBt->nRe
e010: 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  f++;.        sql
e020: 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74  iteFree(zFullPat
e030: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  hname);.        
e040: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e050: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e060: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
e070: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
e080: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a   }.#endif..  /*.
e090: 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
e0a0: 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65 20  ng asserts make 
e0b0: 73 75 72 65 20 74 68 61 74 20 73 74 72 75 63 74  sure that struct
e0c0: 75 72 65 73 20 75 73 65 64 20 62 79 20 74 68 65  ures used by the
e0d0: 20 62 74 72 65 65 20 61 72 65 0a 20 20 2a 2a 20   btree are.  ** 
e0e0: 74 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20  the right size. 
e0f0: 20 54 68 69 73 20 69 73 20 74 6f 20 67 75 61 72   This is to guar
e100: 64 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63  d against size c
e110: 68 61 6e 67 65 73 20 74 68 61 74 20 72 65 73 75  hanges that resu
e120: 6c 74 0a 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d  lt.  ** when com
e130: 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66  piling on a diff
e140: 65 72 65 6e 74 20 61 72 63 68 69 74 65 63 74 75  erent architectu
e150: 72 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  re..  */.  asser
e160: 74 28 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d  t( sizeof(i64)==
e170: 38 20 7c 7c 20 73 69 7a 65 6f 66 28 69 36 34 29  8 || sizeof(i64)
e180: 3d 3d 34 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==4 );.  assert(
e190: 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20   sizeof(u64)==8 
e1a0: 7c 7c 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d  || sizeof(u64)==
e1b0: 34 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  4 );.  assert( s
e1c0: 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b  izeof(u32)==4 );
e1d0: 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f  .  assert( sizeo
e1e0: 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 61  f(u16)==2 );.  a
e1f0: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 50 67  ssert( sizeof(Pg
e200: 6e 6f 29 3d 3d 34 20 29 3b 0a 0a 20 20 70 42 74  no)==4 );..  pBt
e210: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
e220: 20 73 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b   sizeof(*pBt) );
e230: 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b  .  if( pBt==0 ){
e240: 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20  .    *ppBtree = 
e250: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  0;.    sqliteFre
e260: 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e(p);.    return
e270: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
e280: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
e290: 33 70 61 67 65 72 5f 6f 70 65 6e 28 26 70 42 74  3pager_open(&pBt
e2a0: 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e  ->pPager, zFilen
e2b0: 61 6d 65 2c 20 45 58 54 52 41 5f 53 49 5a 45 2c  ame, EXTRA_SIZE,
e2c0: 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72   flags);.  if( r
e2d0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
e2e0: 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61      if( pBt->pPa
e2f0: 67 65 72 20 29 20 73 71 6c 69 74 65 33 70 61 67  ger ) sqlite3pag
e300: 65 72 5f 63 6c 6f 73 65 28 70 42 74 2d 3e 70 50  er_close(pBt->pP
e310: 61 67 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  ager);.    sqlit
e320: 65 46 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20  eFree(pBt);.    
e330: 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 20  sqliteFree(p);. 
e340: 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b     *ppBtree = 0;
e350: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
e360: 20 20 7d 0a 20 20 70 2d 3e 70 42 74 20 3d 20 70    }.  p->pBt = p
e370: 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 70 61  Bt;..  sqlite3pa
e380: 67 65 72 5f 73 65 74 5f 64 65 73 74 72 75 63 74  ger_set_destruct
e390: 6f 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  or(pBt->pPager, 
e3a0: 70 61 67 65 44 65 73 74 72 75 63 74 6f 72 29 3b  pageDestructor);
e3b0: 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  .  sqlite3pager_
e3c0: 73 65 74 5f 72 65 69 6e 69 74 65 72 28 70 42 74  set_reiniter(pBt
e3d0: 2d 3e 70 50 61 67 65 72 2c 20 70 61 67 65 52 65  ->pPager, pageRe
e3e0: 69 6e 69 74 29 3b 0a 20 20 70 42 74 2d 3e 70 43  init);.  pBt->pC
e3f0: 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 70 42 74  ursor = 0;.  pBt
e400: 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
e410: 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20  pBt->readOnly = 
e420: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 69 73 72  sqlite3pager_isr
e430: 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61  eadonly(pBt->pPa
e440: 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 70  ger);.  sqlite3p
e450: 61 67 65 72 5f 72 65 61 64 5f 66 69 6c 65 68 65  ager_read_filehe
e460: 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72  ader(pBt->pPager
e470: 2c 20 73 69 7a 65 6f 66 28 7a 44 62 48 65 61 64  , sizeof(zDbHead
e480: 65 72 29 2c 20 7a 44 62 48 65 61 64 65 72 29 3b  er), zDbHeader);
e490: 0a 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  .  pBt->pageSize
e4a0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 7a 44 62   = get2byte(&zDb
e4b0: 48 65 61 64 65 72 5b 31 36 5d 29 3b 0a 20 20 69  Header[16]);.  i
e4c0: 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  f( pBt->pageSize
e4d0: 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67  <512 || pBt->pag
e4e0: 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  eSize>SQLITE_MAX
e4f0: 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20  _PAGE_SIZE.     
e500: 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65    || ((pBt->page
e510: 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67  Size-1)&pBt->pag
e520: 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20  eSize)!=0 ){.   
e530: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
e540: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
e550: 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 70  PAGE_SIZE;.    p
e560: 42 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72 61 63  Bt->maxEmbedFrac
e570: 20 3d 20 36 34 3b 20 20 20 2f 2a 20 32 35 25 20   = 64;   /* 25% 
e580: 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 6d 69 6e 45  */.    pBt->minE
e590: 6d 62 65 64 46 72 61 63 20 3d 20 33 32 3b 20 20  mbedFrac = 32;  
e5a0: 20 2f 2a 20 31 32 2e 35 25 20 2a 2f 0a 20 20 20   /* 12.5% */.   
e5b0: 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61   pBt->minLeafFra
e5c0: 63 20 3d 20 33 32 3b 20 20 20 20 2f 2a 20 31 32  c = 32;    /* 12
e5d0: 2e 35 25 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  .5% */.#ifndef S
e5e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
e5f0: 41 43 55 55 4d 0a 20 20 20 20 2f 2a 20 49 66 20  ACUUM.    /* If 
e600: 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22  the magic name "
e610: 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63  :memory:" will c
e620: 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f  reate an in-memo
e630: 72 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ry database, the
e640: 6e 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20  n.    ** do not 
e650: 73 65 74 20 74 68 65 20 61 75 74 6f 2d 76 61 63  set the auto-vac
e660: 75 75 6d 20 66 6c 61 67 2c 20 65 76 65 6e 20 69  uum flag, even i
e670: 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
e680: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
e690: 2a 2a 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74  ** is true. On t
e6a0: 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69  he other hand, i
e6b0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
e6c0: 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e 20  MORYDB has been 
e6d0: 64 65 66 69 6e 65 64 2c 0a 20 20 20 20 2a 2a 20  defined,.    ** 
e6e0: 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  then ":memory:" 
e6f0: 69 73 20 6a 75 73 74 20 61 20 72 65 67 75 6c 61  is just a regula
e700: 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 52 65 73  r file-name. Res
e710: 70 65 63 74 20 74 68 65 20 61 75 74 6f 2d 76 61  pect the auto-va
e720: 63 75 75 6d 0a 20 20 20 20 2a 2a 20 64 65 66 61  cuum.    ** defa
e730: 75 6c 74 20 69 6e 20 74 68 69 73 20 63 61 73 65  ult in this case
e740: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
e750: 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69   zFilename && !i
e760: 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20  sMemdb ){.      
e770: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
e780: 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
e790: 5f 41 55 54 4f 56 41 43 55 55 4d 3b 0a 20 20 20  _AUTOVACUUM;.   
e7a0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 6e 52   }.#endif.    nR
e7b0: 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 7d 65  eserve = 0;.  }e
e7c0: 6c 73 65 7b 0a 20 20 20 20 6e 52 65 73 65 72 76  lse{.    nReserv
e7d0: 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 30  e = zDbHeader[20
e7e0: 5d 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 45  ];.    pBt->maxE
e7f0: 6d 62 65 64 46 72 61 63 20 3d 20 7a 44 62 48 65  mbedFrac = zDbHe
e800: 61 64 65 72 5b 32 31 5d 3b 0a 20 20 20 20 70 42  ader[21];.    pB
e810: 74 2d 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63 20  t->minEmbedFrac 
e820: 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 32 5d 3b  = zDbHeader[22];
e830: 0a 20 20 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  .    pBt->minLea
e840: 66 46 72 61 63 20 3d 20 7a 44 62 48 65 61 64 65  fFrac = zDbHeade
e850: 72 5b 32 33 5d 3b 0a 20 20 20 20 70 42 74 2d 3e  r[23];.    pBt->
e860: 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20  pageSizeFixed = 
e870: 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  1;.#ifndef SQLIT
e880: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
e890: 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56  M.    pBt->autoV
e8a0: 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
e8b0: 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20  e(&zDbHeader[36 
e8c0: 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65  + 4*4])?1:0);.#e
e8d0: 6e 64 69 66 0a 20 20 7d 0a 20 20 70 42 74 2d 3e  ndif.  }.  pBt->
e8e0: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
e8f0: 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65  ->pageSize - nRe
e900: 73 65 72 76 65 3b 0a 20 20 61 73 73 65 72 74 28  serve;.  assert(
e910: 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20   (pBt->pageSize 
e920: 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38  & 7)==0 );  /* 8
e930: 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20  -byte alignment 
e940: 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20  of pageSize */. 
e950: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65   sqlite3pager_se
e960: 74 5f 70 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  t_pagesize(pBt->
e970: 70 50 61 67 65 72 2c 20 70 42 74 2d 3e 70 61 67  pPager, pBt->pag
e980: 65 53 69 7a 65 29 3b 0a 0a 23 69 66 20 21 64 65  eSize);..#if !de
e990: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
e9a0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
e9b0: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
e9c0: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
e9d0: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77    /* Add the new
e9e0: 20 62 74 72 65 65 20 74 6f 20 74 68 65 20 6c 69   btree to the li
e9f0: 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69  nked list starti
ea00: 6e 67 20 61 74 20 54 68 72 65 61 64 44 61 74 61  ng at ThreadData
ea10: 2e 70 42 74 72 65 65 2e 0a 20 20 2a 2a 20 54 68  .pBtree..  ** Th
ea20: 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65  ere is no chance
ea30: 20 74 68 61 74 20 61 20 6d 61 6c 6c 6f 63 28 29   that a malloc()
ea40: 20 6d 61 79 20 66 61 69 6c 20 69 6e 73 69 64 65   may fail inside
ea50: 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 73 71   of the .  ** sq
ea60: 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28  lite3ThreadData(
ea70: 29 20 63 61 6c 6c 2c 20 61 73 20 74 68 65 20 54  ) call, as the T
ea80: 68 72 65 61 64 44 61 74 61 20 73 74 72 75 63 74  hreadData struct
ea90: 75 72 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c  ure must have al
eaa0: 72 65 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20  ready.  ** been 
eab0: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 70 54  allocated for pT
eac0: 73 64 72 6f 2d 3e 75 73 65 53 68 61 72 65 64 44  sdro->useSharedD
ead0: 61 74 61 20 74 6f 20 62 65 20 6e 6f 6e 2d 7a 65  ata to be non-ze
eae0: 72 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ro..  */.  if( p
eaf0: 54 73 64 72 6f 2d 3e 75 73 65 53 68 61 72 65 64  Tsdro->useShared
eb00: 44 61 74 61 20 26 26 20 7a 46 69 6c 65 6e 61 6d  Data && zFilenam
eb10: 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b  e && !isMemdb ){
eb20: 0a 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20  .    pBt->pNext 
eb30: 3d 20 70 54 73 64 72 6f 2d 3e 70 42 74 72 65 65  = pTsdro->pBtree
eb40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 68 72  ;.    sqlite3Thr
eb50: 65 61 64 44 61 74 61 28 29 2d 3e 70 42 74 72 65  eadData()->pBtre
eb60: 65 20 3d 20 70 42 74 3b 0a 20 20 7d 0a 23 65 6e  e = pBt;.  }.#en
eb70: 64 69 66 0a 20 20 70 42 74 2d 3e 6e 52 65 66 20  dif.  pBt->nRef 
eb80: 3d 20 31 3b 0a 20 20 2a 70 70 42 74 72 65 65 20  = 1;.  *ppBtree 
eb90: 3d 20 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = p;.  return SQ
eba0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
ebb0: 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20  * Close an open 
ebc0: 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76  database and inv
ebd0: 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73  alidate all curs
ebe0: 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ors..*/.int sqli
ebf0: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74  te3BtreeClose(Bt
ec00: 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
ec10: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
ec20: 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  t;.  BtCursor *p
ec30: 43 75 72 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  Cur;..#ifndef SQ
ec40: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
ec50: 5f 43 41 43 48 45 0a 20 20 54 68 72 65 61 64 44  _CACHE.  ThreadD
ec60: 61 74 61 20 2a 70 54 73 64 3b 0a 23 65 6e 64 69  ata *pTsd;.#endi
ec70: 66 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c  f..  /* Close al
ec80: 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64  l cursors opened
ec90: 20 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65   via this handle
eca0: 2e 20 20 2a 2f 0a 20 20 70 43 75 72 20 3d 20 70  .  */.  pCur = p
ecb0: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77  Bt->pCursor;.  w
ecc0: 68 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20  hile( pCur ){.  
ecd0: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70    BtCursor *pTmp
ece0: 20 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75   = pCur;.    pCu
ecf0: 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  r = pCur->pNext;
ed00: 0a 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70  .    if( pTmp->p
ed10: 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20  Btree==p ){.    
ed20: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
ed30: 6f 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b  oseCursor(pTmp);
ed40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
ed50: 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63   Rollback any ac
ed60: 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
ed70: 20 61 6e 64 20 66 72 65 65 20 74 68 65 20 68 61   and free the ha
ed80: 6e 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a  ndle structure..
ed90: 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f    ** The call to
eda0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
edb0: 6c 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e  lback() drops an
edc0: 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65  y table-locks he
edd0: 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20  ld by.  ** this 
ede0: 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73  handle..  */.  s
edf0: 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
ee00: 61 63 6b 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ack(p);.  sqlite
ee10: 46 72 65 65 28 70 29 3b 0a 0a 23 69 66 6e 64 65  Free(p);..#ifnde
ee20: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
ee30: 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a 20  ARED_CACHE.  /* 
ee40: 49 66 20 74 68 65 72 65 20 61 72 65 20 73 74 69  If there are sti
ee50: 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e  ll other outstan
ee60: 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
ee70: 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  to the shared-bt
ee80: 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75  ree.  ** structu
ee90: 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20  re, return now. 
eea0: 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  The remainder of
eeb0: 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   this procedure 
eec0: 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20  cleans .  ** up 
eed0: 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
eee0: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
eef0: 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pBt->nRef>0 );.
ef00: 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20    pBt->nRef--;. 
ef10: 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 20 29   if( pBt->nRef )
ef20: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
ef30: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
ef40: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 68 61  * Remove the sha
ef50: 72 65 64 2d 62 74 72 65 65 20 66 72 6f 6d 20 74  red-btree from t
ef60: 68 65 20 74 68 72 65 61 64 20 77 69 64 65 20 6c  he thread wide l
ef70: 69 73 74 2e 20 43 61 6c 6c 20 0a 20 20 2a 2a 20  ist. Call .  ** 
ef80: 54 68 72 65 61 64 44 61 74 61 52 65 61 64 4f 6e  ThreadDataReadOn
ef90: 6c 79 28 29 20 61 6e 64 20 74 68 65 6e 20 63 61  ly() and then ca
efa0: 73 74 20 61 77 61 79 20 74 68 65 20 63 6f 6e 73  st away the cons
efb0: 74 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68  t property of th
efc0: 65 20 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20  e .  ** pointer 
efd0: 74 6f 20 61 76 6f 69 64 20 61 6c 6c 6f 63 61 74  to avoid allocat
efe0: 69 6e 67 20 74 68 72 65 61 64 20 64 61 74 61 20  ing thread data 
eff0: 69 66 20 69 74 20 69 73 20 6e 6f 74 20 72 65 61  if it is not rea
f000: 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 0a 20 20  lly required..  
f010: 2a 2f 0a 20 20 70 54 73 64 20 3d 20 28 54 68 72  */.  pTsd = (Thr
f020: 65 61 64 44 61 74 61 20 2a 29 73 71 6c 69 74 65  eadData *)sqlite
f030: 33 54 68 72 65 61 64 44 61 74 61 52 65 61 64 4f  3ThreadDataReadO
f040: 6e 6c 79 28 29 3b 0a 20 20 69 66 28 20 70 54 73  nly();.  if( pTs
f050: 64 2d 3e 70 42 74 72 65 65 3d 3d 70 42 74 20 29  d->pBtree==pBt )
f060: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  {.    assert( pT
f070: 73 64 3d 3d 73 71 6c 69 74 65 33 54 68 72 65 61  sd==sqlite3Threa
f080: 64 44 61 74 61 28 29 20 29 3b 0a 20 20 20 20 70  dData() );.    p
f090: 54 73 64 2d 3e 70 42 74 72 65 65 20 3d 20 70 42  Tsd->pBtree = pB
f0a0: 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73  t->pNext;.  }els
f0b0: 65 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  e{.    BtShared 
f0c0: 2a 70 50 72 65 76 3b 0a 20 20 20 20 66 6f 72 28  *pPrev;.    for(
f0d0: 70 50 72 65 76 3d 70 54 73 64 2d 3e 70 42 74 72  pPrev=pTsd->pBtr
f0e0: 65 65 3b 20 70 50 72 65 76 20 26 26 20 70 50 72  ee; pPrev && pPr
f0f0: 65 76 2d 3e 70 4e 65 78 74 21 3d 70 42 74 3b 20  ev->pNext!=pBt; 
f100: 70 50 72 65 76 3d 70 50 72 65 76 2d 3e 70 4e 65  pPrev=pPrev->pNe
f110: 78 74 29 7b 7d 0a 20 20 20 20 69 66 28 20 70 50  xt){}.    if( pP
f120: 72 65 76 20 29 7b 0a 20 20 20 20 20 20 61 73 73  rev ){.      ass
f130: 65 72 74 28 20 70 54 73 64 3d 3d 73 71 6c 69 74  ert( pTsd==sqlit
f140: 65 33 54 68 72 65 61 64 44 61 74 61 28 29 20 29  e3ThreadData() )
f150: 3b 0a 20 20 20 20 20 20 70 50 72 65 76 2d 3e 70  ;.      pPrev->p
f160: 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78  Next = pBt->pNex
f170: 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  t;.    }.  }.#en
f180: 64 69 66 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20  dif..  /* Close 
f190: 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 66 72  the pager and fr
f1a0: 65 65 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  ee the shared-bt
f1b0: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
f1c0: 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d  .  assert( !pBt-
f1d0: 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 73 71  >pCursor );.  sq
f1e0: 6c 69 74 65 33 70 61 67 65 72 5f 63 6c 6f 73 65  lite3pager_close
f1f0: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
f200: 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65 65 53   if( pBt->xFreeS
f210: 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e 70 53  chema && pBt->pS
f220: 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 70 42 74  chema ){.    pBt
f230: 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 28 70 42  ->xFreeSchema(pB
f240: 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d  t->pSchema);.  }
f250: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 42  .  sqliteFree(pB
f260: 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 73  t->pSchema);.  s
f270: 71 6c 69 74 65 46 72 65 65 28 70 42 74 29 3b 0a  qliteFree(pBt);.
f280: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f290: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
f2a0: 6e 67 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  nge the busy han
f2b0: 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 66 75  dler callback fu
f2c0: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  nction..*/.int s
f2d0: 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 42 75  qlite3BtreeSetBu
f2e0: 73 79 48 61 6e 64 6c 65 72 28 42 74 72 65 65 20  syHandler(Btree 
f2f0: 2a 70 2c 20 42 75 73 79 48 61 6e 64 6c 65 72 20  *p, BusyHandler 
f300: 2a 70 48 61 6e 64 6c 65 72 29 7b 0a 20 20 42 74  *pHandler){.  Bt
f310: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
f320: 3e 70 42 74 3b 0a 20 20 70 42 74 2d 3e 70 42 75  >pBt;.  pBt->pBu
f330: 73 79 48 61 6e 64 6c 65 72 20 3d 20 70 48 61 6e  syHandler = pHan
f340: 64 6c 65 72 3b 0a 20 20 73 71 6c 69 74 65 33 70  dler;.  sqlite3p
f350: 61 67 65 72 5f 73 65 74 5f 62 75 73 79 68 61 6e  ager_set_busyhan
f360: 64 6c 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72  dler(pBt->pPager
f370: 2c 20 70 48 61 6e 64 6c 65 72 29 3b 0a 20 20 72  , pHandler);.  r
f380: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
f390: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
f3a0: 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68   the limit on th
f3b0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
f3c0: 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65  s allowed in the
f3d0: 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   cache..**.** Th
f3e0: 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
f3f0: 20 6f 66 20 63 61 63 68 65 20 70 61 67 65 73 20   of cache pages 
f400: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 61 62  is set to the ab
f410: 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20  solute.** value 
f420: 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66 20 6d  of mxPage.  If m
f430: 78 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76  xPage is negativ
f440: 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 69 6c  e, the pager wil
f450: 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61 73 79  l.** operate asy
f460: 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74  nchronously - it
f470: 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74   will not stop t
f480: 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a  o do fsync()s.**
f490: 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74 61 20   to insure data 
f4a0: 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
f4b0: 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 20 62  e disk surface b
f4c0: 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75  efore.** continu
f4d0: 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74 69 6f  ing.  Transactio
f4e0: 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66  ns still work if
f4f0: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20   synchronous is 
f500: 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20  off,.** and the 
f510: 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20  database cannot 
f520: 62 65 20 63 6f 72 72 75 70 74 65 64 20 69 66 20  be corrupted if 
f530: 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20  this program.** 
f540: 63 72 61 73 68 65 73 2e 20 20 42 75 74 20 69 66  crashes.  But if
f550: 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
f560: 79 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72  ystem crashes or
f570: 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20   there is.** an 
f580: 61 62 72 75 70 74 20 70 6f 77 65 72 20 66 61 69  abrupt power fai
f590: 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63 68 72  lure when synchr
f5a0: 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20 74 68  onous is off, th
f5b0: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  e database.** co
f5c0: 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e 20 61  uld be left in a
f5d0: 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61  n inconsistent a
f5e0: 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62 6c 65  nd unrecoverable
f5f0: 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68   state..** Synch
f600: 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79 20  ronous is on by 
f610: 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74 61 62  default so datab
f620: 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  ase corruption i
f630: 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c  s not.** normall
f640: 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e  y a worry..*/.in
f650: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
f660: 74 43 61 63 68 65 53 69 7a 65 28 42 74 72 65 65  tCacheSize(Btree
f670: 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29   *p, int mxPage)
f680: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
f690: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71  t = p->pBt;.  sq
f6a0: 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 63  lite3pager_set_c
f6b0: 61 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  achesize(pBt->pP
f6c0: 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20  ager, mxPage);. 
f6d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
f6e0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
f6f0: 67 65 20 74 68 65 20 77 61 79 20 64 61 74 61 20  ge the way data 
f700: 69 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  is synced to dis
f710: 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e  k in order to in
f720: 63 72 65 61 73 65 20 6f 72 20 64 65 63 72 65 61  crease or decrea
f730: 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74  se.** how well t
f740: 68 65 20 64 61 74 61 62 61 73 65 20 72 65 73 69  he database resi
f750: 73 74 73 20 64 61 6d 61 67 65 20 64 75 65 20 74  sts damage due t
f760: 6f 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64  o OS crashes and
f770: 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72   power.** failur
f780: 65 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20  es.  Level 1 is 
f790: 74 68 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e  the same as asyn
f7a0: 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e  chronous (no syn
f7b0: 63 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a  cs() occur and.*
f7c0: 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 69 67  * there is a hig
f7d0: 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  h probability of
f7e0: 20 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20   damage)  Level 
f7f0: 32 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  2 is the default
f800: 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61  .  There.** is a
f810: 20 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f   very low but no
f820: 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69  n-zero probabili
f830: 74 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c  ty of damage.  L
f840: 65 76 65 6c 20 33 20 72 65 64 75 63 65 73 20 74  evel 3 reduces t
f850: 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74  he.** probabilit
f860: 79 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e  y of damage to n
f870: 65 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74  ear zero but wit
f880: 68 20 61 20 77 72 69 74 65 20 70 65 72 66 6f 72  h a write perfor
f890: 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e  mance reduction.
f8a0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
f8b0: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
f8c0: 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65  AGMAS.int sqlite
f8d0: 33 42 74 72 65 65 53 65 74 53 61 66 65 74 79 4c  3BtreeSetSafetyL
f8e0: 65 76 65 6c 28 42 74 72 65 65 20 2a 70 2c 20 69  evel(Btree *p, i
f8f0: 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75  nt level, int fu
f900: 6c 6c 53 79 6e 63 29 7b 0a 20 20 42 74 53 68 61  llSync){.  BtSha
f910: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
f920: 74 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65  t;.  sqlite3page
f930: 72 5f 73 65 74 5f 73 61 66 65 74 79 5f 6c 65 76  r_set_safety_lev
f940: 65 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  el(pBt->pPager, 
f950: 6c 65 76 65 6c 2c 20 66 75 6c 6c 53 79 6e 63 29  level, fullSync)
f960: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
f970: 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
f980: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
f990: 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 62  E if the given b
f9a0: 74 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 73  tree is set to s
f9b0: 61 66 65 74 79 20 6c 65 76 65 6c 20 31 2e 20 20  afety level 1.  
f9c0: 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64  In other.** word
f9d0: 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69  s, return TRUE i
f9e0: 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63 63 75  f no sync() occu
f9f0: 72 73 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66  rs on the disk f
fa00: 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  iles..*/.int sql
fa10: 69 74 65 33 42 74 72 65 65 53 79 6e 63 44 69 73  ite3BtreeSyncDis
fa20: 61 62 6c 65 64 28 42 74 72 65 65 20 2a 70 29 7b  abled(Btree *p){
fa30: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
fa40: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
fa50: 65 72 74 28 20 70 42 74 20 26 26 20 70 42 74 2d  ert( pBt && pBt-
fa60: 3e 70 50 61 67 65 72 20 29 3b 0a 20 20 72 65 74  >pPager );.  ret
fa70: 75 72 6e 20 73 71 6c 69 74 65 33 70 61 67 65 72  urn sqlite3pager
fa80: 5f 6e 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50 61  _nosync(pBt->pPa
fa90: 67 65 72 29 3b 0a 7d 0a 0a 23 69 66 20 21 64 65  ger);.}..#if !de
faa0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
fab0: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29  T_PAGER_PRAGMAS)
fac0: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
fad0: 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29  ITE_OMIT_VACUUM)
fae0: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
faf0: 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 73 20  e default pages 
fb00: 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d  size and the num
fb10: 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20  ber of reserved 
fb20: 62 79 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a  bytes per page..
fb30: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73  **.** The page s
fb40: 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f  ize must be a po
fb50: 77 65 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e  wer of 2 between
fb60: 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20   512 and 65536. 
fb70: 20 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20   If the page.** 
fb80: 73 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f  size supplied do
fb90: 65 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73  es not meet this
fba0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e   constraint then
fbb0: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
fbc0: 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64  s not.** changed
fbd0: 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a  ..**.** Page siz
fbe0: 65 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e  es are constrain
fbf0: 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72  ed to be a power
fc00: 20 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20   of two so that 
fc10: 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66  the region.** of
fc20: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
fc30: 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b  le used for lock
fc40: 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61  ing (beginning a
fc50: 74 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a  t PENDING_BYTE,.
fc60: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62 79 74  ** the first byt
fc70: 65 20 70 61 73 74 20 74 68 65 20 31 47 42 20 62  e past the 1GB b
fc80: 6f 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30  oundary, 0x40000
fc90: 30 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63  000) needs to oc
fca0: 63 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65  cur.** at the be
fcb0: 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67  ginning of a pag
fcc0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61  e..**.** If para
fcd0: 6d 65 74 65 72 20 6e 52 65 73 65 72 76 65 20 69  meter nReserve i
fce0: 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
fcf0: 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  , then the numbe
fd00: 72 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a  r of reserved.**
fd10: 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20   bytes per page 
fd20: 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65  is left unchange
fd30: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
fd40: 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a  3BtreeSetPageSiz
fd50: 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
fd60: 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52  pageSize, int nR
fd70: 65 73 65 72 76 65 29 7b 0a 20 20 42 74 53 68 61  eserve){.  BtSha
fd80: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
fd90: 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61  t;.  if( pBt->pa
fda0: 67 65 53 69 7a 65 46 69 78 65 64 20 29 7b 0a 20  geSizeFixed ){. 
fdb0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fdc0: 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20  _READONLY;.  }. 
fdd0: 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20   if( nReserve<0 
fde0: 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20  ){.    nReserve 
fdf0: 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
fe00: 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  - pBt->usableSiz
fe10: 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 61 67  e;.  }.  if( pag
fe20: 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61  eSize>=512 && pa
fe30: 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d  geSize<=SQLITE_M
fe40: 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a  AX_PAGE_SIZE &&.
fe50: 20 20 20 20 20 20 20 20 28 28 70 61 67 65 53 69          ((pageSi
fe60: 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d  ze-1)&pageSize)=
fe70: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
fe80: 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29  ( (pageSize & 7)
fe90: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
fea0: 74 28 20 21 70 42 74 2d 3e 70 50 61 67 65 31 20  t( !pBt->pPage1 
feb0: 26 26 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72  && !pBt->pCursor
fec0: 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67   );.    pBt->pag
fed0: 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 70  eSize = sqlite3p
fee0: 61 67 65 72 5f 73 65 74 5f 70 61 67 65 73 69 7a  ager_set_pagesiz
fef0: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  e(pBt->pPager, p
ff00: 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20  ageSize);.  }.  
ff10: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
ff20: 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
ff30: 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 72 65  - nReserve;.  re
ff40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ff50: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
ff60: 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65  the currently de
ff70: 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a  fined page size.
ff80: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
ff90: 72 65 65 47 65 74 50 61 67 65 53 69 7a 65 28 42  reeGetPageSize(B
ffa0: 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75  tree *p){.  retu
ffb0: 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53  rn p->pBt->pageS
ffc0: 69 7a 65 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  ize;.}.int sqlit
ffd0: 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76  e3BtreeGetReserv
ffe0: 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72  e(Btree *p){.  r
fff0: 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61  eturn p->pBt->pa
10000 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d  geSize - p->pBt-
10010 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 7d 0a 23  >usableSize;.}.#
10020 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
10030 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  d(SQLITE_OMIT_PA
10040 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20  GER_PRAGMAS) || 
10050 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
10060 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f 0a  OMIT_VACUUM) */.
10070 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
10080 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20  e 'auto-vacuum' 
10090 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20  property of the 
100a0 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65  database. If the
100b0 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a   'autoVacuum'.**
100c0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
100d0 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74  n-zero, then aut
100e0 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73  o-vacuum mode is
100f0 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72   enabled. If zer
10100 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61  o, it.** is disa
10110 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c  bled. The defaul
10120 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  t value for the 
10130 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70  auto-vacuum prop
10140 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65  erty is .** dete
10150 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53 51  rmined by the SQ
10160 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
10170 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a  OVACUUM macro..*
10180 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
10190 65 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28  eeSetAutoVacuum(
101a0 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75  Btree *p, int au
101b0 74 6f 56 61 63 75 75 6d 29 7b 0a 20 20 42 74 53  toVacuum){.  BtS
101c0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
101d0 70 42 74 3b 3b 0a 23 69 66 64 65 66 20 53 51 4c  pBt;;.#ifdef SQL
101e0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
101f0 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  UUM.  return SQL
10200 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65  ITE_READONLY;.#e
10210 6c 73 65 0a 20 20 69 66 28 20 70 42 74 2d 3e 70  lse.  if( pBt->p
10220 61 67 65 53 69 7a 65 46 69 78 65 64 20 29 7b 0a  ageSizeFixed ){.
10230 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10240 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a  E_READONLY;.  }.
10250 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
10260 6d 20 3d 20 28 61 75 74 6f 56 61 63 75 75 6d 3f  m = (autoVacuum?
10270 31 3a 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  1:0);.  return S
10280 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66  QLITE_OK;.#endif
10290 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
102a0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
102b0 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20  e 'auto-vacuum' 
102c0 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74  property. If aut
102d0 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20  o-vacuum is .** 
102e0 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65 74  enabled 1 is ret
102f0 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
10300 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   0..*/.int sqlit
10310 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61  e3BtreeGetAutoVa
10320 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a  cuum(Btree *p){.
10330 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
10340 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
10350 72 65 74 75 72 6e 20 30 3b 0a 23 65 6c 73 65 0a  return 0;.#else.
10360 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d    return p->pBt-
10370 3e 61 75 74 6f 56 61 63 75 75 6d 3b 0a 23 65 6e  >autoVacuum;.#en
10380 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  dif.}.../*.** Ge
10390 74 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  t a reference to
103a0 20 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64   pPage1 of the d
103b0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
103c0 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f  his will.** also
103d0 20 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c   acquire a readl
103e0 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65  ock on that file
103f0 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
10400 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
10410 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68   success.  If th
10420 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a  e file is not a.
10430 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64  ** well-formed d
10440 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
10450 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  en SQLITE_CORRUP
10460 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  T is returned..*
10470 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  * SQLITE_BUSY is
10480 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
10490 20 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63   database is loc
104a0 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d  ked.  SQLITE_NOM
104b0 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  EM.** is returne
104c0 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20  d if we run out 
104d0 6f 66 20 6d 65 6d 6f 72 79 2e 20 20 53 51 4c 49  of memory.  SQLI
104e0 54 45 5f 50 52 4f 54 4f 43 4f 4c 20 69 73 20 72  TE_PROTOCOL is r
104f0 65 74 75 72 6e 65 64 0a 2a 2a 20 69 66 20 74 68  eturned.** if th
10500 65 72 65 20 69 73 20 61 20 6c 6f 63 6b 69 6e 67  ere is a locking
10510 20 70 72 6f 74 6f 63 6f 6c 20 76 69 6f 6c 61 74   protocol violat
10520 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
10530 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53  nt lockBtree(BtS
10540 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
10550 6e 74 20 72 63 2c 20 70 61 67 65 53 69 7a 65 3b  nt rc, pageSize;
10560 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
10570 65 31 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70  e1;.  if( pBt->p
10580 50 61 67 65 31 20 29 20 72 65 74 75 72 6e 20 53  Page1 ) return S
10590 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 72 63 20 3d  QLITE_OK;.  rc =
105a0 20 67 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c   getPage(pBt, 1,
105b0 20 26 70 50 61 67 65 31 29 3b 0a 20 20 69 66 28   &pPage1);.  if(
105c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
105d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 0a 0a   return rc;.  ..
105e0 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65    /* Do some che
105f0 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e  cking to help in
10600 73 75 72 65 20 74 68 65 20 66 69 6c 65 20 77 65  sure the file we
10610 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69   opened really i
10620 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64  s.  ** a valid d
10630 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20  atabase file. . 
10640 20 2a 2f 0a 20 20 72 63 20 3d 20 53 51 4c 49 54   */.  rc = SQLIT
10650 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 69 66 28 20  E_NOTADB;.  if( 
10660 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67  sqlite3pager_pag
10670 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
10680 65 72 29 3e 30 20 29 7b 0a 20 20 20 20 75 38 20  er)>0 ){.    u8 
10690 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d  *page1 = pPage1-
106a0 3e 61 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20  >aData;.    if( 
106b0 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d  memcmp(page1, zM
106c0 61 67 69 63 48 65 61 64 65 72 2c 20 31 36 29 21  agicHeader, 16)!
106d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
106e0 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
106f0 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ed;.    }.    if
10700 28 20 70 61 67 65 31 5b 31 38 5d 3e 31 20 7c 7c  ( page1[18]>1 ||
10710 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a   page1[19]>1 ){.
10720 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
10730 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
10740 20 20 7d 0a 20 20 20 20 70 61 67 65 53 69 7a 65    }.    pageSize
10750 20 3d 20 67 65 74 32 62 79 74 65 28 26 70 61 67   = get2byte(&pag
10760 65 31 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66 28  e1[16]);.    if(
10770 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70   ((pageSize-1)&p
10780 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20  ageSize)!=0 ){. 
10790 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
107a0 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
107b0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 28   }.    assert( (
107c0 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30  pageSize & 7)==0
107d0 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67   );.    pBt->pag
107e0 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
107f0 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c  ;.    pBt->usabl
10800 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
10810 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20   - page1[20];.  
10820 20 20 69 66 28 20 70 42 74 2d 3e 75 73 61 62 6c    if( pBt->usabl
10830 65 53 69 7a 65 3c 35 30 30 20 29 7b 0a 20 20 20  eSize<500 ){.   
10840 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
10850 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
10860 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 45 6d 62  .    pBt->maxEmb
10870 65 64 46 72 61 63 20 3d 20 70 61 67 65 31 5b 32  edFrac = page1[2
10880 31 5d 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 69 6e  1];.    pBt->min
10890 45 6d 62 65 64 46 72 61 63 20 3d 20 70 61 67 65  EmbedFrac = page
108a0 31 5b 32 32 5d 3b 0a 20 20 20 20 70 42 74 2d 3e  1[22];.    pBt->
108b0 6d 69 6e 4c 65 61 66 46 72 61 63 20 3d 20 70 61  minLeafFrac = pa
108c0 67 65 31 5b 32 33 5d 3b 0a 23 69 66 6e 64 65 66  ge1[23];.#ifndef
108d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
108e0 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d  OVACUUM.    pBt-
108f0 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67  >autoVacuum = (g
10900 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33  et4byte(&page1[3
10910 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 4*4])?1:0);.
10920 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a  #endif.  }..  /*
10930 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68 65   maxLocal is the
10940 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20   maximum amount 
10950 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73 74  of payload to st
10960 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a  ore locally for.
10970 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61    ** a cell.  Ma
10980 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 73 6d  ke sure it is sm
10990 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74 68  all enough so th
109a0 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46  at at least minF
109b0 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73  anout.  ** cells
109c0 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e   can will fit on
109d0 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20 61   one page.  We a
109e0 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65 20  ssume a 10-byte 
109f0 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20 2a  page header..  *
10a00 2a 20 42 65 73 69 64 65 73 20 74 68 65 20 70 61  * Besides the pa
10a10 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c 20  yload, the cell 
10a20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a  must store:.  **
10a30 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e       2-byte poin
10a40 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a  ter to the cell.
10a50 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
10a60 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20  child pointer.  
10a70 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e 4b  **     9-byte nK
10a80 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20  ey value.  **   
10a90 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20 76    4-byte nData v
10aa0 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d  alue.  **     4-
10ab0 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  byte overflow pa
10ac0 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20  ge pointer.  ** 
10ad0 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73  So a cell consis
10ae0 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70  ts of a 2-byte p
10af0 6f 69 6e 65 72 2c 20 61 20 68 65 61 64 65 72 20  oiner, a header 
10b00 77 68 69 63 68 20 69 73 20 61 73 20 6d 75 63 68  which is as much
10b10 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74 65   as.  ** 17 byte
10b20 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62  s long, 0 to N b
10b30 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c  ytes of payload,
10b40 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c   and an optional
10b50 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77   4 byte overflow
10b60 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74  .  ** page point
10b70 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e  er..  */.  pBt->
10b80 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d  maxLocal = (pBt-
10b90 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
10ba0 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72 61  pBt->maxEmbedFra
10bb0 63 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 70 42  c/255 - 23;.  pB
10bc0 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 70  t->minLocal = (p
10bd0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
10be0 32 29 2a 70 42 74 2d 3e 6d 69 6e 45 6d 62 65 64  2)*pBt->minEmbed
10bf0 46 72 61 63 2f 32 35 35 20 2d 20 32 33 3b 0a 20  Frac/255 - 23;. 
10c00 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20   pBt->maxLeaf = 
10c10 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
10c20 2d 20 33 35 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e  - 35;.  pBt->min
10c30 4c 65 61 66 20 3d 20 28 70 42 74 2d 3e 75 73 61  Leaf = (pBt->usa
10c40 62 6c 65 53 69 7a 65 2d 31 32 29 2a 70 42 74 2d  bleSize-12)*pBt-
10c50 3e 6d 69 6e 4c 65 61 66 46 72 61 63 2f 32 35 35  >minLeafFrac/255
10c60 20 2d 20 32 33 3b 0a 20 20 69 66 28 20 70 42 74   - 23;.  if( pBt
10c70 2d 3e 6d 69 6e 4c 6f 63 61 6c 3e 70 42 74 2d 3e  ->minLocal>pBt->
10c80 6d 61 78 4c 6f 63 61 6c 20 7c 7c 20 70 42 74 2d  maxLocal || pBt-
10c90 3e 6d 61 78 4c 6f 63 61 6c 3c 30 20 29 7b 0a 20  >maxLocal<0 ){. 
10ca0 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
10cb0 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 0a 20  it_failed;.  }. 
10cc0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61   assert( pBt->ma
10cd0 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58  xLeaf + 23 <= MX
10ce0 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
10cf0 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31  );.  pBt->pPage1
10d00 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 72 65 74   = pPage1;.  ret
10d10 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
10d20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
10d30 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  d:.  releasePage
10d40 28 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d  (pPage1);.  pBt-
10d50 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72  >pPage1 = 0;.  r
10d60 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
10d70 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
10d80 77 6f 72 6b 73 20 6c 69 6b 65 20 6c 6f 63 6b 42  works like lockB
10d90 74 72 65 65 28 29 20 65 78 63 65 70 74 20 74 68  tree() except th
10da0 61 74 20 69 74 20 61 6c 73 6f 20 69 6e 76 6f 6b  at it also invok
10db0 65 73 20 74 68 65 0a 2a 2a 20 62 75 73 79 20 63  es the.** busy c
10dc0 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 72 65  allback if there
10dd0 20 69 73 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74   is lock content
10de0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
10df0 6e 74 20 6c 6f 63 6b 42 74 72 65 65 57 69 74 68  nt lockBtreeWith
10e00 52 65 74 72 79 28 42 74 72 65 65 20 2a 70 52 65  Retry(Btree *pRe
10e10 66 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  f){.  int rc = S
10e20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
10e30 70 52 65 66 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  pRef->inTrans==T
10e40 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
10e50 20 75 38 20 69 6e 54 72 61 6e 73 61 63 74 69 6f   u8 inTransactio
10e60 6e 20 3d 20 70 52 65 66 2d 3e 70 42 74 2d 3e 69  n = pRef->pBt->i
10e70 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20 20  nTransaction;.  
10e80 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
10e90 28 70 52 65 66 29 3b 0a 20 20 20 20 72 63 20 3d  (pRef);.    rc =
10ea0 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
10eb0 69 6e 54 72 61 6e 73 28 70 52 65 66 2c 20 30 29  inTrans(pRef, 0)
10ec0 3b 0a 20 20 20 20 70 52 65 66 2d 3e 70 42 74 2d  ;.    pRef->pBt-
10ed0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
10ee0 20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b 0a   inTransaction;.
10ef0 20 20 20 20 70 52 65 66 2d 3e 69 6e 54 72 61 6e      pRef->inTran
10f00 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  s = TRANS_NONE;.
10f10 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
10f20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
10f30 52 65 66 2d 3e 70 42 74 2d 3e 6e 54 72 61 6e 73  Ref->pBt->nTrans
10f40 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 7d 0a  action--;.    }.
10f50 20 20 20 20 62 74 72 65 65 49 6e 74 65 67 72 69      btreeIntegri
10f60 74 79 28 70 52 65 66 29 3b 0a 20 20 7d 0a 20 20  ty(pRef);.  }.  
10f70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 20 20  return rc;.}.   
10f80 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74      ../*.** If t
10f90 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73  here are no outs
10fa0 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20  tanding cursors 
10fb0 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69  and we are not i
10fc0 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20  n the middle.** 
10fd0 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
10fe0 20 62 75 74 20 74 68 65 72 65 20 69 73 20 61 20   but there is a 
10ff0 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
11000 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a   database, then.
11010 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
11020 75 6e 72 65 66 73 20 74 68 65 20 66 69 72 73 74  unrefs the first
11030 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
11040 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 63 68  abase file which
11050 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66   .** has the eff
11060 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67  ect of releasing
11070 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
11080 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  **.** If there a
11090 72 65 20 61 6e 79 20 6f 75 74 73 74 61 6e 64 69  re any outstandi
110a0 6e 67 20 63 75 72 73 6f 72 73 2c 20 74 68 69 73  ng cursors, this
110b0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
110c0 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  -op..**.** If th
110d0 65 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63  ere is a transac
110e0 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73  tion in progress
110f0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
11100 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
11110 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b  atic void unlock
11120 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74  BtreeIfUnused(Bt
11130 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
11140 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  if( pBt->inTrans
11150 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f  action==TRANS_NO
11160 4e 45 20 26 26 20 70 42 74 2d 3e 70 43 75 72 73  NE && pBt->pCurs
11170 6f 72 3d 3d 30 20 26 26 20 70 42 74 2d 3e 70 50  or==0 && pBt->pP
11180 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 69  age1!=0 ){.    i
11190 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  f( pBt->pPage1->
111a0 61 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20  aData==0 ){.    
111b0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
111c0 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
111d0 20 20 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61        pPage->aDa
111e0 74 61 20 3d 20 26 28 28 75 38 2a 29 70 50 61 67  ta = &((u8*)pPag
111f0 65 29 5b 2d 70 42 74 2d 3e 70 61 67 65 53 69 7a  e)[-pBt->pageSiz
11200 65 5d 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d  e];.      pPage-
11210 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20  >pBt = pBt;.    
11220 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20    pPage->pgno = 
11230 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c  1;.    }.    rel
11240 65 61 73 65 50 61 67 65 28 70 42 74 2d 3e 70 50  easePage(pBt->pP
11250 61 67 65 31 29 3b 0a 20 20 20 20 70 42 74 2d 3e  age1);.    pBt->
11260 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20  pPage1 = 0;.    
11270 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b  pBt->inStmt = 0;
11280 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  .  }.}../*.** Cr
11290 65 61 74 65 20 61 20 6e 65 77 20 64 61 74 61 62  eate a new datab
112a0 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a  ase by initializ
112b0 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61  ing the first pa
112c0 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c  ge of the.** fil
112d0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
112e0 20 6e 65 77 44 61 74 61 62 61 73 65 28 42 74 53   newDatabase(BtS
112f0 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d  hared *pBt){.  M
11300 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75  emPage *pP1;.  u
11310 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
11320 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ta;.  int rc;.  
11330 69 66 28 20 73 71 6c 69 74 65 33 70 61 67 65 72  if( sqlite3pager
11340 5f 70 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  _pagecount(pBt->
11350 70 50 61 67 65 72 29 3e 30 20 29 20 72 65 74 75  pPager)>0 ) retu
11360 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
11370 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  pP1 = pBt->pPage
11380 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 31  1;.  assert( pP1
11390 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d 20  !=0 );.  data = 
113a0 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63  pP1->aData;.  rc
113b0 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
113c0 77 72 69 74 65 28 64 61 74 61 29 3b 0a 20 20 69  write(data);.  i
113d0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
113e0 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61  c;.  memcpy(data
113f0 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20  , zMagicHeader, 
11400 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61  sizeof(zMagicHea
11410 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28  der));.  assert(
11420 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65   sizeof(zMagicHe
11430 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 70  ader)==16 );.  p
11440 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 31 36  ut2byte(&data[16
11450 5d 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ], pBt->pageSize
11460 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20  );.  data[18] = 
11470 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20  1;.  data[19] = 
11480 31 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20  1;.  data[20] = 
11490 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
114a0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
114b0 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20 70 42  .  data[21] = pB
114c0 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72 61 63 3b  t->maxEmbedFrac;
114d0 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 70 42  .  data[22] = pB
114e0 74 2d 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63 3b  t->minEmbedFrac;
114f0 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 70 42  .  data[23] = pB
11500 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63 3b 0a  t->minLeafFrac;.
11510 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32    memset(&data[2
11520 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a  4], 0, 100-24);.
11530 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20    zeroPage(pP1, 
11540 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c  PTF_INTKEY|PTF_L
11550 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41  EAF|PTF_LEAFDATA
11560 20 29 3b 0a 20 20 70 42 74 2d 3e 70 61 67 65 53   );.  pBt->pageS
11570 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69  izeFixed = 1;.#i
11580 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11590 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69  T_AUTOVACUUM.  i
115a0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
115b0 75 6d 20 29 7b 0a 20 20 20 20 70 75 74 34 62 79  um ){.    put4by
115c0 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a  te(&data[36 + 4*
115d0 34 5d 2c 20 31 29 3b 0a 20 20 7d 0a 23 65 6e 64  4], 1);.  }.#end
115e0 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
115f0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
11600 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74  Attempt to start
11610 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
11620 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e  on. A write-tran
11630 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74  saction.** is st
11640 61 72 74 65 64 20 69 66 20 74 68 65 20 73 65 63  arted if the sec
11650 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
11660 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69  nonzero, otherwi
11670 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72  se a read-.** tr
11680 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74  ansaction.  If t
11690 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
116a0 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20  nt is 2 or more 
116b0 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a  and exclusive.**
116c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
116d0 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67  started, meaning
116e0 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70   that no other p
116f0 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65  rocess is allowe
11700 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74  d.** to access t
11710 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 41 20  he database.  A 
11720 70 72 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e  preexisting tran
11730 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20  saction may not 
11740 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74  be.** upgraded t
11750 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79 20 63  o exclusive by c
11760 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
11770 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d  ine a second tim
11780 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75  e - the.** exclu
11790 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79  sivity flag only
117a0 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77   works for a new
117b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
117c0 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
117d0 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
117e0 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61  started before a
117f0 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a  ttempting any .*
11800 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  * changes to the
11810 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65   database.  None
11820 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
11830 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77  g routines .** w
11840 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20  ill work unless 
11850 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
11860 20 73 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a   started first:.
11870 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  **.**      sqlit
11880 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62  e3BtreeCreateTab
11890 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
118a0 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 49  ite3BtreeCreateI
118b0 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73  ndex().**      s
118c0 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
118d0 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
118e0 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70  sqlite3BtreeDrop
118f0 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
11900 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65  sqlite3BtreeInse
11910 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  rt().**      sql
11920 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28  ite3BtreeDelete(
11930 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
11940 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61  3BtreeUpdateMeta
11950 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69  ().**.** If an i
11960 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74  nitial attempt t
11970 6f 20 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f  o acquire the lo
11980 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73 65  ck fails because
11990 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74   of lock content
119a0 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64  ion.** and the d
119b0 61 74 61 62 61 73 65 20 77 61 73 20 70 72 65 76  atabase was prev
119c0 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c  iously unlocked,
119d0 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65   then invoke the
119e0 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a   busy handler.**
119f0 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
11a00 2e 20 20 42 75 74 20 69 66 20 74 68 65 72 65 20  .  But if there 
11a10 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61  was previously a
11a20 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e   read-lock, do n
11a30 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65  ot.** invoke the
11a40 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20   busy handler - 
11a50 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49  just return SQLI
11a60 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45  TE_BUSY.  SQLITE
11a70 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74  _BUSY is .** ret
11a80 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65  urned when there
11a90 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 72 65   is already a re
11aa0 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72  ad-lock in order
11ab0 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64   to avoid a dead
11ac0 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70  lock..**.** Supp
11ad0 6f 73 65 20 74 68 65 72 65 20 61 72 65 20 74 77  ose there are tw
11ae0 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e  o processes A an
11af0 64 20 42 2e 20 20 41 20 68 61 73 20 61 20 72 65  d B.  A has a re
11b00 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61  ad lock and B ha
11b10 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20  s.** a reserved 
11b20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74  lock.  B tries t
11b30 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63  o promote to exc
11b40 6c 75 73 69 76 65 20 62 75 74 20 69 73 20 62 6c  lusive but is bl
11b50 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a  ocked because.**
11b60 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63   of A's read loc
11b70 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20 70  k.  A tries to p
11b80 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76  romote to reserv
11b90 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65  ed but is blocke
11ba0 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f  d by B..** One o
11bb0 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
11bc0 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73  he two processes
11bd0 20 6d 75 73 74 20 67 69 76 65 20 77 61 79 20 6f   must give way o
11be0 72 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a  r there can be.*
11bf0 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20  * no progress.  
11c00 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c  By returning SQL
11c10 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74  ITE_BUSY and not
11c20 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75   invoking the bu
11c30 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77  sy callback.** w
11c40 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61  hen A already ha
11c50 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77  s a read lock, w
11c60 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f  e encourage A to
11c70 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74   give up and let
11c80 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a   B.** proceed..*
11c90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
11ca0 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72  eeBeginTrans(Btr
11cb0 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61  ee *p, int wrfla
11cc0 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  g){.  BtShared *
11cd0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
11ce0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
11cf0 4f 4b 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74 65  OK;..  btreeInte
11d00 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20  grity(p);..  /* 
11d10 49 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20  If the btree is 
11d20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72 69  already in a wri
11d30 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  te-transaction, 
11d40 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c  or it.  ** is al
11d50 72 65 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d  ready in a read-
11d60 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
11d70 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
11d80 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65  on.  ** is reque
11d90 73 74 65 64 2c 20 74 68 69 73 20 69 73 20 61 20  sted, this is a 
11da0 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66  no-op..  */.  if
11db0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
11dc0 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d  ANS_WRITE || (p-
11dd0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
11de0 52 45 41 44 20 26 26 20 21 77 72 66 6c 61 67 29  READ && !wrflag)
11df0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
11e00 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
11e10 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61   /* Write transa
11e20 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70  ctions are not p
11e30 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61  ossible on a rea
11e40 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20  d-only database 
11e50 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 72 65  */.  if( pBt->re
11e60 61 64 4f 6e 6c 79 20 26 26 20 77 72 66 6c 61 67  adOnly && wrflag
11e70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
11e80 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
11e90 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 6f    }..  /* If ano
11ea0 74 68 65 72 20 64 61 74 61 62 61 73 65 20 68 61  ther database ha
11eb0 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79  ndle has already
11ec0 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65 20   opened a write 
11ed0 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a  transaction .  *
11ee0 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64  * on this shared
11ef0 2d 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65  -btree structure
11f00 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77 72   and a second wr
11f10 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
11f20 69 73 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65  is.  ** requeste
11f30 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  d, return SQLITE
11f40 5f 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66  _BUSY..  */.  if
11f50 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
11f60 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
11f70 45 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  E && wrflag ){. 
11f80 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11f90 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 64 6f  _BUSY;.  }..  do
11fa0 20 7b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e   {.    if( pBt->
11fb0 70 50 61 67 65 31 3d 3d 30 20 29 7b 0a 20 20 20  pPage1==0 ){.   
11fc0 20 20 20 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65     rc = lockBtre
11fd0 65 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  e(pBt);.    }.  
11fe0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
11ff0 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67  ITE_OK && wrflag
12000 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
12010 71 6c 69 74 65 33 70 61 67 65 72 5f 62 65 67 69  qlite3pager_begi
12020 6e 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  n(pBt->pPage1->a
12030 44 61 74 61 2c 20 77 72 66 6c 61 67 3e 31 29 3b  Data, wrflag>1);
12040 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
12050 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12060 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61      rc = newData
12070 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20  base(pBt);.     
12080 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
12090 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
120a0 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 77  K ){.      if( w
120b0 72 66 6c 61 67 20 29 20 70 42 74 2d 3e 69 6e 53  rflag ) pBt->inS
120c0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  tmt = 0;.    }el
120d0 73 65 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b  se{.      unlock
120e0 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
120f0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69  t);.    }.  }whi
12100 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  le( rc==SQLITE_B
12110 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54 72  USY && pBt->inTr
12120 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
12130 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20 20  _NONE &&.       
12140 20 20 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65     sqlite3Invoke
12150 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74 2d  BusyHandler(pBt-
12160 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 29 20 29  >pBusyHandler) )
12170 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
12180 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
12190 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
121a0 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  ANS_NONE ){.    
121b0 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74    pBt->nTransact
121c0 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  ion++;.    }.   
121d0 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77   p->inTrans = (w
121e0 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54  rflag?TRANS_WRIT
121f0 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20  E:TRANS_READ);. 
12200 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
12210 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  s>pBt->inTransac
12220 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42  tion ){.      pB
12230 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
12240 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20   = p->inTrans;. 
12250 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 62 74 72 65     }.  }..  btre
12260 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20  eIntegrity(p);. 
12270 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
12280 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12290 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f  IT_AUTOVACUUM../
122a0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f 69  *.** Set the poi
122b0 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
122c0 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72 65   for all childre
122d0 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 2e  n of page pPage.
122e0 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61   Also, if.** pPa
122f0 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c  ge contains cell
12300 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  s that point to 
12310 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20  overflow pages, 
12320 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 0a  set the pointer.
12330 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66  ** map entries f
12340 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
12350 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a  pages as well..*
12360 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74  /.static int set
12370 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d  ChildPtrmaps(Mem
12380 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
12390 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
123a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123b0 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61     /* Counter va
123c0 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  riable */.  int 
123d0 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  nCell;          
123e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
123f0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
12400 73 20 69 6e 20 70 61 67 65 20 70 50 61 67 65 20  s in page pPage 
12410 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
12420 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
12430 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
12440 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68  n code */.  BtSh
12450 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
12460 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 69 73  e->pBt;.  int is
12470 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65  InitOrig = pPage
12480 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f  ->isInit;.  Pgno
12490 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70   pgno = pPage->p
124a0 67 6e 6f 3b 0a 0a 20 20 69 6e 69 74 50 61 67 65  gno;..  initPage
124b0 28 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 6e 43  (pPage, 0);.  nC
124c0 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
124d0 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ll;..  for(i=0; 
124e0 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
124f0 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66     u8 *pCell = f
12500 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
12510 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72  );..    rc = ptr
12520 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50  mapPutOvflPtr(pP
12530 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20  age, pCell);.   
12540 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12550 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
12560 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61   set_child_ptrma
12570 70 73 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20  ps_out;.    }.. 
12580 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
12590 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  eaf ){.      Pgn
125a0 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65  o childPgno = ge
125b0 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20  t4byte(pCell);. 
125c0 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
125d0 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67  Put(pBt, childPg
125e0 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
125f0 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69  , pgno);.      i
12600 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12610 20 29 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c   ) goto set_chil
12620 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20  d_ptrmaps_out;. 
12630 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
12640 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
12650 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67      Pgno childPg
12660 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
12670 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
12680 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
12690 3b 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  ;.    rc = ptrma
126a0 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50  pPut(pBt, childP
126b0 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
126c0 45 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 0a 73  E, pgno);.  }..s
126d0 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73  et_child_ptrmaps
126e0 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69  _out:.  pPage->i
126f0 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72  sInit = isInitOr
12700 69 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ig;.  return rc;
12710 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68  .}../*.** Somewh
12720 65 72 65 20 6f 6e 20 70 50 61 67 65 2c 20 77 68  ere on pPage, wh
12730 69 63 68 20 69 73 20 67 75 61 72 65 6e 74 65 65  ich is guarentee
12740 64 20 74 6f 20 62 65 20 61 20 62 74 72 65 65 20  d to be a btree 
12750 70 61 67 65 2c 20 6e 6f 74 20 61 6e 20 6f 76 65  page, not an ove
12760 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 2c 20 69  rflow.** page, i
12770 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  s a pointer to p
12780 61 67 65 20 69 46 72 6f 6d 2e 20 4d 6f 64 69 66  age iFrom. Modif
12790 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73  y this pointer s
127a0 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
127b0 20 74 6f 0a 2a 2a 20 69 54 6f 2e 20 50 61 72 61   to.** iTo. Para
127c0 6d 65 74 65 72 20 65 54 79 70 65 20 64 65 73 63  meter eType desc
127d0 72 69 62 65 73 20 74 68 65 20 74 79 70 65 20 6f  ribes the type o
127e0 66 20 70 6f 69 6e 74 65 72 20 74 6f 20 62 65 20  f pointer to be 
127f0 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 0a 2a 2a  modified, as .**
12800 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
12810 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20  PTRMAP_BTREE:   
12820 20 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72    pPage is a btr
12830 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ee-page. The poi
12840 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61  nter points at a
12850 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20   child .**      
12860 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
12870 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a  e of pPage..**.*
12880 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  * PTRMAP_OVERFLO
12890 57 31 3a 20 70 50 61 67 65 20 69 73 20 61 20 62  W1: pPage is a b
128a0 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70  tree-page. The p
128b0 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
128c0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20   an overflow.** 
128d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128e0 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74    page pointed t
128f0 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  o by one of the 
12900 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a  cells on pPage..
12910 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45  **.** PTRMAP_OVE
12920 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73  RFLOW2: pPage is
12930 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67   an overflow-pag
12940 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
12950 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78  oints at the nex
12960 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
12970 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20         overflow 
12980 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74  page in the list
12990 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
129a0 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65  modifyPagePointe
129b0 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
129c0 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67  , Pgno iFrom, Pg
129d0 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65  no iTo, u8 eType
129e0 29 7b 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  ){.  if( eType==
129f0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
12a00 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
12a10 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61 79 73  ointer is always
12a20 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
12a30 65 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 69  es of the page i
12a40 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f  n this case.  */
12a50 0a 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74  .    if( get4byt
12a60 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 21  e(pPage->aData)!
12a70 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
12a80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
12a90 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
12aa0 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 70  }.    put4byte(p
12ab0 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f  Page->aData, iTo
12ac0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
12ad0 69 6e 74 20 69 73 49 6e 69 74 4f 72 69 67 20 3d  int isInitOrig =
12ae0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a   pPage->isInit;.
12af0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
12b00 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 69  nt nCell;..    i
12b10 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c 20 30  nitPage(pPage, 0
12b20 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70  );.    nCell = p
12b30 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20  Page->nCell;..  
12b40 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
12b50 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
12b60 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64  u8 *pCell = find
12b70 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
12b80 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
12b90 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
12ba0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c  1 ){.        Cel
12bb0 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
12bc0 20 20 20 20 70 61 72 73 65 43 65 6c 6c 50 74 72      parseCellPtr
12bd0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
12be0 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69  info);.        i
12bf0 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
12c00 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  w ){.          i
12c10 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79  f( iFrom==get4by
12c20 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
12c30 4f 76 65 72 66 6c 6f 77 5d 29 20 29 7b 0a 20 20  Overflow]) ){.  
12c40 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
12c50 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
12c60 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b  Overflow], iTo);
12c70 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
12c80 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
12c90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12ca0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
12cb0 66 28 20 67 65 74 34 62 79 74 65 28 70 43 65 6c  f( get4byte(pCel
12cc0 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  l)==iFrom ){.   
12cd0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
12ce0 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20  pCell, iTo);.   
12cf0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
12d00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
12d10 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
12d20 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20   i==nCell ){.   
12d30 20 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54     if( eType!=PT
12d40 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20  RMAP_BTREE || . 
12d50 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74           get4byt
12d60 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
12d70 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
12d80 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20  +8])!=iFrom ){. 
12d90 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
12da0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
12db0 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  T;.      }.     
12dc0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
12dd0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
12de0 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f  drOffset+8], iTo
12df0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50  );.    }..    pP
12e00 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73  age->isInit = is
12e10 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20  InitOrig;.  }.  
12e20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12e30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ;.}.../*.** Move
12e40 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
12e50 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 20  se page pDbPage 
12e60 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65  to location iFre
12e70 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a  ePage in the .**
12e80 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 70   database. The p
12e90 44 62 50 61 67 65 20 72 65 66 65 72 65 6e 63 65  DbPage reference
12ea0 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a   remains valid..
12eb0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
12ec0 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42 74  locatePage(.  Bt
12ed0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
12ee0 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
12ef0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44  */.  MemPage *pD
12f00 62 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a  bPage,        /*
12f10 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f   Open page to mo
12f20 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65  ve */.  u8 eType
12f30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
12f40 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
12f50 27 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72  'type' entry for
12f60 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
12f70 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20 20  no iPtrPage,    
12f80 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
12f90 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20  r map 'page-no' 
12fa0 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67  entry for pDbPag
12fb0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65  e */.  Pgno iFre
12fc0 65 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20  ePage           
12fd0 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  /* The location 
12fe0 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20  to move pDbPage 
12ff0 74 6f 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61  to */.){.  MemPa
13000 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20  ge *pPtrPage;   
13010 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74  /* The page that
13020 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
13030 74 65 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a  ter to pDbPage *
13040 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65  /.  Pgno iDbPage
13050 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f   = pDbPage->pgno
13060 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
13070 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b  r = pBt->pPager;
13080 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
13090 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52  sert( eType==PTR
130a0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c  MAP_OVERFLOW2 ||
130b0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
130c0 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20  VERFLOW1 || .   
130d0 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50     eType==PTRMAP
130e0 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d  _BTREE || eType=
130f0 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
13100 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70   );..  /* Move p
13110 61 67 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d  age iDbPage from
13120 20 69 74 27 73 20 63 75 72 72 65 6e 74 20 6c 6f   it's current lo
13130 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e  cation to page n
13140 75 6d 62 65 72 20 69 46 72 65 65 50 61 67 65 20  umber iFreePage 
13150 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55 54  */.  TRACE(("AUT
13160 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20  OVACUUM: Moving 
13170 25 64 20 74 6f 20 66 72 65 65 20 70 61 67 65 20  %d to free page 
13180 25 64 20 28 70 74 72 20 70 61 67 65 20 25 64 20  %d (ptr page %d 
13190 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20  type %d)\n", .  
131a0 20 20 20 20 69 44 62 50 61 67 65 2c 20 69 46 72      iDbPage, iFr
131b0 65 65 50 61 67 65 2c 20 69 50 74 72 50 61 67 65  eePage, iPtrPage
131c0 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20  , eType));.  rc 
131d0 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6d  = sqlite3pager_m
131e0 6f 76 65 70 61 67 65 28 70 50 61 67 65 72 2c 20  ovepage(pPager, 
131f0 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  pDbPage->aData, 
13200 69 46 72 65 65 50 61 67 65 29 3b 0a 20 20 69 66  iFreePage);.  if
13210 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13220 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
13230 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d  ;.  }.  pDbPage-
13240 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67  >pgno = iFreePag
13250 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50  e;..  /* If pDbP
13260 61 67 65 20 77 61 73 20 61 20 62 74 72 65 65 2d  age was a btree-
13270 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61  page, then it ma
13280 79 20 68 61 76 65 20 63 68 69 6c 64 20 70 61 67  y have child pag
13290 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a  es and/or cells.
132a0 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20    ** that point 
132b0 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
132c0 73 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  s. The pointer m
132d0 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  ap entries for a
132e0 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61  ll these.  ** pa
132f0 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63  ges need to be c
13300 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  hanged..  **.  *
13310 2a 20 49 66 20 70 44 62 50 61 67 65 20 69 73 20  * If pDbPage is 
13320 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
13330 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74  , then the first
13340 20 34 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f   4 bytes may sto
13350 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65  re a.  ** pointe
13360 72 20 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e  r to a subsequen
13370 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  t overflow page.
13380 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
13390 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20  case, then.  ** 
133a0 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
133b0 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61  needs to be upda
133c0 74 65 64 20 66 6f 72 20 74 68 65 20 73 75 62 73  ted for the subs
133d0 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20  equent overflow 
133e0 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  page..  */.  if(
133f0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42   eType==PTRMAP_B
13400 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50  TREE || eType==P
13410 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
13420 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43 68  {.    rc = setCh
13430 69 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50 61  ildPtrmaps(pDbPa
13440 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
13450 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13460 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
13470 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
13480 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20    Pgno nextOvfl 
13490 3d 20 67 65 74 34 62 79 74 65 28 70 44 62 50 61  = get4byte(pDbPa
134a0 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  ge->aData);.    
134b0 69 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20  if( nextOvfl!=0 
134c0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74  ){.      rc = pt
134d0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6e 65 78  rmapPut(pBt, nex
134e0 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56  tOvfl, PTRMAP_OV
134f0 45 52 46 4c 4f 57 32 2c 20 69 46 72 65 65 50 61  ERFLOW2, iFreePa
13500 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
13510 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
13520 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
13530 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
13540 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74  .  }..  /* Fix t
13550 68 65 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e  he database poin
13560 74 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72  ter on page iPtr
13570 50 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65  Page that pointe
13580 64 20 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a  d at iDbPage so.
13590 20 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69    ** that it poi
135a0 6e 74 73 20 61 74 20 69 46 72 65 65 50 61 67 65  nts at iFreePage
135b0 2e 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70  . Also fix the p
135c0 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
135d0 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61   for.  ** iPtrPa
135e0 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ge..  */.  if( e
135f0 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type!=PTRMAP_ROO
13600 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20  TPAGE ){.    rc 
13610 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c 20 69  = getPage(pBt, i
13620 50 74 72 50 61 67 65 2c 20 26 70 50 74 72 50 61  PtrPage, &pPtrPa
13630 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
13640 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13650 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
13660 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
13670 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
13680 28 70 50 74 72 50 61 67 65 2d 3e 61 44 61 74 61  (pPtrPage->aData
13690 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
136a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
136b0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
136c0 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72  trPage);.      r
136d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
136e0 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50      rc = modifyP
136f0 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50  agePointer(pPtrP
13700 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46  age, iDbPage, iF
13710 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b  reePage, eType);
13720 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
13730 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  (pPtrPage);.    
13740 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
13750 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
13760 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69  ptrmapPut(pBt, i
13770 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c  FreePage, eType,
13780 20 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20   iPtrPage);.    
13790 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
137a0 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  c;.}../* Forward
137b0 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71   declaration req
137c0 75 69 72 65 64 20 62 79 20 61 75 74 6f 56 61 63  uired by autoVac
137d0 75 75 6d 43 6f 6d 6d 69 74 28 29 2e 20 2a 2f 0a  uumCommit(). */.
137e0 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
137f0 61 74 65 50 61 67 65 28 42 74 53 68 61 72 65 64  atePage(BtShared
13800 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20   *, MemPage **, 
13810 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38  Pgno *, Pgno, u8
13820 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  );../*.** This r
13830 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
13840 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65   prior to sqlite
13850 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74 20 77 68  3pager_commit wh
13860 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
13870 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 65 64 20  .** is commited 
13880 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  for an auto-vacu
13890 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  um database..*/.
138a0 73 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56  static int autoV
138b0 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68  acuumCommit(BtSh
138c0 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
138d0 2a 6e 54 72 75 6e 63 29 7b 0a 20 20 50 61 67 65  *nTrunc){.  Page
138e0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d  r *pPager = pBt-
138f0 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20  >pPager;.  Pgno 
13900 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20  nFreeList;      
13910 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
13920 6f 66 20 70 61 67 65 73 20 72 65 6d 61 69 6e 69  of pages remaini
13930 6e 67 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  ng on the free-l
13940 69 73 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  ist. */.  int nP
13950 74 72 4d 61 70 3b 20 20 20 20 20 20 20 20 20 20  trMap;          
13960 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
13970 66 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  f pointer-map pa
13980 67 65 73 20 64 65 61 6c 6c 6f 63 61 74 65 64 20  ges deallocated 
13990 2a 2f 0a 20 20 50 67 6e 6f 20 6f 72 69 67 53 69  */.  Pgno origSi
139a0 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
139b0 2f 2a 20 50 61 67 65 73 20 69 6e 20 74 68 65 20  /* Pages in the 
139c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
139d0 0a 20 20 50 67 6e 6f 20 66 69 6e 53 69 7a 65 3b  .  Pgno finSize;
139e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
139f0 20 50 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   Pages in the da
13a00 74 61 62 61 73 65 20 66 69 6c 65 20 61 66 74 65  tabase file afte
13a10 72 20 74 72 75 6e 63 61 74 69 6f 6e 20 2a 2f 0a  r truncation */.
13a20 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
13a30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13a40 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
13a50 20 75 38 20 65 54 79 70 65 3b 0a 20 20 69 6e 74   u8 eType;.  int
13a60 20 70 67 73 7a 20 3d 20 70 42 74 2d 3e 70 61 67   pgsz = pBt->pag
13a70 65 53 69 7a 65 3b 20 20 2f 2a 20 50 61 67 65 20  eSize;  /* Page 
13a80 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 64 61  size for this da
13a90 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 67 6e 6f  tabase */.  Pgno
13aa0 20 69 44 62 50 61 67 65 3b 20 20 20 20 20 20 20   iDbPage;       
13ab0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
13ac0 74 61 62 61 73 65 20 70 61 67 65 20 74 6f 20 6d  tabase page to m
13ad0 6f 76 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ove */.  MemPage
13ae0 20 2a 70 44 62 4d 65 6d 50 61 67 65 20 3d 20 30   *pDbMemPage = 0
13af0 3b 20 20 20 2f 2a 20 22 22 20 2a 2f 0a 20 20 50  ;   /* "" */.  P
13b00 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 20 20 20  gno iPtrPage;   
13b10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
13b20 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
13b30 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ins a pointer to
13b40 20 69 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   iDbPage */.  Pg
13b50 6e 6f 20 69 46 72 65 65 50 61 67 65 3b 20 20 20  no iFreePage;   
13b60 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
13b70 66 72 65 65 2d 6c 69 73 74 20 70 61 67 65 20 74  free-list page t
13b80 6f 20 6d 6f 76 65 20 69 44 62 50 61 67 65 20 74  o move iDbPage t
13b90 6f 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  o */.  MemPage *
13ba0 70 46 72 65 65 4d 65 6d 50 61 67 65 20 3d 20 30  pFreeMemPage = 0
13bb0 3b 20 2f 2a 20 22 22 20 2a 2f 0a 0a 23 69 66 6e  ; /* "" */..#ifn
13bc0 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69 6e 74  def NDEBUG.  int
13bd0 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 70   nRef = sqlite3p
13be0 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 28 70 50  ager_refcount(pP
13bf0 61 67 65 72 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  ager);.#endif.. 
13c00 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75   assert( pBt->au
13c10 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69 66  toVacuum );.  if
13c20 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
13c30 70 42 74 2c 20 73 71 6c 69 74 65 33 70 61 67 65  pBt, sqlite3page
13c40 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67  r_pagecount(pPag
13c50 65 72 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75  er)) ){.    retu
13c60 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
13c70 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
13c80 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
13c90 20 6d 61 6e 79 20 66 72 65 65 2d 70 61 67 65 73   many free-pages
13ca0 20 61 72 65 20 69 6e 20 74 68 65 20 64 61 74 61   are in the data
13cb0 62 61 73 65 2e 20 49 66 20 74 68 65 72 65 20 61  base. If there a
13cc0 72 65 20 6e 6f 0a 20 20 2a 2a 20 66 72 65 65 20  re no.  ** free 
13cd0 70 61 67 65 73 2c 20 74 68 65 6e 20 61 75 74 6f  pages, then auto
13ce0 2d 76 61 63 75 75 6d 20 69 73 20 61 20 6e 6f 2d  -vacuum is a no-
13cf0 6f 70 2e 0a 20 20 2a 2f 0a 20 20 6e 46 72 65 65  op..  */.  nFree
13d00 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28  List = get4byte(
13d10 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
13d20 61 74 61 5b 33 36 5d 29 3b 0a 20 20 69 66 28 20  ata[36]);.  if( 
13d30 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a  nFreeList==0 ){.
13d40 20 20 20 20 2a 6e 54 72 75 6e 63 20 3d 20 30 3b      *nTrunc = 0;
13d50 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13d60 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
13d70 20 54 68 69 73 20 62 6c 6f 63 6b 20 66 69 67 75   This block figu
13d80 72 65 73 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  res out how many
13d90 20 70 61 67 65 73 20 74 68 65 72 65 20 61 72 65   pages there are
13da0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
13db0 0a 20 20 2a 2a 20 6e 6f 77 20 28 76 61 72 69 61  .  ** now (varia
13dc0 62 6c 65 20 6f 72 69 67 53 69 7a 65 29 2c 20 61  ble origSize), a
13dd0 6e 64 20 68 6f 77 20 6d 61 6e 79 20 74 68 65 72  nd how many ther
13de0 65 20 77 69 6c 6c 20 62 65 20 61 66 74 65 72 20  e will be after 
13df0 74 68 65 0a 20 20 2a 2a 20 74 72 75 6e 63 61 74  the.  ** truncat
13e00 69 6f 6e 20 28 76 61 72 69 61 62 6c 65 20 66 69  ion (variable fi
13e10 6e 53 69 7a 65 29 2e 0a 20 20 2a 2a 0a 20 20 2a  nSize)..  **.  *
13e20 2a 20 54 68 65 20 66 69 6e 61 6c 20 73 69 7a 65  * The final size
13e30 20 69 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   is the original
13e40 20 73 69 7a 65 2c 20 6c 65 73 73 20 74 68 65 20   size, less the 
13e50 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 70  number of free p
13e60 61 67 65 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65  ages.  ** in the
13e70 20 64 61 74 61 62 61 73 65 2c 20 6c 65 73 73 20   database, less 
13e80 61 6e 79 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  any pointer-map 
13e90 70 61 67 65 73 20 74 68 61 74 20 77 69 6c 6c 20  pages that will 
13ea0 6e 6f 20 6c 6f 6e 67 65 72 0a 20 20 2a 2a 20 62  no longer.  ** b
13eb0 65 20 72 65 71 75 69 72 65 64 2c 20 6c 65 73 73  e required, less
13ec0 20 31 20 69 66 20 74 68 65 20 70 65 6e 64 69 6e   1 if the pendin
13ed0 67 2d 62 79 74 65 20 70 61 67 65 20 77 61 73 20  g-byte page was 
13ee0 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
13ef0 62 61 73 65 0a 20 20 2a 2a 20 62 75 74 20 69 73  base.  ** but is
13f00 20 6e 6f 74 20 61 66 74 65 72 20 74 68 65 20 74   not after the t
13f10 72 75 6e 63 61 74 69 6f 6e 2e 0a 20 20 2a 2a 2f  runcation..  **/
13f20 0a 20 20 6f 72 69 67 53 69 7a 65 20 3d 20 73 71  .  origSize = sq
13f30 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63  lite3pager_pagec
13f40 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20  ount(pPager);.  
13f50 69 66 28 20 6f 72 69 67 53 69 7a 65 3d 3d 50 45  if( origSize==PE
13f60 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
13f70 70 42 74 29 20 29 7b 0a 20 20 20 20 6f 72 69 67  pBt) ){.    orig
13f80 53 69 7a 65 2d 2d 3b 0a 20 20 7d 0a 20 20 6e 50  Size--;.  }.  nP
13f90 74 72 4d 61 70 20 3d 20 28 6e 46 72 65 65 4c 69  trMap = (nFreeLi
13fa0 73 74 2d 6f 72 69 67 53 69 7a 65 2b 50 54 52 4d  st-origSize+PTRM
13fb0 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6f  AP_PAGENO(pBt, o
13fc0 72 69 67 53 69 7a 65 29 2b 70 67 73 7a 2f 35 29  rigSize)+pgsz/5)
13fd0 2f 28 70 67 73 7a 2f 35 29 3b 0a 20 20 66 69 6e  /(pgsz/5);.  fin
13fe0 53 69 7a 65 20 3d 20 6f 72 69 67 53 69 7a 65 20  Size = origSize 
13ff0 2d 20 6e 46 72 65 65 4c 69 73 74 20 2d 20 6e 50  - nFreeList - nP
14000 74 72 4d 61 70 3b 0a 20 20 69 66 28 20 6f 72 69  trMap;.  if( ori
14010 67 53 69 7a 65 3e 50 45 4e 44 49 4e 47 5f 42 59  gSize>PENDING_BY
14020 54 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20  TE_PAGE(pBt) && 
14030 66 69 6e 53 69 7a 65 3c 3d 50 45 4e 44 49 4e 47  finSize<=PENDING
14040 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
14050 29 7b 0a 20 20 20 20 66 69 6e 53 69 7a 65 2d 2d  ){.    finSize--
14060 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 50  ;.  }.  while( P
14070 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
14080 2c 20 66 69 6e 53 69 7a 65 29 20 7c 7c 20 66 69  , finSize) || fi
14090 6e 53 69 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f 42  nSize==PENDING_B
140a0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
140b0 0a 20 20 20 20 66 69 6e 53 69 7a 65 2d 2d 3b 0a  .    finSize--;.
140c0 20 20 7d 0a 20 20 54 52 41 43 45 28 28 22 41 55    }.  TRACE(("AU
140d0 54 4f 56 41 43 55 55 4d 3a 20 42 65 67 69 6e 20  TOVACUUM: Begin 
140e0 28 64 62 20 73 69 7a 65 20 25 64 2d 3e 25 64 29  (db size %d->%d)
140f0 5c 6e 22 2c 20 6f 72 69 67 53 69 7a 65 2c 20 66  \n", origSize, f
14100 69 6e 53 69 7a 65 29 29 3b 0a 0a 20 20 2f 2a 20  inSize));..  /* 
14110 56 61 72 69 61 62 6c 65 20 27 66 69 6e 53 69 7a  Variable 'finSiz
14120 65 27 20 77 69 6c 6c 20 62 65 20 74 68 65 20 73  e' will be the s
14130 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
14140 69 6e 20 70 61 67 65 73 20 61 66 74 65 72 0a 20  in pages after. 
14150 20 2a 2a 20 74 68 65 20 61 75 74 6f 2d 76 61 63   ** the auto-vac
14160 75 75 6d 20 68 61 73 20 63 6f 6d 70 6c 65 74 65  uum has complete
14170 64 20 28 74 68 65 20 63 75 72 72 65 6e 74 20 66  d (the current f
14180 69 6c 65 20 73 69 7a 65 20 6d 69 6e 75 73 20 74  ile size minus t
14190 68 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f  he number.  ** o
141a0 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  f pages on the f
141b0 72 65 65 20 6c 69 73 74 29 2e 20 4c 6f 6f 70 20  ree list). Loop 
141c0 74 68 72 6f 75 67 68 20 74 68 65 20 70 61 67 65  through the page
141d0 73 20 74 68 61 74 20 6c 69 65 20 62 65 79 6f 6e  s that lie beyon
141e0 64 0a 20 20 2a 2a 20 74 68 69 73 20 6d 61 72 6b  d.  ** this mark
141f0 2c 20 61 6e 64 20 69 66 20 74 68 65 79 20 61 72  , and if they ar
14200 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 6e  e not already on
14210 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2c 20   the free list, 
14220 6d 6f 76 65 20 74 68 65 6d 0a 20 20 2a 2a 20 74  move them.  ** t
14230 6f 20 61 20 66 72 65 65 20 70 61 67 65 20 65 61  o a free page ea
14240 72 6c 69 65 72 20 69 6e 20 74 68 65 20 66 69 6c  rlier in the fil
14250 65 20 28 73 6f 6d 65 77 68 65 72 65 20 62 65 66  e (somewhere bef
14260 6f 72 65 20 66 69 6e 53 69 7a 65 29 2e 0a 20 20  ore finSize)..  
14270 2a 2f 0a 20 20 66 6f 72 28 20 69 44 62 50 61 67  */.  for( iDbPag
14280 65 3d 66 69 6e 53 69 7a 65 2b 31 3b 20 69 44 62  e=finSize+1; iDb
14290 50 61 67 65 3c 3d 6f 72 69 67 53 69 7a 65 3b 20  Page<=origSize; 
142a0 69 44 62 50 61 67 65 2b 2b 20 29 7b 0a 20 20 20  iDbPage++ ){.   
142b0 20 2f 2a 20 49 66 20 69 44 62 50 61 67 65 20 69   /* If iDbPage i
142c0 73 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  s a pointer map 
142d0 70 61 67 65 2c 20 6f 72 20 74 68 65 20 70 65 6e  page, or the pen
142e0 64 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2c 20  ding-byte page, 
142f0 73 6b 69 70 20 69 74 2e 20 2a 2f 0a 20 20 20 20  skip it. */.    
14300 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  if( PTRMAP_ISPAG
14310 45 28 70 42 74 2c 20 69 44 62 50 61 67 65 29 20  E(pBt, iDbPage) 
14320 7c 7c 20 69 44 62 50 61 67 65 3d 3d 50 45 4e 44  || iDbPage==PEND
14330 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
14340 74 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74  t) ){.      cont
14350 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  inue;.    }..   
14360 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
14370 70 42 74 2c 20 69 44 62 50 61 67 65 2c 20 26 65  pBt, iDbPage, &e
14380 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29  Type, &iPtrPage)
14390 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
143a0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61  LITE_OK ) goto a
143b0 75 74 6f 76 61 63 75 75 6d 5f 6f 75 74 3b 0a 20  utovacuum_out;. 
143c0 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
143d0 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
143e0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
143f0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
14400 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 75 74 6f  .      goto auto
14410 76 61 63 75 75 6d 5f 6f 75 74 3b 0a 20 20 20 20  vacuum_out;.    
14420 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 69 44 62  }..    /* If iDb
14430 50 61 67 65 20 69 73 20 66 72 65 65 2c 20 64 6f  Page is free, do
14440 20 6e 6f 74 20 73 77 61 70 20 69 74 2e 20 20 2a   not swap it.  *
14450 2f 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  /.    if( eType=
14460 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45  =PTRMAP_FREEPAGE
14470 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   ){.      contin
14480 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ue;.    }.    rc
14490 20 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c 20   = getPage(pBt, 
144a0 69 44 62 50 61 67 65 2c 20 26 70 44 62 4d 65 6d  iDbPage, &pDbMem
144b0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
144c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
144d0 6f 74 6f 20 61 75 74 6f 76 61 63 75 75 6d 5f 6f  oto autovacuum_o
144e0 75 74 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64  ut;..    /* Find
144f0 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
14500 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
14510 74 68 61 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  that is not alre
14520 61 64 79 20 61 74 20 74 68 65 20 65 6e 64 20 0a  ady at the end .
14530 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
14540 6c 65 2e 20 41 20 70 61 67 65 20 63 61 6e 20 62  le. A page can b
14550 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65  e pulled off the
14560 20 66 72 65 65 20 6c 69 73 74 20 75 73 69 6e 67   free list using
14570 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 61 6c 6c   the .    ** all
14580 6f 63 61 74 65 50 61 67 65 28 29 20 72 6f 75 74  ocatePage() rout
14590 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ine..    */.    
145a0 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46  do{.      if( pF
145b0 72 65 65 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20  reeMemPage ){.  
145c0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
145d0 65 28 70 46 72 65 65 4d 65 6d 50 61 67 65 29 3b  e(pFreeMemPage);
145e0 0a 20 20 20 20 20 20 20 20 70 46 72 65 65 4d 65  .        pFreeMe
145f0 6d 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  mPage = 0;.     
14600 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c   }.      rc = al
14610 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20  locatePage(pBt, 
14620 26 70 46 72 65 65 4d 65 6d 50 61 67 65 2c 20 26  &pFreeMemPage, &
14630 69 46 72 65 65 50 61 67 65 2c 20 30 2c 20 30 29  iFreePage, 0, 0)
14640 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
14650 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14660 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
14670 28 70 44 62 4d 65 6d 50 61 67 65 29 3b 0a 20 20  (pDbMemPage);.  
14680 20 20 20 20 20 20 67 6f 74 6f 20 61 75 74 6f 76        goto autov
14690 61 63 75 75 6d 5f 6f 75 74 3b 0a 20 20 20 20 20  acuum_out;.     
146a0 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
146b0 20 69 46 72 65 65 50 61 67 65 3c 3d 6f 72 69 67   iFreePage<=orig
146c0 53 69 7a 65 20 29 3b 0a 20 20 20 20 7d 77 68 69  Size );.    }whi
146d0 6c 65 28 20 69 46 72 65 65 50 61 67 65 3e 66 69  le( iFreePage>fi
146e0 6e 53 69 7a 65 20 29 3b 0a 20 20 20 20 72 65 6c  nSize );.    rel
146f0 65 61 73 65 50 61 67 65 28 70 46 72 65 65 4d 65  easePage(pFreeMe
14700 6d 50 61 67 65 29 3b 0a 20 20 20 20 70 46 72 65  mPage);.    pFre
14710 65 4d 65 6d 50 61 67 65 20 3d 20 30 3b 0a 0a 20  eMemPage = 0;.. 
14720 20 20 20 2f 2a 20 52 65 6c 6f 63 61 74 65 20 74     /* Relocate t
14730 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  he page into the
14740 20 62 6f 64 79 20 6f 66 20 74 68 65 20 66 69 6c   body of the fil
14750 65 2e 20 4e 6f 74 65 20 74 68 61 74 20 61 6c 74  e. Note that alt
14760 68 6f 75 67 68 20 74 68 65 20 0a 20 20 20 20 2a  hough the .    *
14770 2a 20 70 61 67 65 20 68 61 73 20 6d 6f 76 65 64  * page has moved
14780 20 77 69 74 68 69 6e 20 74 68 65 20 64 61 74 61   within the data
14790 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 20 70  base file, the p
147a0 44 62 4d 65 6d 50 61 67 65 20 70 6f 69 6e 74 65  DbMemPage pointe
147b0 72 20 0a 20 20 20 20 2a 2a 20 72 65 6d 61 69 6e  r .    ** remain
147c0 73 20 76 61 6c 69 64 2e 20 54 68 69 73 20 6d 65  s valid. This me
147d0 61 6e 73 20 74 68 61 74 20 74 68 69 73 20 66 75  ans that this fu
147e0 6e 63 74 69 6f 6e 20 63 61 6e 20 72 75 6e 20 77  nction can run w
147f0 69 74 68 6f 75 74 0a 20 20 20 20 2a 2a 20 69 6e  ithout.    ** in
14800 76 61 6c 69 64 61 74 69 6e 67 20 63 75 72 73 6f  validating curso
14810 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62  rs open on the b
14820 74 72 65 65 2e 20 54 68 69 73 20 69 73 20 69 6d  tree. This is im
14830 70 6f 72 74 61 6e 74 20 69 6e 20 0a 20 20 20 20  portant in .    
14840 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
14850 6d 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  mode..    */.   
14860 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61   rc = relocatePa
14870 67 65 28 70 42 74 2c 20 70 44 62 4d 65 6d 50 61  ge(pBt, pDbMemPa
14880 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50  ge, eType, iPtrP
14890 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 29 3b  age, iFreePage);
148a0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
148b0 28 70 44 62 4d 65 6d 50 61 67 65 29 3b 0a 20 20  (pDbMemPage);.  
148c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
148d0 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 75 74 6f 76  _OK ) goto autov
148e0 61 63 75 75 6d 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  acuum_out;.  }..
148f0 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20    /* The entire 
14900 66 72 65 65 2d 6c 69 73 74 20 68 61 73 20 62 65  free-list has be
14910 65 6e 20 73 77 61 70 70 65 64 20 74 6f 20 74 68  en swapped to th
14920 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
14930 65 2e 20 53 6f 0a 20 20 2a 2a 20 74 72 75 6e 63  e. So.  ** trunc
14940 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
14950 20 66 69 6c 65 20 74 6f 20 66 69 6e 53 69 7a 65   file to finSize
14960 20 70 61 67 65 73 20 61 6e 64 20 63 6f 6e 73 69   pages and consi
14970 64 65 72 20 74 68 65 0a 20 20 2a 2a 20 66 72 65  der the.  ** fre
14980 65 2d 6c 69 73 74 20 65 6d 70 74 79 2e 0a 20 20  e-list empty..  
14990 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
149a0 33 70 61 67 65 72 5f 77 72 69 74 65 28 70 42 74  3pager_write(pBt
149b0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29  ->pPage1->aData)
149c0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
149d0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 75 74  TE_OK ) goto aut
149e0 6f 76 61 63 75 75 6d 5f 6f 75 74 3b 0a 20 20 70  ovacuum_out;.  p
149f0 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
14a00 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
14a10 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28   0);.  put4byte(
14a20 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
14a30 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 2a  ata[36], 0);.  *
14a40 6e 54 72 75 6e 63 20 3d 20 66 69 6e 53 69 7a 65  nTrunc = finSize
14a50 3b 0a 20 20 61 73 73 65 72 74 28 20 66 69 6e 53  ;.  assert( finS
14a60 69 7a 65 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ize!=PENDING_BYT
14a70 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a  E_PAGE(pBt) );..
14a80 61 75 74 6f 76 61 63 75 75 6d 5f 6f 75 74 3a 0a  autovacuum_out:.
14a90 20 20 61 73 73 65 72 74 28 20 6e 52 65 66 3d 3d    assert( nRef==
14aa0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65 66  sqlite3pager_ref
14ab0 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b  count(pPager) );
14ac0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
14ad0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
14ae0 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
14af0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  k(pPager);.  }. 
14b00 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
14b10 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  ndif../*.** Comm
14b20 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
14b30 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  on currently in 
14b40 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20  progress..**.** 
14b50 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73  This will releas
14b60 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
14b70 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
14b80 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
14b90 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
14ba0 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c  e cursors, it al
14bb0 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20  so releases the 
14bc0 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e  read lock..*/.in
14bd0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
14be0 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a  mmit(Btree *p){.
14bf0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
14c00 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 62 74 72  = p->pBt;..  btr
14c10 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
14c20 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e  .  /* If the han
14c30 64 6c 65 20 68 61 73 20 61 20 77 72 69 74 65 2d  dle has a write-
14c40 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
14c50 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61  , commit the sha
14c60 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a  red-btrees .  **
14c70 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
14c80 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20   set the shared 
14c90 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52  state to TRANS_R
14ca0 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  EAD..  */.  if( 
14cb0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
14cc0 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69  S_WRITE ){.    i
14cd0 6e 74 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72  nt rc;.    asser
14ce0 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
14cf0 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
14d00 54 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  TE );.    assert
14d10 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74  ( pBt->nTransact
14d20 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20  ion>0 );.    rc 
14d30 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63  = sqlite3pager_c
14d40 6f 6d 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65  ommit(pBt->pPage
14d50 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
14d60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14d70 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
14d80 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54    }.    pBt->inT
14d90 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41  ransaction = TRA
14da0 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 70 42 74  NS_READ;.    pBt
14db0 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
14dc0 7d 0a 20 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62  }.  unlockAllTab
14dd0 6c 65 73 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  les(p);..  /* If
14de0 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20   the handle has 
14df0 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e  any kind of tran
14e00 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65  saction open, de
14e10 63 72 65 6d 65 6e 74 20 74 68 65 20 74 72 61 6e  crement the tran
14e20 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 63 6f 75  saction.  ** cou
14e30 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72 65 64  nt of the shared
14e40 20 62 74 72 65 65 2e 20 49 66 20 74 68 65 20 74   btree. If the t
14e50 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
14e60 20 72 65 61 63 68 65 73 20 30 2c 20 73 65 74 0a   reaches 0, set.
14e70 20 20 2a 2a 20 74 68 65 20 73 68 61 72 65 64 20    ** the shared 
14e80 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e  state to TRANS_N
14e90 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42  ONE. The unlockB
14ea0 74 72 65 65 49 66 55 6e 75 73 65 64 28 29 20 63  treeIfUnused() c
14eb0 61 6c 6c 20 62 65 6c 6f 77 0a 20 20 2a 2a 20 77  all below.  ** w
14ec0 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70  ill unlock the p
14ed0 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ager..  */.  if(
14ee0 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41   p->inTrans!=TRA
14ef0 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 70  NS_NONE ){.    p
14f00 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
14f10 2d 2d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 70  --;.    if( 0==p
14f20 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
14f30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69   ){.      pBt->i
14f40 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
14f50 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d  RANS_NONE;.    }
14f60 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
14f70 68 65 20 68 61 6e 64 6c 65 73 20 63 75 72 72 65  he handles curre
14f80 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  nt transaction s
14f90 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f  tate to TRANS_NO
14fa0 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 0a 20 20  NE and unlock.  
14fb0 2a 2a 20 74 68 65 20 70 61 67 65 72 20 69 66 20  ** the pager if 
14fc0 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64  this call closed
14fd0 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f   the only read o
14fe0 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
14ff0 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69  ion..  */.  p->i
15000 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
15010 4f 4e 45 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72  ONE;.  unlockBtr
15020 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
15030 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ..  btreeIntegri
15040 74 79 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ty(p);.  return 
15050 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
15060 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a  fndef NDEBUG./*.
15070 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
15080 6d 62 65 72 20 6f 66 20 77 72 69 74 65 2d 63 75  mber of write-cu
15090 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68  rsors open on th
150a0 69 73 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20  is handle. This 
150b0 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e  is for use.** in
150c0 20 61 73 73 65 72 74 28 29 20 65 78 70 72 65 73   assert() expres
150d0 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20  sions, so it is 
150e0 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66  only compiled if
150f0 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a   NDEBUG is not.*
15100 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  * defined..*/.st
15110 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 57 72  atic int countWr
15120 69 74 65 43 75 72 73 6f 72 73 28 42 74 53 68 61  iteCursors(BtSha
15130 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43  red *pBt){.  BtC
15140 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69  ursor *pCur;.  i
15150 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28  nt r = 0;.  for(
15160 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f  pCur=pBt->pCurso
15170 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43  r; pCur; pCur=pC
15180 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ur->pNext){.    
15190 69 66 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67  if( pCur->wrFlag
151a0 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72   ) r++; .  }.  r
151b0 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69  eturn r;.}.#endi
151c0 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  f..#if defined(S
151d0 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20 64  QLITE_TEST) && d
151e0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
151f0 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  BUG)./*.** Print
15200 20 64 65 62 75 67 67 69 6e 67 20 69 6e 66 6f 72   debugging infor
15210 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c 6c  mation about all
15220 20 63 75 72 73 6f 72 73 20 74 6f 20 73 74 61 6e   cursors to stan
15230 64 61 72 64 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a  dard output..*/.
15240 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
15250 65 43 75 72 73 6f 72 4c 69 73 74 28 42 74 72 65  eCursorList(Btre
15260 65 20 2a 70 29 7b 0a 20 20 42 74 43 75 72 73 6f  e *p){.  BtCurso
15270 72 20 2a 70 43 75 72 3b 0a 20 20 42 74 53 68 61  r *pCur;.  BtSha
15280 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
15290 74 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42  t;.  for(pCur=pB
152a0 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72  t->pCursor; pCur
152b0 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65  ; pCur=pCur->pNe
152c0 78 74 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65  xt){.    MemPage
152d0 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
152e0 70 50 61 67 65 3b 0a 20 20 20 20 63 68 61 72 20  pPage;.    char 
152f0 2a 7a 4d 6f 64 65 20 3d 20 70 43 75 72 2d 3e 77  *zMode = pCur->w
15300 72 46 6c 61 67 20 3f 20 22 72 77 22 20 3a 20 22  rFlag ? "rw" : "
15310 72 6f 22 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ro";.    sqlite3
15320 44 65 62 75 67 50 72 69 6e 74 66 28 22 43 55 52  DebugPrintf("CUR
15330 53 4f 52 20 25 70 20 72 6f 6f 74 65 64 20 61 74  SOR %p rooted at
15340 20 25 34 64 28 25 73 29 20 63 75 72 72 65 6e 74   %4d(%s) current
15350 6c 79 20 61 74 20 25 64 2e 25 64 25 73 5c 6e 22  ly at %d.%d%s\n"
15360 2c 0a 20 20 20 20 20 20 20 70 43 75 72 2c 20 70  ,.       pCur, p
15370 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 7a  Cur->pgnoRoot, z
15380 4d 6f 64 65 2c 0a 20 20 20 20 20 20 20 70 50 61  Mode,.       pPa
15390 67 65 20 3f 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ge ? pPage->pgno
153a0 20 3a 20 30 2c 20 70 43 75 72 2d 3e 69 64 78 2c   : 0, pCur->idx,
153b0 0a 20 20 20 20 20 20 20 28 70 43 75 72 2d 3e 65  .       (pCur->e
153c0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
153d0 4c 49 44 29 20 3f 20 22 22 20 3a 20 22 20 65 6f  LID) ? "" : " eo
153e0 66 22 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a  f".    );.  }.}.
153f0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 6f  #endif../*.** Ro
15400 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  llback the trans
15410 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65  action in progre
15420 73 73 2e 20 20 41 6c 6c 20 63 75 72 73 6f 72 73  ss.  All cursors
15430 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76 61   will be.** inva
15440 6c 69 64 65 64 20 62 79 20 74 68 69 73 20 6f 70  lided by this op
15450 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74  eration.  Any at
15460 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 63  tempt to use a c
15470 75 72 73 6f 72 0a 2a 2a 20 74 68 61 74 20 77 61  ursor.** that wa
15480 73 20 6f 70 65 6e 20 61 74 20 74 68 65 20 62 65  s open at the be
15490 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73 20  ginning of this 
154a0 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20 72  operation will r
154b0 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 65  esult.** in an e
154c0 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rror..**.** This
154d0 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68   will release th
154e0 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
154f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
15500 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  e.  If there.** 
15510 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75  are no active cu
15520 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72  rsors, it also r
15530 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64  eleases the read
15540 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   lock..*/.int sq
15550 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
15560 63 6b 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ck(Btree *p){.  
15570 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
15580 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
15590 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
155a0 67 65 31 3b 0a 0a 20 20 72 63 20 3d 20 73 61 76  ge1;..  rc = sav
155b0 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
155c0 20 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20   0, 0);.#ifndef 
155d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
155e0 45 44 5f 43 41 43 48 45 0a 20 20 69 66 28 20 72  ED_CACHE.  if( r
155f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
15600 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61      /* This is a
15610 20 68 6f 72 72 69 62 6c 65 20 73 69 74 75 61 74   horrible situat
15620 69 6f 6e 2e 20 41 6e 20 49 4f 20 6f 72 20 6d 61  ion. An IO or ma
15630 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63  lloc() error occ
15640 75 72 65 64 20 77 68 69 6c 73 74 0a 20 20 20 20  ured whilst.    
15650 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 73 61 76  ** trying to sav
15660 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  e cursor positio
15670 6e 73 2e 20 49 66 20 74 68 69 73 20 69 73 20 61  ns. If this is a
15680 6e 20 61 75 74 6f 6d 61 74 69 63 20 72 6f 6c 6c  n automatic roll
15690 62 61 63 6b 20 28 61 73 0a 20 20 20 20 2a 2a 20  back (as.    ** 
156a0 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 61 20  the result of a 
156b0 63 6f 6e 73 74 72 61 69 6e 74 2c 20 6d 61 6c 6c  constraint, mall
156c0 6f 63 28 29 20 66 61 69 6c 75 72 65 20 6f 72 20  oc() failure or 
156d0 49 4f 20 65 72 72 6f 72 29 20 74 68 65 6e 20 0a  IO error) then .
156e0 20 20 20 20 2a 2a 20 74 68 65 20 63 61 63 68 65      ** the cache
156f0 20 6d 61 79 20 62 65 20 69 6e 74 65 72 6e 61 6c   may be internal
15700 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  ly inconsistent 
15710 28 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 76 61 6c  (not contain val
15720 69 64 20 74 72 65 65 73 29 20 73 6f 0a 20 20 20  id trees) so.   
15730 20 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 73 69   ** we cannot si
15740 6d 70 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20  mply return the 
15750 65 72 72 6f 72 20 74 6f 20 74 68 65 20 63 61 6c  error to the cal
15760 6c 65 72 2e 20 49 6e 73 74 65 61 64 2c 20 61 62  ler. Instead, ab
15770 6f 72 74 20 0a 20 20 20 20 2a 2a 20 61 6c 6c 20  ort .    ** all 
15780 71 75 65 72 69 65 73 20 74 68 61 74 20 6d 61 79  queries that may
15790 20 62 65 20 75 73 69 6e 67 20 61 6e 79 20 6f 66   be using any of
157a0 20 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61   the cursors tha
157b0 74 20 66 61 69 6c 65 64 20 74 6f 20 73 61 76 65  t failed to save
157c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69  ..    */.    whi
157d0 6c 65 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  le( pBt->pCursor
157e0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
157f0 33 20 2a 64 62 20 3d 20 70 42 74 2d 3e 70 43 75  3 *db = pBt->pCu
15800 72 73 6f 72 2d 3e 70 42 74 72 65 65 2d 3e 70 53  rsor->pBtree->pS
15810 71 6c 69 74 65 3b 0a 20 20 20 20 20 20 69 66 28  qlite;.      if(
15820 20 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73   db ){.        s
15830 71 6c 69 74 65 33 41 62 6f 72 74 4f 74 68 65 72  qlite3AbortOther
15840 41 63 74 69 76 65 56 64 62 65 73 28 64 62 2c 20  ActiveVdbes(db, 
15850 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
15860 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 62  }.  }.#endif.  b
15870 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
15880 3b 0a 20 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62  ;.  unlockAllTab
15890 6c 65 73 28 70 29 3b 0a 0a 20 20 69 66 28 20 70  les(p);..  if( p
158a0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
158b0 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e  _WRITE ){.    in
158c0 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65  t rc2;..    asse
158d0 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d  rt( TRANS_WRITE=
158e0 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  =pBt->inTransact
158f0 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d  ion );.    rc2 =
15900 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f   sqlite3pager_ro
15910 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67  llback(pBt->pPag
15920 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32  er);.    if( rc2
15930 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
15940 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20       rc = rc2;. 
15950 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
15960 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61   rollback may ha
15970 76 65 20 64 65 73 74 72 6f 79 65 64 20 74 68 65  ve destroyed the
15980 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76   pPage1->aData v
15990 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a  alue.  So.    **
159a0 20 63 61 6c 6c 20 67 65 74 50 61 67 65 28 29 20   call getPage() 
159b0 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69 6e 20  on page 1 again 
159c0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61  to make sure pPa
159d0 67 65 31 2d 3e 61 44 61 74 61 20 69 73 0a 20 20  ge1->aData is.  
159e0 20 20 2a 2a 20 73 65 74 20 63 6f 72 72 65 63 74    ** set correct
159f0 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 67  ly. */.    if( g
15a00 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26  etPage(pBt, 1, &
15a10 70 50 61 67 65 31 29 3d 3d 53 51 4c 49 54 45 5f  pPage1)==SQLITE_
15a20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  OK ){.      rele
15a30 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
15a40 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
15a50 74 28 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72  t( countWriteCur
15a60 73 6f 72 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a  sors(pBt)==0 );.
15a70 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
15a80 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52  action = TRANS_R
15a90 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  EAD;.  }..  if( 
15aa0 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  p->inTrans!=TRAN
15ab0 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 61 73  S_NONE ){.    as
15ac0 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e  sert( pBt->nTran
15ad0 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20  saction>0 );.   
15ae0 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
15af0 6f 6e 2d 2d 3b 0a 20 20 20 20 69 66 28 20 30 3d  on--;.    if( 0=
15b00 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69  =pBt->nTransacti
15b10 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  on ){.      pBt-
15b20 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
15b30 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20   TRANS_NONE;.   
15b40 20 7d 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 6e 54   }.  }..  p->inT
15b50 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  rans = TRANS_NON
15b60 45 3b 0a 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74  E;.  pBt->inStmt
15b70 20 3d 20 30 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74   = 0;.  unlockBt
15b80 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
15b90 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  ;..  btreeIntegr
15ba0 69 74 79 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ity(p);.  return
15bb0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74   rc;.}../*.** St
15bc0 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20  art a statement 
15bd0 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  subtransaction. 
15be0 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74   The subtransact
15bf0 69 6f 6e 20 63 61 6e 0a 2a 2a 20 63 61 6e 20 62  ion can.** can b
15c00 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e  e rolled back in
15c10 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74  dependently of t
15c20 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74  he main transact
15c30 69 6f 6e 2e 0a 2a 2a 20 59 6f 75 20 6d 75 73 74  ion..** You must
15c40 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63   start a transac
15c50 74 69 6f 6e 20 62 65 66 6f 72 65 20 73 74 61 72  tion before star
15c60 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61  ting a subtransa
15c70 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 73 75  ction..** The su
15c80 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  btransaction is 
15c90 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61  ended automatica
15ca0 6c 6c 79 20 69 66 20 74 68 65 20 6d 61 69 6e 20  lly if the main 
15cb0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 63  transaction.** c
15cc0 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20  ommits or rolls 
15cd0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  back..**.** Only
15ce0 20 6f 6e 65 20 73 75 62 74 72 61 6e 73 61 63 74   one subtransact
15cf0 69 6f 6e 20 6d 61 79 20 62 65 20 61 63 74 69 76  ion may be activ
15d00 65 20 61 74 20 61 20 74 69 6d 65 2e 20 20 49 74  e at a time.  It
15d10 20 69 73 20 61 6e 20 65 72 72 6f 72 20 74 6f 20   is an error to 
15d20 74 72 79 0a 2a 2a 20 74 6f 20 73 74 61 72 74 20  try.** to start 
15d30 61 20 6e 65 77 20 73 75 62 74 72 61 6e 73 61 63  a new subtransac
15d40 74 69 6f 6e 20 69 66 20 61 6e 6f 74 68 65 72 20  tion if another 
15d50 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  subtransaction i
15d60 73 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65  s already active
15d70 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e  ..**.** Statemen
15d80 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  t subtransaction
15d90 73 20 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e  s are used aroun
15da0 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c  d individual SQL
15db0 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74   statements.** t
15dc0 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65  hat are containe
15dd0 64 20 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e  d within a BEGIN
15de0 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e  ...COMMIT block.
15df0 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e    If a constrain
15e00 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72  t.** error occur
15e10 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61  s within the sta
15e20 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65  tement, the effe
15e30 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73  ct of that one s
15e40 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20  tatement.** can 
15e50 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77  be rolled back w
15e60 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
15e70 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e   rollback the en
15e80 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
15e90 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15ea0 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42  BtreeBeginStmt(B
15eb0 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
15ec0 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
15ed0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
15ee0 69 66 28 20 28 70 2d 3e 69 6e 54 72 61 6e 73 21  if( (p->inTrans!
15ef0 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 20 7c 7c  =TRANS_WRITE) ||
15f00 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 29 7b 0a   pBt->inStmt ){.
15f10 20 20 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e      return pBt->
15f20 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54  readOnly ? SQLIT
15f30 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c  E_READONLY : SQL
15f40 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
15f50 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
15f60 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
15f70 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 72 63  NS_WRITE );.  rc
15f80 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79   = pBt->readOnly
15f90 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73   ? SQLITE_OK : s
15fa0 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74  qlite3pager_stmt
15fb0 5f 62 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67  _begin(pBt->pPag
15fc0 65 72 29 3b 0a 20 20 70 42 74 2d 3e 69 6e 53 74  er);.  pBt->inSt
15fd0 6d 74 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e  mt = 1;.  return
15fe0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43   rc;.}.../*.** C
15ff0 6f 6d 6d 69 74 20 74 68 65 20 73 74 61 74 6d 65  ommit the statme
16000 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
16010 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70  n currently in p
16020 72 6f 67 72 65 73 73 2e 20 20 49 66 20 6e 6f 0a  rogress.  If no.
16030 2a 2a 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  ** subtransactio
16040 6e 20 69 73 20 61 63 74 69 76 65 2c 20 74 68 69  n is active, thi
16050 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  s is a no-op..*/
16060 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
16070 65 43 6f 6d 6d 69 74 53 74 6d 74 28 42 74 72 65  eCommitStmt(Btre
16080 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
16090 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
160a0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28   = p->pBt;.  if(
160b0 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 26 26 20   pBt->inStmt && 
160c0 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  !pBt->readOnly )
160d0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
160e0 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d  e3pager_stmt_com
160f0 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  mit(pBt->pPager)
16100 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
16110 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
16120 20 7d 0a 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74   }.  pBt->inStmt
16130 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
16140 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  c;.}../*.** Roll
16150 62 61 63 6b 20 74 68 65 20 61 63 74 69 76 65 20  back the active 
16160 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61  statement subtra
16170 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 6e 6f  nsaction.  If no
16180 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 0a   subtransaction.
16190 2a 2a 20 69 73 20 61 63 74 69 76 65 20 74 68 69  ** is active thi
161a0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
161b0 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  o-op..**.** All 
161c0 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 20  cursors will be 
161d0 69 6e 76 61 6c 69 64 61 74 65 64 20 62 79 20 74  invalidated by t
161e0 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  his operation.  
161f0 41 6e 79 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74  Any attempt.** t
16200 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72 20 74  o use a cursor t
16210 68 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74 20  hat was open at 
16220 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
16230 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 0a   this operation.
16240 2a 2a 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69  ** will result i
16250 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69  n an error..*/.i
16260 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  nt sqlite3BtreeR
16270 6f 6c 6c 62 61 63 6b 53 74 6d 74 28 42 74 72 65  ollbackStmt(Btre
16280 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20  e *p){.  int rc 
16290 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42  = SQLITE_OK;.  B
162a0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
162b0 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
162c0 4d 61 6c 6c 6f 63 44 69 73 61 6c 6c 6f 77 28 29  MallocDisallow()
162d0 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 53  ;.  if( pBt->inS
162e0 74 6d 74 20 26 26 20 21 70 42 74 2d 3e 72 65 61  tmt && !pBt->rea
162f0 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 63 20  dOnly ){.    rc 
16300 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  = sqlite3pager_s
16310 74 6d 74 5f 72 6f 6c 6c 62 61 63 6b 28 70 42 74  tmt_rollback(pBt
16320 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61  ->pPager);.    a
16330 73 73 65 72 74 28 20 63 6f 75 6e 74 57 72 69 74  ssert( countWrit
16340 65 43 75 72 73 6f 72 73 28 70 42 74 29 3d 3d 30  eCursors(pBt)==0
16350 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53   );.    pBt->inS
16360 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  tmt = 0;.  }.  s
16370 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 41 6c 6c 6f  qlite3MallocAllo
16380 77 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  w();.  return rc
16390 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75  ;.}../*.** Defau
163a0 6c 74 20 6b 65 79 20 63 6f 6d 70 61 72 69 73 6f  lt key compariso
163b0 6e 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65  n function to be
163c0 20 75 73 65 64 20 69 66 20 6e 6f 20 63 6f 6d 70   used if no comp
163d0 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 0a  arison function.
163e0 2a 2a 20 69 73 20 73 70 65 63 69 66 69 65 64 20  ** is specified 
163f0 6f 6e 20 74 68 65 20 73 71 6c 69 74 65 33 42 74  on the sqlite3Bt
16400 72 65 65 43 75 72 73 6f 72 28 29 20 63 61 6c 6c  reeCursor() call
16410 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16420 64 66 6c 74 43 6f 6d 70 61 72 65 28 0a 20 20 76  dfltCompare(.  v
16430 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20  oid *NotUsed,   
16440 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
16450 72 20 64 61 74 61 20 69 73 20 6e 6f 74 20 75 73  r data is not us
16460 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 31 2c 20  ed */.  int n1, 
16470 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 31 2c 20  const void *p1, 
16480 20 20 20 2f 2a 20 46 69 72 73 74 20 6b 65 79 20     /* First key 
16490 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20  to compare */.  
164a0 69 6e 74 20 6e 32 2c 20 63 6f 6e 73 74 20 76 6f  int n2, const vo
164b0 69 64 20 2a 70 32 20 20 20 20 20 2f 2a 20 53 65  id *p2     /* Se
164c0 63 6f 6e 64 20 6b 65 79 20 74 6f 20 63 6f 6d 70  cond key to comp
164d0 61 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  are */.){.  int 
164e0 63 3b 0a 20 20 63 20 3d 20 6d 65 6d 63 6d 70 28  c;.  c = memcmp(
164f0 70 31 2c 20 70 32 2c 20 6e 31 3c 6e 32 20 3f 20  p1, p2, n1<n2 ? 
16500 6e 31 20 3a 20 6e 32 29 3b 0a 20 20 69 66 28 20  n1 : n2);.  if( 
16510 63 3d 3d 30 20 29 7b 0a 20 20 20 20 63 20 3d 20  c==0 ){.    c = 
16520 6e 31 20 2d 20 6e 32 3b 0a 20 20 7d 0a 20 20 72  n1 - n2;.  }.  r
16530 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn c;.}../*.*
16540 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63  * Create a new c
16550 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54  ursor for the BT
16560 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69  ree whose root i
16570 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  s on the page.**
16580 20 69 54 61 62 6c 65 2e 20 20 54 68 65 20 61 63   iTable.  The ac
16590 74 20 6f 66 20 61 63 71 75 69 72 69 6e 67 20 61  t of acquiring a
165a0 20 63 75 72 73 6f 72 20 67 65 74 73 20 61 20 72   cursor gets a r
165b0 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a 20  ead lock on .** 
165c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
165d0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c  e..**.** If wrFl
165e0 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20  ag==0, then the 
165f0 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20  cursor can only 
16600 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64  be used for read
16610 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61  ing..** If wrFla
16620 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63  g==1, then the c
16630 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75 73 65  ursor can be use
16640 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72  d for reading or
16650 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20   for.** writing 
16660 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69  if other conditi
16670 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67 20  ons for writing 
16680 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54  are also met.  T
16690 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20  hese.** are the 
166a0 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20  conditions that 
166b0 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f  must be met in o
166c0 72 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e 67  rder for writing
166d0 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65   to.** be allowe
166e0 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65  d:.**.** 1:  The
166f0 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76   cursor must hav
16700 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69  e been opened wi
16710 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a  th wrFlag==1.**.
16720 2a 2a 20 32 3a 20 20 4e 6f 20 6f 74 68 65 72 20  ** 2:  No other 
16730 63 75 72 73 6f 72 73 20 6d 61 79 20 62 65 20 6f  cursors may be o
16740 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d  pen with wrFlag=
16750 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74  =0 on the same t
16760 61 62 6c 65 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54  able.**.** 3:  T
16770 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
16780 20 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f   be writable (no
16790 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d  t on read-only m
167a0 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20  edia).**.** 4:  
167b0 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e  There must be an
167c0 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74   active transact
167d0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 64 69  ion..**.** Condi
167e0 74 69 6f 6e 20 32 20 77 61 72 72 61 6e 74 73 20  tion 2 warrants 
167f0 66 75 72 74 68 65 72 20 64 69 73 63 75 73 73 69  further discussi
16800 6f 6e 2e 20 20 49 66 20 61 6e 79 20 63 75 72 73  on.  If any curs
16810 6f 72 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20  or is opened.** 
16820 6f 6e 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  on a table with 
16830 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68 61 74 20  wrFlag==0, that 
16840 70 72 65 76 65 6e 74 73 20 61 6c 6c 20 6f 74 68  prevents all oth
16850 65 72 20 63 75 72 73 6f 72 73 20 66 72 6f 6d 0a  er cursors from.
16860 2a 2a 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  ** writing to th
16870 61 74 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  at table.  This 
16880 69 73 20 61 20 6b 69 6e 64 20 6f 66 20 22 72 65  is a kind of "re
16890 61 64 2d 6c 6f 63 6b 22 2e 20 20 57 68 65 6e 20  ad-lock".  When 
168a0 61 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6f  a cursor.** is o
168b0 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61  pened with wrFla
168c0 67 3d 3d 30 20 69 74 20 69 73 20 67 75 61 72 61  g==0 it is guara
168d0 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20 74  nteed that the t
168e0 61 62 6c 65 20 77 69 6c 6c 20 6e 6f 74 0a 2a 2a  able will not.**
168f0 20 63 68 61 6e 67 65 20 61 73 20 6c 6f 6e 67 20   change as long 
16900 61 73 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  as the cursor is
16910 20 6f 70 65 6e 2e 20 20 54 68 69 73 20 61 6c 6c   open.  This all
16920 6f 77 73 20 74 68 65 20 63 75 72 73 6f 72 20 74  ows the cursor t
16930 6f 0a 2a 2a 20 64 6f 20 61 20 73 65 71 75 65 6e  o.** do a sequen
16940 74 69 61 6c 20 73 63 61 6e 20 6f 66 20 74 68 65  tial scan of the
16950 20 74 61 62 6c 65 20 77 69 74 68 6f 75 74 20 68   table without h
16960 61 76 69 6e 67 20 74 6f 20 77 6f 72 72 79 20 61  aving to worry a
16970 62 6f 75 74 0a 2a 2a 20 65 6e 74 72 69 65 73 20  bout.** entries 
16980 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20 6f  being inserted o
16990 72 20 64 65 6c 65 74 65 64 20 64 75 72 69 6e 67  r deleted during
169a0 20 74 68 65 20 73 63 61 6e 2e 20 20 43 75 72 73   the scan.  Curs
169b0 6f 72 73 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  ors should.** be
169c0 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46   opened with wrF
169d0 6c 61 67 3d 3d 30 20 6f 6e 6c 79 20 69 66 20 74  lag==0 only if t
169e0 68 69 73 20 72 65 61 64 2d 6c 6f 63 6b 20 70 72  his read-lock pr
169f0 6f 70 65 72 74 79 20 69 73 20 6e 65 65 64 65 64  operty is needed
16a00 2e 0a 2a 2a 20 54 68 61 74 20 69 73 20 74 6f 20  ..** That is to 
16a10 73 61 79 2c 20 63 75 72 73 6f 72 73 20 73 68 6f  say, cursors sho
16a20 75 6c 64 20 62 65 20 6f 70 65 6e 65 64 20 77 69  uld be opened wi
16a30 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 6c  th wrFlag==0 onl
16a40 79 20 69 66 20 74 68 65 79 0a 2a 2a 20 69 6e 74  y if they.** int
16a50 65 6e 64 20 74 6f 20 75 73 65 20 74 68 65 20 73  end to use the s
16a60 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
16a70 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20  ) system call.  
16a80 41 6c 6c 20 6f 74 68 65 72 20 63 75 72 73 6f 72  All other cursor
16a90 73 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 6f  s.** should be o
16aa0 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61  pened with wrFla
16ab0 67 3d 3d 31 20 65 76 65 6e 20 69 66 20 74 68 65  g==1 even if the
16ac0 79 20 6e 65 76 65 72 20 72 65 61 6c 6c 79 20 69  y never really i
16ad0 6e 74 65 6e 64 0a 2a 2a 20 74 6f 20 77 72 69 74  ntend.** to writ
16ae0 65 2e 0a 2a 2a 20 0a 2a 2a 20 4e 6f 20 63 68 65  e..** .** No che
16af0 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f  cking is done to
16b00 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
16b10 70 61 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c  page iTable real
16b20 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f  ly is the.** roo
16b30 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72  t page of a b-tr
16b40 65 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  ee.  If it is no
16b50 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  t, then the curs
16b60 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77  or acquired.** w
16b70 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72  ill not work cor
16b80 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  rectly..**.** Th
16b90 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  e comparison fun
16ba0 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6c 6f  ction must be lo
16bb0 67 69 63 61 6c 6c 79 20 74 68 65 20 73 61 6d 65  gically the same
16bc0 20 66 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f   for every curso
16bd0 72 0a 2a 2a 20 6f 6e 20 61 20 70 61 72 74 69 63  r.** on a partic
16be0 75 6c 61 72 20 74 61 62 6c 65 2e 20 20 43 68 61  ular table.  Cha
16bf0 6e 67 69 6e 67 20 74 68 65 20 63 6f 6d 70 61 72  nging the compar
16c00 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 77 69  ison function wi
16c10 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20  ll result.** in 
16c20 69 6e 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74  incorrect operat
16c30 69 6f 6e 73 2e 20 20 49 66 20 74 68 65 20 63 6f  ions.  If the co
16c40 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
16c50 6e 20 69 73 20 4e 55 4c 4c 2c 20 61 0a 2a 2a 20  n is NULL, a.** 
16c60 64 65 66 61 75 6c 74 20 63 6f 6d 70 61 72 69 73  default comparis
16c70 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  on function is u
16c80 73 65 64 2e 20 20 54 68 65 20 63 6f 6d 70 61 72  sed.  The compar
16c90 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73  ison function is
16ca0 0a 2a 2a 20 61 6c 77 61 79 73 20 69 67 6e 6f 72  .** always ignor
16cb0 65 64 20 66 6f 72 20 49 4e 54 4b 45 59 20 74 61  ed for INTKEY ta
16cc0 62 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  bles..*/.int sql
16cd0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28  ite3BtreeCursor(
16ce0 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20  .  Btree *p,    
16cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16d10 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
16d20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
16d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16d50 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62  Root page of tab
16d60 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
16d70 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20  int wrFlag,     
16d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
16da0 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61   to write. 0 rea
16db0 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20  d-only */.  int 
16dc0 28 2a 78 43 6d 70 29 28 76 6f 69 64 2a 2c 69 6e  (*xCmp)(void*,in
16dd0 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e  t,const void*,in
16de0 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 20  t,const void*), 
16df0 2f 2a 20 4b 65 79 20 43 6f 6d 70 61 72 69 73 6f  /* Key Compariso
16e00 6e 20 66 75 6e 63 20 2a 2f 0a 20 20 76 6f 69 64  n func */.  void
16e10 20 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20 20   *pArg,         
16e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e30 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
16e40 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65   arg to xCompare
16e50 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72  () */.  BtCursor
16e60 20 2a 2a 70 70 43 75 72 20 20 20 20 20 20 20 20   **ppCur        
16e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e80 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77      /* Write new
16e90 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a   cursor here */.
16ea0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
16eb0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20  tCursor *pCur;. 
16ec0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
16ed0 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 2a 70 70 43   p->pBt;..  *ppC
16ee0 75 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 77 72  ur = 0;.  if( wr
16ef0 46 6c 61 67 20 29 7b 0a 20 20 20 20 69 66 28 20  Flag ){.    if( 
16f00 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  pBt->readOnly ){
16f10 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
16f20 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
16f30 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68 65     }.    if( che
16f40 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70 42 74 2c  ckReadLocks(pBt,
16f50 20 69 54 61 62 6c 65 2c 20 30 29 20 29 7b 0a 20   iTable, 0) ){. 
16f60 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
16f70 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 7d  TE_LOCKED;.    }
16f80 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 42 74 2d  .  }..  if( pBt-
16f90 3e 70 50 61 67 65 31 3d 3d 30 20 29 7b 0a 20 20  >pPage1==0 ){.  
16fa0 20 20 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65    rc = lockBtree
16fb0 57 69 74 68 52 65 74 72 79 28 70 29 3b 0a 20 20  WithRetry(p);.  
16fc0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16fd0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
16fe0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
16ff0 7d 0a 20 20 70 43 75 72 20 3d 20 73 71 6c 69 74  }.  pCur = sqlit
17000 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
17010 2a 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20  *pCur) );.  if( 
17020 70 43 75 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pCur==0 ){.    r
17030 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
17040 3b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74  ;.    goto creat
17050 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69  e_cursor_excepti
17060 6f 6e 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  on;.  }.  pCur->
17070 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f  pgnoRoot = (Pgno
17080 29 69 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 69  )iTable;.  if( i
17090 54 61 62 6c 65 3d 3d 31 20 26 26 20 73 71 6c 69  Table==1 && sqli
170a0 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75  te3pager_pagecou
170b0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d  nt(pBt->pPager)=
170c0 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
170d0 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20 20  QLITE_EMPTY;.   
170e0 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 63 75 72   goto create_cur
170f0 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20  sor_exception;. 
17100 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64   }.  rc = getAnd
17110 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 43  InitPage(pBt, pC
17120 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70  ur->pgnoRoot, &p
17130 43 75 72 2d 3e 70 50 61 67 65 2c 20 30 29 3b 0a  Cur->pPage, 0);.
17140 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17150 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
17160 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78  create_cursor_ex
17170 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20  ception;.  }..  
17180 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f  /* Now that no o
17190 74 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20  ther errors can 
171a0 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69  occur, finish fi
171b0 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43  lling in the BtC
171c0 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61  ursor.  ** varia
171d0 62 6c 65 73 2c 20 6c 69 6e 6b 20 74 68 65 20 63  bles, link the c
171e0 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42  ursor into the B
171f0 74 53 68 61 72 65 64 20 6c 69 73 74 20 61 6e 64  tShared list and
17200 20 73 65 74 20 2a 70 70 43 75 72 20 28 74 68 65   set *ppCur (the
17210 0a 20 20 2a 2a 20 6f 75 74 70 75 74 20 61 72 67  .  ** output arg
17220 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
17230 6e 63 74 69 6f 6e 29 2e 0a 20 20 2a 2f 0a 20 20  nction)..  */.  
17240 70 43 75 72 2d 3e 78 43 6f 6d 70 61 72 65 20 3d  pCur->xCompare =
17250 20 78 43 6d 70 20 3f 20 78 43 6d 70 20 3a 20 64   xCmp ? xCmp : d
17260 66 6c 74 43 6f 6d 70 61 72 65 3b 0a 20 20 70 43  fltCompare;.  pC
17270 75 72 2d 3e 70 41 72 67 20 3d 20 70 41 72 67 3b  ur->pArg = pArg;
17280 0a 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20  .  pCur->pBtree 
17290 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e 77 72 46  = p;.  pCur->wrF
172a0 6c 61 67 20 3d 20 77 72 46 6c 61 67 3b 0a 20 20  lag = wrFlag;.  
172b0 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42  pCur->pNext = pB
172c0 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 66  t->pCursor;.  if
172d0 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b  ( pCur->pNext ){
172e0 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74  .    pCur->pNext
172f0 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 3b 0a  ->pPrev = pCur;.
17300 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72 73    }.  pBt->pCurs
17310 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75  or = pCur;.  pCu
17320 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
17330 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 2a 70  OR_INVALID;.  *p
17340 70 43 75 72 20 3d 20 70 43 75 72 3b 0a 0a 20 20  pCur = pCur;..  
17350 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17360 3b 0a 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f  ;.create_cursor_
17370 65 78 63 65 70 74 69 6f 6e 3a 0a 20 20 69 66 28  exception:.  if(
17380 20 70 43 75 72 20 29 7b 0a 20 20 20 20 72 65 6c   pCur ){.    rel
17390 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 70  easePage(pCur->p
173a0 50 61 67 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Page);.    sqlit
173b0 65 46 72 65 65 28 70 43 75 72 29 3b 0a 20 20 7d  eFree(pCur);.  }
173c0 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  .  unlockBtreeIf
173d0 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 72  Unused(pBt);.  r
173e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
173f0 20 30 20 20 2f 2a 20 4e 6f 74 20 55 73 65 64 20   0  /* Not Used 
17400 2a 2f 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  */./*.** Change 
17410 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
17420 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
17430 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61 20 63  tion used by a c
17440 75 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ursor..*/.void s
17450 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 6f  qlite3BtreeSetCo
17460 6d 70 61 72 65 28 0a 20 20 42 74 43 75 72 73 6f  mpare(.  BtCurso
17470 72 20 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a 20  r *pCur,     /* 
17480 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 77 68  The cursor to wh
17490 6f 73 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66  ose comparison f
174a0 75 6e 63 74 69 6f 6e 20 69 73 20 63 68 61 6e 67  unction is chang
174b0 65 64 20 2a 2f 0a 20 20 69 6e 74 28 2a 78 43 6d  ed */.  int(*xCm
174c0 70 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  p)(void*,int,con
174d0 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  st void*,int,con
174e0 73 74 20 76 6f 69 64 2a 29 2c 20 2f 2a 20 4e 65  st void*), /* Ne
174f0 77 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  w comparison fun
17500 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72  c */.  void *pAr
17510 67 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  g          /* Fi
17520 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
17530 78 43 6d 70 28 29 20 2a 2f 0a 29 7b 0a 20 20 70  xCmp() */.){.  p
17540 43 75 72 2d 3e 78 43 6f 6d 70 61 72 65 20 3d 20  Cur->xCompare = 
17550 78 43 6d 70 20 3f 20 78 43 6d 70 20 3a 20 64 66  xCmp ? xCmp : df
17560 6c 74 43 6f 6d 70 61 72 65 3b 0a 20 20 70 43 75  ltCompare;.  pCu
17570 72 2d 3e 70 41 72 67 20 3d 20 70 41 72 67 3b 0a  r->pArg = pArg;.
17580 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
17590 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20  Close a cursor. 
175a0 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f   The read lock o
175b0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
175c0 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a  ile is released.
175d0 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74  ** when the last
175e0 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65   cursor is close
175f0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
17600 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
17610 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  r(BtCursor *pCur
17620 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
17630 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65  Bt = pCur->pBtre
17640 65 2d 3e 70 42 74 3b 0a 20 20 72 65 73 74 6f 72  e->pBt;.  restor
17650 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f  eOrClearCursorPo
17660 73 69 74 69 6f 6e 28 70 43 75 72 2c 20 30 29 3b  sition(pCur, 0);
17670 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50 72  .  if( pCur->pPr
17680 65 76 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  ev ){.    pCur->
17690 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
176a0 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65  Cur->pNext;.  }e
176b0 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 70 43  lse{.    pBt->pC
176c0 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e  ursor = pCur->pN
176d0 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ext;.  }.  if( p
176e0 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  Cur->pNext ){.  
176f0 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70    pCur->pNext->p
17700 50 72 65 76 20 3d 20 70 43 75 72 2d 3e 70 50 72  Prev = pCur->pPr
17710 65 76 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73  ev;.  }.  releas
17720 65 50 61 67 65 28 70 43 75 72 2d 3e 70 50 61 67  ePage(pCur->pPag
17730 65 29 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65  e);.  unlockBtre
17740 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
17750 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 75    sqliteFree(pCu
17760 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  r);.  return SQL
17770 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
17780 20 4d 61 6b 65 20 61 20 74 65 6d 70 6f 72 61 72   Make a temporar
17790 79 20 63 75 72 73 6f 72 20 62 79 20 66 69 6c 6c  y cursor by fill
177a0 69 6e 67 20 69 6e 20 74 68 65 20 66 69 65 6c 64  ing in the field
177b0 73 20 6f 66 20 70 54 65 6d 70 43 75 72 2e 0a 2a  s of pTempCur..*
177c0 2a 20 54 68 65 20 74 65 6d 70 6f 72 61 72 79 20  * The temporary 
177d0 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 6f 6e  cursor is not on
177e0 20 74 68 65 20 63 75 72 73 6f 72 20 6c 69 73 74   the cursor list
177f0 20 66 6f 72 20 74 68 65 20 42 74 72 65 65 2e 0a   for the Btree..
17800 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
17810 65 74 54 65 6d 70 43 75 72 73 6f 72 28 42 74 43  etTempCursor(BtC
17820 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 42 74 43  ursor *pCur, BtC
17830 75 72 73 6f 72 20 2a 70 54 65 6d 70 43 75 72 29  ursor *pTempCur)
17840 7b 0a 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70  {.  memcpy(pTemp
17850 43 75 72 2c 20 70 43 75 72 2c 20 73 69 7a 65 6f  Cur, pCur, sizeo
17860 66 28 2a 70 43 75 72 29 29 3b 0a 20 20 70 54 65  f(*pCur));.  pTe
17870 6d 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 30  mpCur->pNext = 0
17880 3b 0a 20 20 70 54 65 6d 70 43 75 72 2d 3e 70 50  ;.  pTempCur->pP
17890 72 65 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  rev = 0;.  if( p
178a0 54 65 6d 70 43 75 72 2d 3e 70 50 61 67 65 20 29  TempCur->pPage )
178b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67  {.    sqlite3pag
178c0 65 72 5f 72 65 66 28 70 54 65 6d 70 43 75 72 2d  er_ref(pTempCur-
178d0 3e 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a  >pPage->aData);.
178e0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
178f0 65 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ete a temporary 
17900 63 75 72 73 6f 72 20 73 75 63 68 20 61 73 20 77  cursor such as w
17910 61 73 20 6d 61 64 65 20 62 79 20 74 68 65 20 43  as made by the C
17920 72 65 61 74 65 54 65 6d 70 6f 72 61 72 79 43 75  reateTemporaryCu
17930 72 73 6f 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69  rsor().** functi
17940 6f 6e 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61  on above..*/.sta
17950 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
17960 54 65 6d 70 43 75 72 73 6f 72 28 42 74 43 75 72  TempCursor(BtCur
17970 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 66  sor *pCur){.  if
17980 28 20 70 43 75 72 2d 3e 70 50 61 67 65 20 29 7b  ( pCur->pPage ){
17990 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65  .    sqlite3page
179a0 72 5f 75 6e 72 65 66 28 70 43 75 72 2d 3e 70 50  r_unref(pCur->pP
179b0 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 7d  age->aData);.  }
179c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
179d0 75 72 65 20 74 68 65 20 42 74 43 75 72 73 6f 72  ure the BtCursor
179e0 2e 69 6e 66 6f 20 66 69 65 6c 64 20 6f 66 20 74  .info field of t
179f0 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 20  he given cursor 
17a00 69 73 20 76 61 6c 69 64 2e 0a 2a 2a 20 49 66 20  is valid..** If 
17a10 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
17a20 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 20 70 61  y valid, call pa
17a30 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c  rseCell() to fil
17a40 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42  l it in..**.** B
17a50 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20  tCursor.info is 
17a60 61 20 63 61 63 68 65 20 6f 66 20 74 68 65 20 69  a cache of the i
17a70 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68  nformation in th
17a80 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a  e current cell..
17a90 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63 61  ** Using this ca
17aa0 63 68 65 20 72 65 64 75 63 65 73 20 74 68 65 20  che reduces the 
17ab0 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20  number of calls 
17ac0 74 6f 20 70 61 72 73 65 43 65 6c 6c 28 29 2e 0a  to parseCell()..
17ad0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
17ae0 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72  etCellInfo(BtCur
17af0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 66  sor *pCur){.  if
17b00 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
17b10 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 61 72  ze==0 ){.    par
17b20 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61  seCell(pCur->pPa
17b30 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 26  ge, pCur->idx, &
17b40 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d  pCur->info);.  }
17b50 65 6c 73 65 7b 0a 23 69 66 6e 64 65 66 20 4e 44  else{.#ifndef ND
17b60 45 42 55 47 0a 20 20 20 20 43 65 6c 6c 49 6e 66  EBUG.    CellInf
17b70 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73  o info;.    mems
17b80 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a  et(&info, 0, siz
17b90 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20  eof(info));.    
17ba0 70 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  parseCell(pCur->
17bb0 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78  pPage, pCur->idx
17bc0 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73  , &info);.    as
17bd0 73 65 72 74 28 20 6d 65 6d 63 6d 70 28 26 69 6e  sert( memcmp(&in
17be0 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c  fo, &pCur->info,
17bf0 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d   sizeof(info))==
17c00 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  0 );.#endif.  }.
17c10 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53  }../*.** Set *pS
17c20 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20  ize to the size 
17c30 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6e 65  of the buffer ne
17c40 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65  eded to hold the
17c50 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65   value of.** the
17c60 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75 72   key for the cur
17c70 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49 66 20  rent entry.  If 
17c80 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
17c90 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f  t pointing.** to
17ca0 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2c 20   a valid entry, 
17cb0 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  *pSize is set to
17cc0 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61   0. .**.** For a
17cd0 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
17ce0 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74 2c  INTKEY flag set,
17cf0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
17d00 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a  turns the key.**
17d10 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65   itself, not the
17d20 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
17d30 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a   in the key..*/.
17d40 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
17d50 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f 72  KeySize(BtCursor
17d60 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 53 69   *pCur, i64 *pSi
17d70 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ze){.  int rc = 
17d80 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75  restoreOrClearCu
17d90 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
17da0 72 2c 20 31 29 3b 0a 20 20 69 66 28 20 72 63 3d  r, 1);.  if( rc=
17db0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17dc0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
17dd0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
17de0 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  NVALID || pCur->
17df0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
17e00 41 4c 49 44 20 29 3b 0a 20 20 20 20 69 66 28 20  ALID );.    if( 
17e10 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
17e20 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
17e30 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30        *pSize = 0
17e40 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
17e50 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70     getCellInfo(p
17e60 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 53 69  Cur);.      *pSi
17e70 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ze = pCur->info.
17e80 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  nKey;.    }.  }.
17e90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17ea0 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65  /*.** Set *pSize
17eb0 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
17ec0 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  f bytes of data 
17ed0 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 68 65  in the entry the
17ee0 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75 72 72 65  .** cursor curre
17ef0 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20  ntly points to. 
17f00 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20 53   Always return S
17f10 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 61 69  QLITE_OK..** Fai
17f20 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73 73  lure is not poss
17f30 69 62 6c 65 2e 20 20 49 66 20 74 68 65 20 63 75  ible.  If the cu
17f40 72 73 6f 72 20 69 73 20 6e 6f 74 20 63 75 72 72  rsor is not curr
17f50 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e  ently.** pointin
17f60 67 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 28 77  g to an entry (w
17f70 68 69 63 68 20 63 61 6e 20 68 61 70 70 65 6e 2c  hich can happen,
17f80 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   for example, if
17f90 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
17fa0 20 69 73 20 65 6d 70 74 79 29 20 74 68 65 6e 20   is empty) then 
17fb0 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  *pSize is set to
17fc0 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   0..*/.int sqlit
17fd0 65 33 42 74 72 65 65 44 61 74 61 53 69 7a 65 28  e3BtreeDataSize(
17fe0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
17ff0 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69  u32 *pSize){.  i
18000 6e 74 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f  nt rc = restoreO
18010 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69  rClearCursorPosi
18020 74 69 6f 6e 28 70 43 75 72 2c 20 31 29 3b 0a 20  tion(pCur, 1);. 
18030 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18040 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
18050 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
18060 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c  CURSOR_INVALID |
18070 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  | pCur->eState==
18080 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
18090 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
180a0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
180b0 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ALID ){.      /*
180c0 20 4e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74   Not pointing at
180d0 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 20 2d   a valid entry -
180e0 20 73 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 30   set *pSize to 0
180f0 2e 20 2a 2f 0a 20 20 20 20 20 20 2a 70 53 69 7a  . */.      *pSiz
18100 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  e = 0;.    }else
18110 7b 0a 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49  {.      getCellI
18120 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20  nfo(pCur);.     
18130 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e   *pSize = pCur->
18140 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20  info.nData;.    
18150 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
18160 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  c;.}../*.** Read
18170 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
18180 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e  tion from the en
18190 74 72 79 20 74 68 61 74 20 74 68 65 20 70 43 75  try that the pCu
181a0 72 20 63 75 72 73 6f 72 20 69 73 0a 2a 2a 20 70  r cursor is.** p
181b0 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 42 65 67  ointing to.  Beg
181c0 69 6e 20 72 65 61 64 69 6e 67 20 74 68 65 20 70  in reading the p
181d0 61 79 6c 6f 61 64 20 61 74 20 22 6f 66 66 73 65  ayload at "offse
181e0 74 22 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 61  t" and read.** a
181f0 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22 20   total of "amt" 
18200 62 79 74 65 73 2e 20 20 50 75 74 20 74 68 65 20  bytes.  Put the 
18210 72 65 73 75 6c 74 20 69 6e 20 7a 42 75 66 2e 0a  result in zBuf..
18220 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
18230 6e 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65  ne does not make
18240 20 61 20 64 69 73 74 69 6e 63 74 69 6f 6e 20 62   a distinction b
18250 65 74 77 65 65 6e 20 6b 65 79 20 61 6e 64 20 64  etween key and d
18260 61 74 61 2e 0a 2a 2a 20 49 74 20 6a 75 73 74 20  ata..** It just 
18270 72 65 61 64 73 20 62 79 74 65 73 20 66 72 6f 6d  reads bytes from
18280 20 74 68 65 20 70 61 79 6c 6f 61 64 20 61 72 65   the payload are
18290 61 2e 20 20 44 61 74 61 20 6d 69 67 68 74 20 61  a.  Data might a
182a0 70 70 65 61 72 0a 2a 2a 20 6f 6e 20 74 68 65 20  ppear.** on the 
182b0 6d 61 69 6e 20 70 61 67 65 20 6f 72 20 62 65 20  main page or be 
182c0 73 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e  scattered out on
182d0 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c   multiple overfl
182e0 6f 77 20 70 61 67 65 73 2e 0a 2a 2f 0a 73 74 61  ow pages..*/.sta
182f0 74 69 63 20 69 6e 74 20 67 65 74 50 61 79 6c 6f  tic int getPaylo
18300 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  ad(.  BtCursor *
18310 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75  pCur,      /* Cu
18320 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f  rsor pointing to
18330 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66   entry to read f
18340 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  rom */.  int off
18350 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  set,          /*
18360 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74   Begin reading t
18370 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79  his far into pay
18380 6c 6f 61 64 20 2a 2f 0a 20 20 69 6e 74 20 61 6d  load */.  int am
18390 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t,             /
183a0 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79  * Read this many
183b0 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69   bytes */.  unsi
183c0 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c  gned char *pBuf,
183d0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 62 79   /* Write the by
183e0 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75  tes into this bu
183f0 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 73  ffer */ .  int s
18400 6b 69 70 4b 65 79 20 20 20 20 20 20 20 20 20 20  kipKey          
18410 2f 2a 20 6f 66 66 73 65 74 20 62 65 67 69 6e 73  /* offset begins
18420 20 61 74 20 64 61 74 61 20 69 66 20 74 68 69 73   at data if this
18430 20 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   is true */.){. 
18440 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
18450 61 50 61 79 6c 6f 61 64 3b 0a 20 20 50 67 6e 6f  aPayload;.  Pgno
18460 20 6e 65 78 74 50 61 67 65 3b 0a 20 20 69 6e 74   nextPage;.  int
18470 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
18480 70 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65  pPage;.  BtShare
18490 64 20 2a 70 42 74 3b 0a 20 20 69 6e 74 20 6f 76  d *pBt;.  int ov
184a0 66 6c 53 69 7a 65 3b 0a 20 20 75 33 32 20 6e 4b  flSize;.  u32 nK
184b0 65 79 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ey;..  assert( p
184c0 43 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e  Cur!=0 && pCur->
184d0 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73  pPage!=0 );.  as
184e0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
184f0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
18500 20 29 3b 0a 20 20 70 42 74 20 3d 20 70 43 75 72   );.  pBt = pCur
18510 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20  ->pBtree->pBt;. 
18520 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70   pPage = pCur->p
18530 50 61 67 65 3b 0a 20 20 70 61 67 65 49 6e 74 65  Page;.  pageInte
18540 67 72 69 74 79 28 70 50 61 67 65 29 3b 0a 20 20  grity(pPage);.  
18550 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64  assert( pCur->id
18560 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64  x>=0 && pCur->id
18570 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  x<pPage->nCell )
18580 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ;.  getCellInfo(
18590 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61  pCur);.  aPayloa
185a0 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  d = pCur->info.p
185b0 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e 69 6e 66  Cell + pCur->inf
185c0 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69 66 28  o.nHeader;.  if(
185d0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
185e0 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a  {.    nKey = 0;.
185f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65    }else{.    nKe
18600 79 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  y = pCur->info.n
18610 4b 65 79 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  Key;.  }.  asser
18620 74 28 20 6f 66 66 73 65 74 3e 3d 30 20 29 3b 0a  t( offset>=0 );.
18630 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b    if( skipKey ){
18640 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e  .    offset += n
18650 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  Key;.  }.  if( o
18660 66 66 73 65 74 2b 61 6d 74 20 3e 20 6e 4b 65 79  ffset+amt > nKey
18670 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74  +pCur->info.nDat
18680 61 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  a ){.    return 
18690 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
186a0 7d 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70  }.  if( offset<p
186b0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
186c0 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20   ){.    int a = 
186d0 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f  amt;.    if( a+o
186e0 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f  ffset>pCur->info
186f0 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  .nLocal ){.     
18700 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   a = pCur->info.
18710 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b  nLocal - offset;
18720 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
18730 79 28 70 42 75 66 2c 20 26 61 50 61 79 6c 6f 61  y(pBuf, &aPayloa
18740 64 5b 6f 66 66 73 65 74 5d 2c 20 61 29 3b 0a 20  d[offset], a);. 
18750 20 20 20 69 66 28 20 61 3d 3d 61 6d 74 20 29 7b     if( a==amt ){
18760 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
18770 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
18780 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20     offset = 0;. 
18790 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20     pBuf += a;.  
187a0 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65    amt -= a;.  }e
187b0 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  lse{.    offset 
187c0 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  -= pCur->info.nL
187d0 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 6f 76 66 6c  ocal;.  }.  ovfl
187e0 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
187f0 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 69 66  leSize - 4;.  if
18800 28 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 6e  ( amt>0 ){.    n
18810 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79  extPage = get4by
18820 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75  te(&aPayload[pCu
18830 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29  r->info.nLocal])
18840 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 61 6d 74  ;.    while( amt
18850 3e 30 20 26 26 20 6e 65 78 74 50 61 67 65 20 29  >0 && nextPage )
18860 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
18870 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 70 42  ite3pager_get(pB
18880 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50  t->pPager, nextP
18890 61 67 65 2c 20 28 76 6f 69 64 2a 2a 29 26 61 50  age, (void**)&aP
188a0 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 69  ayload);.      i
188b0 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
188c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
188d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65 78       }.      nex
188e0 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  tPage = get4byte
188f0 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20  (aPayload);.    
18900 20 20 69 66 28 20 6f 66 66 73 65 74 3c 6f 76 66    if( offset<ovf
18910 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  lSize ){.       
18920 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20   int a = amt;.  
18930 20 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66        if( a + of
18940 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20  fset > ovflSize 
18950 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 20 3d  ){.          a =
18960 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73   ovflSize - offs
18970 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  et;.        }.  
18980 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75        memcpy(pBu
18990 66 2c 20 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66  f, &aPayload[off
189a0 73 65 74 2b 34 5d 2c 20 61 29 3b 0a 20 20 20 20  set+4], a);.    
189b0 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a      offset = 0;.
189c0 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61          amt -= a
189d0 3b 0a 20 20 20 20 20 20 20 20 70 42 75 66 20 2b  ;.        pBuf +
189e0 3d 20 61 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = a;.      }else
189f0 7b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74  {.        offset
18a00 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20   -= ovflSize;.  
18a10 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
18a20 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 61  te3pager_unref(a
18a30 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 7d 0a  Payload);.    }.
18a40 20 20 7d 0a 0a 20 20 69 66 28 20 61 6d 74 3e 30    }..  if( amt>0
18a50 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
18a60 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
18a70 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
18a80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
18a90 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f  *.** Read part o
18aa0 66 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63 69  f the key associ
18ab0 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72  ated with cursor
18ac0 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a   pCur.  Exactly.
18ad0 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77  ** "amt" bytes w
18ae0 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65  ill be transfere
18af0 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20  d into pBuf[].  
18b00 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20  The transfer.** 
18b10 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65  begins at "offse
18b20 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  t"..**.** Return
18b30 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
18b40 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
18b50 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69  r code if anythi
18b60 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67  ng goes.** wrong
18b70 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72  .  An error is r
18b80 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73  eturned if "offs
18b90 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65  et+amt" is large
18ba0 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76  r than.** the av
18bb0 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e  ailable payload.
18bc0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
18bd0 74 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72  treeKey(BtCursor
18be0 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73   *pCur, u32 offs
18bf0 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69  et, u32 amt, voi
18c00 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20  d *pBuf){.  int 
18c10 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c  rc = restoreOrCl
18c20 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  earCursorPositio
18c30 6e 28 70 43 75 72 2c 20 31 29 3b 0a 20 20 69 66  n(pCur, 1);.  if
18c40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18c50 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
18c60 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
18c70 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
18c80 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
18c90 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 20 20 69  Page!=0 );.    i
18ca0 66 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  f( pCur->pPage->
18cb0 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
18cc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
18cd0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
18ce0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  }.    assert( pC
18cf0 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ur->pPage->intKe
18d00 79 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  y==0 );.    asse
18d10 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30  rt( pCur->idx>=0
18d20 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 43   && pCur->idx<pC
18d30 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
18d40 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74   );.    rc = get
18d50 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66  Payload(pCur, of
18d60 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69  fset, amt, (unsi
18d70 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c  gned char*)pBuf,
18d80 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
18d90 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
18da0 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ead part of the 
18db0 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20  data associated 
18dc0 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72  with cursor pCur
18dd0 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61  .  Exactly.** "a
18de0 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
18df0 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74  e transfered int
18e00 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74  o pBuf[].  The t
18e10 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e  ransfer.** begin
18e20 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  s at "offset"..*
18e30 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
18e40 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
18e50 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
18e60 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
18e70 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e  es.** wrong.  An
18e80 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
18e90 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d  ed if "offset+am
18ea0 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  t" is larger tha
18eb0 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62  n.** the availab
18ec0 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69  le payload..*/.i
18ed0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  nt sqlite3BtreeD
18ee0 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ata(BtCursor *pC
18ef0 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20  ur, u32 offset, 
18f00 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70  u32 amt, void *p
18f10 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Buf){.  int rc =
18f20 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43   restoreOrClearC
18f30 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
18f40 75 72 2c 20 31 29 3b 0a 20 20 69 66 28 20 72 63  ur, 1);.  if( rc
18f50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18f60 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
18f70 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
18f80 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73  VALID );.    ass
18f90 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
18fa0 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
18fb0 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20  t( pCur->idx>=0 
18fc0 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 43 75  && pCur->idx<pCu
18fd0 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  r->pPage->nCell 
18fe0 29 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 50  );.    rc = getP
18ff0 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66  ayload(pCur, off
19000 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20  set, amt, pBuf, 
19010 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  1);.  }.  return
19020 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
19030 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
19040 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d  o payload inform
19050 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65  ation from the e
19060 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a  ntry that the .*
19070 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73  * pCur cursor is
19080 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54   pointing to.  T
19090 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f  he pointer is to
190a0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
190b0 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20  f.** the key if 
190c0 73 6b 69 70 4b 65 79 3d 3d 30 20 61 6e 64 20 69  skipKey==0 and i
190d0 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
190e0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74  beginning of dat
190f0 61 20 69 66 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d  a if.** skipKey=
19100 3d 31 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20  =1.  The number 
19110 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69  of bytes of avai
19120 6c 61 62 6c 65 20 6b 65 79 2f 64 61 74 61 20 69  lable key/data i
19130 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
19140 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41  o *pAmt.  If *pA
19150 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20  mt==0, then the 
19160 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 77  value returned w
19170 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 20  ill not be.** a 
19180 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a  valid pointer..*
19190 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
191a0 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  e is an optimiza
191b0 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d  tion.  It is com
191c0 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69  mon for the enti
191d0 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61  re key.** and da
191e0 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65  ta to fit on the
191f0 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20   local page and 
19200 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20  for there to be 
19210 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70  no overflow.** p
19220 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74  ages.  When that
19230 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75   is so, this rou
19240 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64  tine can be used
19250 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a   to access the.*
19260 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77  * key and data w
19270 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20  ithout making a 
19280 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65  copy.  If the ke
19290 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70  y and/or data sp
192a0 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65  ills.** onto ove
192b0 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65  rflow pages, the
192c0 6e 20 67 65 74 50 61 79 6c 6f 61 64 28 29 20 6d  n getPayload() m
192d0 75 73 74 20 62 65 20 75 73 65 64 20 74 6f 20 72  ust be used to r
192e0 65 61 73 73 65 6d 62 6c 79 0a 2a 2a 20 74 68 65  eassembly.** the
192f0 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f   key/data and co
19300 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65  py it into a pre
19310 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72  allocated buffer
19320 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e  ..**.** The poin
19330 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20  ter returned by 
19340 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f  this routine loo
19350 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f  ks directly into
19360 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70   the cached.** p
19370 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
19380 61 73 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d  ase.  The data m
19390 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d  ight change or m
193a0 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d  ove the next tim
193b0 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72  e.** any btree r
193c0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
193d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
193e0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
193f0 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20  *fetchPayload(. 
19400 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
19410 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
19420 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72  pointing to entr
19430 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  y to read from *
19440 2f 0a 20 20 69 6e 74 20 2a 70 41 6d 74 2c 20 20  /.  int *pAmt,  
19450 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
19460 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
19470 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20  available bytes 
19480 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6b  here */.  int sk
19490 69 70 4b 65 79 20 20 20 20 20 20 20 20 20 20 2f  ipKey          /
194a0 2a 20 72 65 61 64 20 62 65 67 69 6e 6e 69 6e 67  * read beginning
194b0 20 61 74 20 64 61 74 61 20 69 66 20 74 68 69 73   at data if this
194c0 20 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   is true */.){. 
194d0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
194e0 61 50 61 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50  aPayload;.  MemP
194f0 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 75 33  age *pPage;.  u3
19500 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4c  2 nKey;.  int nL
19510 6f 63 61 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28  ocal;..  assert(
19520 20 70 43 75 72 21 3d 30 20 26 26 20 70 43 75 72   pCur!=0 && pCur
19530 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20  ->pPage!=0 );.  
19540 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
19550 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
19560 49 44 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20  ID );.  pPage = 
19570 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 70  pCur->pPage;.  p
19580 61 67 65 49 6e 74 65 67 72 69 74 79 28 70 50 61  ageIntegrity(pPa
19590 67 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge);.  assert( p
195a0 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70  Cur->idx>=0 && p
195b0 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e  Cur->idx<pPage->
195c0 6e 43 65 6c 6c 20 29 3b 0a 20 20 67 65 74 43 65  nCell );.  getCe
195d0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
195e0 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d  aPayload = pCur-
195f0 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61  >info.pCell;.  a
19600 50 61 79 6c 6f 61 64 20 2b 3d 20 70 43 75 72 2d  Payload += pCur-
19610 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20  >info.nHeader;. 
19620 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
19630 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65 79 20 3d  ey ){.    nKey =
19640 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
19650 20 6e 4b 65 79 20 3d 20 70 43 75 72 2d 3e 69 6e   nKey = pCur->in
19660 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69  fo.nKey;.  }.  i
19670 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20  f( skipKey ){.  
19680 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b    aPayload += nK
19690 65 79 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d  ey;.    nLocal =
196a0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
196b0 61 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c  al - nKey;.  }el
196c0 73 65 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d  se{.    nLocal =
196d0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
196e0 61 6c 3b 0a 20 20 20 20 69 66 28 20 6e 4c 6f 63  al;.    if( nLoc
196f0 61 6c 3e 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20  al>nKey ){.     
19700 20 6e 4c 6f 63 61 6c 20 3d 20 6e 4b 65 79 3b 0a   nLocal = nKey;.
19710 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 41 6d      }.  }.  *pAm
19720 74 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65  t = nLocal;.  re
19730 74 75 72 6e 20 61 50 61 79 6c 6f 61 64 3b 0a 7d  turn aPayload;.}
19740 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  .../*.** For the
19750 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73   entry that curs
19760 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74  or pCur is point
19770 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a   to, return as.*
19780 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20  * many bytes of 
19790 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20  the key or data 
197a0 61 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  as are available
197b0 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a   on the local.**
197c0 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57   b-tree page.  W
197d0 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  rite the number 
197e0 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74  of available byt
197f0 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a  es into *pAmt..*
19800 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  *.** The pointer
19810 20 72 65 74 75 72 6e 65 64 20 69 73 20 65 70 68   returned is eph
19820 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79  emeral.  The key
19830 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a  /data may move.*
19840 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65  * or be destroye
19850 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61  d on the next ca
19860 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20  ll to any Btree 
19870 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  routine..**.** T
19880 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73  hese routines is
19890 20 75 73 65 64 20 74 6f 20 67 65 74 20 71 75 69   used to get qui
198a0 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79  ck access to key
198b0 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20   and data.** in 
198c0 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
198d0 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f  where no overflo
198e0 77 20 70 61 67 65 73 20 61 72 65 20 75 73 65 64  w pages are used
198f0 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20  ..*/.const void 
19900 2a 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79  *sqlite3BtreeKey
19910 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a  Fetch(BtCursor *
19920 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29  pCur, int *pAmt)
19930 7b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  {.  if( pCur->eS
19940 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
19950 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ID ){.    return
19960 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65   (const void*)fe
19970 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  tchPayload(pCur,
19980 20 70 41 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20   pAmt, 0);.  }. 
19990 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 63 6f 6e   return 0;.}.con
199a0 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  st void *sqlite3
199b0 42 74 72 65 65 44 61 74 61 46 65 74 63 68 28 42  BtreeDataFetch(B
199c0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
199d0 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 69 66 28  nt *pAmt){.  if(
199e0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
199f0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
19a00 20 20 20 72 65 74 75 72 6e 20 28 63 6f 6e 73 74     return (const
19a10 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79 6c   void*)fetchPayl
19a20 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c 20  oad(pCur, pAmt, 
19a30 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  1);.  }.  return
19a40 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f   0;.}.../*.** Mo
19a50 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
19a60 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c  wn to a new chil
19a70 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77  d page.  The new
19a80 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73  Pgno argument is
19a90 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d   the.** page num
19aa0 62 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ber of the child
19ab0 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f   page to move to
19ac0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19ad0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75  moveToChild(BtCu
19ae0 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
19af0 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  newPgno){.  int 
19b00 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  rc;.  MemPage *p
19b10 4e 65 77 50 61 67 65 3b 0a 20 20 4d 65 6d 50 61  NewPage;.  MemPa
19b20 67 65 20 2a 70 4f 6c 64 50 61 67 65 3b 0a 20 20  ge *pOldPage;.  
19b30 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
19b40 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42  pCur->pBtree->pB
19b50 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43  t;..  assert( pC
19b60 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
19b70 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72 63  OR_VALID );.  rc
19b80 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
19b90 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20  e(pBt, newPgno, 
19ba0 26 70 4e 65 77 50 61 67 65 2c 20 70 43 75 72 2d  &pNewPage, pCur-
19bb0 3e 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  >pPage);.  if( r
19bc0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
19bd0 20 70 61 67 65 49 6e 74 65 67 72 69 74 79 28 70   pageIntegrity(p
19be0 4e 65 77 50 61 67 65 29 3b 0a 20 20 70 4e 65 77  NewPage);.  pNew
19bf0 50 61 67 65 2d 3e 69 64 78 50 61 72 65 6e 74 20  Page->idxParent 
19c00 3d 20 70 43 75 72 2d 3e 69 64 78 3b 0a 20 20 70  = pCur->idx;.  p
19c10 4f 6c 64 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  OldPage = pCur->
19c20 70 50 61 67 65 3b 0a 20 20 70 4f 6c 64 50 61 67  pPage;.  pOldPag
19c30 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 30 3b  e->idxShift = 0;
19c40 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
19c50 4f 6c 64 50 61 67 65 29 3b 0a 20 20 70 43 75 72  OldPage);.  pCur
19c60 2d 3e 70 50 61 67 65 20 3d 20 70 4e 65 77 50 61  ->pPage = pNewPa
19c70 67 65 3b 0a 20 20 70 43 75 72 2d 3e 69 64 78 20  ge;.  pCur->idx 
19c80 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  = 0;.  pCur->inf
19c90 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69  o.nSize = 0;.  i
19ca0 66 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65  f( pNewPage->nCe
19cb0 6c 6c 3c 31 20 29 7b 0a 20 20 20 20 72 65 74 75  ll<1 ){.    retu
19cc0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
19cd0 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65  T_BKPT;.  }.  re
19ce0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
19cf0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
19d00 74 72 75 65 20 69 66 20 74 68 65 20 70 61 67 65  true if the page
19d10 20 69 73 20 74 68 65 20 76 69 72 74 75 61 6c 20   is the virtual 
19d20 72 6f 6f 74 20 6f 66 20 69 74 73 20 74 61 62 6c  root of its tabl
19d30 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 69 72  e..**.** The vir
19d40 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69  tual root page i
19d50 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  s the root page 
19d60 66 6f 72 20 6d 6f 73 74 20 74 61 62 6c 65 73 2e  for most tables.
19d70 20 20 42 75 74 0a 2a 2a 20 66 6f 72 20 74 68 65    But.** for the
19d80 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 6f 6e   table rooted on
19d90 20 70 61 67 65 20 31 2c 20 73 6f 6d 65 74 69 6d   page 1, sometim
19da0 65 20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74 20  e the real root 
19db0 70 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79  page.** is empty
19dc0 20 65 78 63 65 70 74 20 66 6f 72 20 74 68 65 20   except for the 
19dd0 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 2e 20 20  right-pointer.  
19de0 49 6e 20 73 75 63 68 20 63 61 73 65 73 20 74 68  In such cases th
19df0 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f  e.** virtual roo
19e00 74 20 70 61 67 65 20 69 73 20 74 68 65 20 70 61  t page is the pa
19e10 67 65 20 74 68 61 74 20 74 68 65 20 72 69 67 68  ge that the righ
19e20 74 2d 70 6f 69 6e 74 65 72 20 6f 66 20 70 61 67  t-pointer of pag
19e30 65 0a 2a 2a 20 31 20 69 73 20 70 6f 69 6e 74 69  e.** 1 is pointi
19e40 6e 67 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  ng to..*/.static
19e50 20 69 6e 74 20 69 73 52 6f 6f 74 50 61 67 65 28   int isRootPage(
19e60 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
19e70 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  .  MemPage *pPar
19e80 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70 50 61  ent = pPage->pPa
19e90 72 65 6e 74 3b 0a 20 20 69 66 28 20 70 50 61 72  rent;.  if( pPar
19ea0 65 6e 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ent==0 ) return 
19eb0 31 3b 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74  1;.  if( pParent
19ec0 2d 3e 70 67 6e 6f 3e 31 20 29 20 72 65 74 75 72  ->pgno>1 ) retur
19ed0 6e 20 30 3b 0a 20 20 69 66 28 20 67 65 74 32 62  n 0;.  if( get2b
19ee0 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
19ef0 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
19f00 4f 66 66 73 65 74 2b 33 5d 29 3d 3d 30 20 29 20  Offset+3])==0 ) 
19f10 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75  return 1;.  retu
19f20 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  rn 0;.}../*.** M
19f30 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 75  ove the cursor u
19f40 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  p to the parent 
19f50 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72  page..**.** pCur
19f60 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20  ->idx is set to 
19f70 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74  the cell index t
19f80 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
19f90 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
19fa0 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20 63  he page we are c
19fb0 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20  oming from.  If 
19fc0 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
19fd0 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d  om the.** right-
19fe0 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65 20  most child page 
19ff0 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69  then pCur->idx i
1a000 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72  s set to one mor
1a010 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61  e than.** the la
1a020 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78  rgest cell index
1a030 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1a040 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74   moveToParent(Bt
1a050 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1a060 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
1a070 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  t;.  MemPage *pP
1a080 61 67 65 3b 0a 20 20 69 6e 74 20 69 64 78 50 61  age;.  int idxPa
1a090 72 65 6e 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  rent;..  assert(
1a0a0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1a0b0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1a0c0 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70   pPage = pCur->p
1a0d0 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
1a0e0 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73  pPage!=0 );.  as
1a0f0 73 65 72 74 28 20 21 69 73 52 6f 6f 74 50 61 67  sert( !isRootPag
1a100 65 28 70 50 61 67 65 29 20 29 3b 0a 20 20 70 61  e(pPage) );.  pa
1a110 67 65 49 6e 74 65 67 72 69 74 79 28 70 50 61 67  geIntegrity(pPag
1a120 65 29 3b 0a 20 20 70 50 61 72 65 6e 74 20 3d 20  e);.  pParent = 
1a130 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a  pPage->pParent;.
1a140 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
1a150 74 21 3d 30 20 29 3b 0a 20 20 70 61 67 65 49 6e  t!=0 );.  pageIn
1a160 74 65 67 72 69 74 79 28 70 50 61 72 65 6e 74 29  tegrity(pParent)
1a170 3b 0a 20 20 69 64 78 50 61 72 65 6e 74 20 3d 20  ;.  idxParent = 
1a180 70 50 61 67 65 2d 3e 69 64 78 50 61 72 65 6e 74  pPage->idxParent
1a190 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72  ;.  sqlite3pager
1a1a0 5f 72 65 66 28 70 50 61 72 65 6e 74 2d 3e 61 44  _ref(pParent->aD
1a1b0 61 74 61 29 3b 0a 20 20 72 65 6c 65 61 73 65 50  ata);.  releaseP
1a1c0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 70 43  age(pPage);.  pC
1a1d0 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 50 61 72  ur->pPage = pPar
1a1e0 65 6e 74 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  ent;.  pCur->inf
1a1f0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 61  o.nSize = 0;.  a
1a200 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
1a210 69 64 78 53 68 69 66 74 3d 3d 30 20 29 3b 0a 20  idxShift==0 );. 
1a220 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 69 64 78   pCur->idx = idx
1a230 50 61 72 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Parent;.}../*.**
1a240 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
1a250 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67   to the root pag
1a260 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
1a270 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72  moveToRoot(BtCur
1a280 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65  sor *pCur){.  Me
1a290 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20  mPage *pRoot;.  
1a2a0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1a2b0 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  OK;.  BtShared *
1a2c0 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 72  pBt = pCur->pBtr
1a2d0 65 65 2d 3e 70 42 74 3b 0a 0a 20 20 72 65 73 74  ee->pBt;..  rest
1a2e0 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72  oreOrClearCursor
1a2f0 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 2c 20 30  Position(pCur, 0
1a300 29 3b 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75  );.  pRoot = pCu
1a310 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66 28 20  r->pPage;.  if( 
1a320 70 52 6f 6f 74 20 26 26 20 70 52 6f 6f 74 2d 3e  pRoot && pRoot->
1a330 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f  pgno==pCur->pgno
1a340 52 6f 6f 74 20 29 7b 0a 20 20 20 20 61 73 73 65  Root ){.    asse
1a350 72 74 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69  rt( pRoot->isIni
1a360 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t );.  }else{.  
1a370 20 20 69 66 28 20 0a 20 20 20 20 20 20 53 51 4c    if( .      SQL
1a380 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 67 65  ITE_OK!=(rc = ge
1a390 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
1a3a0 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
1a3b0 2c 20 26 70 52 6f 6f 74 2c 20 30 29 29 0a 20 20  , &pRoot, 0)).  
1a3c0 20 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d    ){.      pCur-
1a3d0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
1a3e0 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
1a3f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1a400 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
1a410 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20  (pCur->pPage);. 
1a420 20 20 20 70 61 67 65 49 6e 74 65 67 72 69 74 79     pageIntegrity
1a430 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 70 43 75  (pRoot);.    pCu
1a440 72 2d 3e 70 50 61 67 65 20 3d 20 70 52 6f 6f 74  r->pPage = pRoot
1a450 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 64  ;.  }.  pCur->id
1a460 78 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69  x = 0;.  pCur->i
1a470 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
1a480 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c   if( pRoot->nCel
1a490 6c 3d 3d 30 20 26 26 20 21 70 52 6f 6f 74 2d 3e  l==0 && !pRoot->
1a4a0 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f  leaf ){.    Pgno
1a4b0 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20 61 73   subpage;.    as
1a4c0 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e  sert( pRoot->pgn
1a4d0 6f 3d 3d 31 20 29 3b 0a 20 20 20 20 73 75 62 70  o==1 );.    subp
1a4e0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
1a4f0 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f  pRoot->aData[pRo
1a500 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ot->hdrOffset+8]
1a510 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
1a520 75 62 70 61 67 65 3e 30 20 29 3b 0a 20 20 20 20  ubpage>0 );.    
1a530 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
1a540 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20  URSOR_VALID;.   
1a550 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
1a560 64 28 70 43 75 72 2c 20 73 75 62 70 61 67 65 29  d(pCur, subpage)
1a570 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53  ;.  }.  pCur->eS
1a580 74 61 74 65 20 3d 20 28 28 70 43 75 72 2d 3e 70  tate = ((pCur->p
1a590 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 29 3f 43  Page->nCell>0)?C
1a5a0 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43 55 52 53  URSOR_VALID:CURS
1a5b0 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a 20 20 72  OR_INVALID);.  r
1a5c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1a5d0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
1a5e0 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c  or down to the l
1a5f0 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e  eft-most leaf en
1a600 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a  try beneath the.
1a610 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63  ** entry to whic
1a620 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  h it is currentl
1a630 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a  y pointing..**.*
1a640 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  * The left-most 
1a650 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20  leaf is the one 
1a660 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73  with the smalles
1a670 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73  t key - the firs
1a680 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e  t.** in ascendin
1a690 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  g order..*/.stat
1a6a0 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66  ic int moveToLef
1a6b0 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a  tmost(BtCursor *
1a6c0 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67  pCur){.  Pgno pg
1a6d0 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  no;.  int rc;.  
1a6e0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
1a6f0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1a700 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1a710 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65  VALID );.  while
1a720 28 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72  ( !(pPage = pCur
1a730 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66 20 29  ->pPage)->leaf )
1a740 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
1a750 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43  ur->idx>=0 && pC
1a760 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e  ur->idx<pPage->n
1a770 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f  Cell );.    pgno
1a780 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64   = get4byte(find
1a790 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72  Cell(pPage, pCur
1a7a0 2d 3e 69 64 78 29 29 3b 0a 20 20 20 20 72 63 20  ->idx));.    rc 
1a7b0 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
1a7c0 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69  ur, pgno);.    i
1a7d0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1a7e0 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  c;.  }.  return 
1a7f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1a800 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
1a810 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20  sor down to the 
1a820 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20  right-most leaf 
1a830 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
1a840 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77 68 69  e.** page to whi
1a850 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74  ch it is current
1a860 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f  ly pointing.  No
1a870 74 69 63 65 20 74 68 65 20 64 69 66 66 65 72 65  tice the differe
1a880 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d  nce.** between m
1a890 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20  oveToLeftmost() 
1a8a0 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  and moveToRightm
1a8b0 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65  ost().  moveToLe
1a8c0 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64  ftmost().** find
1a8d0 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  s the left-most 
1a8e0 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
1a8f0 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72 65 61  e *entry* wherea
1a900 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  s moveToRightmos
1a910 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65  t().** finds the
1a920 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
1a930 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 70  y beneath the *p
1a940 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  age*..**.** The 
1a950 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79  right-most entry
1a960 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68   is the one with
1a970 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79   the largest key
1a980 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b   - the last.** k
1a990 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  ey in ascending 
1a9a0 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
1a9b0 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68 74   int moveToRight
1a9c0 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  most(BtCursor *p
1a9d0 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e  Cur){.  Pgno pgn
1a9e0 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  o;.  int rc;.  M
1a9f0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
1aa00 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1aa10 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1aa20 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28  ALID );.  while(
1aa30 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d   !(pPage = pCur-
1aa40 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66 20 29 7b  >pPage)->leaf ){
1aa50 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
1aa60 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
1aa70 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
1aa80 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75  set+8]);.    pCu
1aa90 72 2d 3e 69 64 78 20 3d 20 70 50 61 67 65 2d 3e  r->idx = pPage->
1aaa0 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20  nCell;.    rc = 
1aab0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
1aac0 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28  , pgno);.    if(
1aad0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
1aae0 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 64 78  .  }.  pCur->idx
1aaf0 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20   = pPage->nCell 
1ab00 2d 20 31 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  - 1;.  pCur->inf
1ab10 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 72  o.nSize = 0;.  r
1ab20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1ab30 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
1ab40 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69  cursor to the fi
1ab50 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
1ab60 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
1ab70 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
1ab80 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70  success.  Set *p
1ab90 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20  Res to 0 if the 
1aba0 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20  cursor actually 
1abb0 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68  points to someth
1abc0 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70  ing.** or set *p
1abd0 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20  Res to 1 if the 
1abe0 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
1abf0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1ac00 72 65 65 46 69 72 73 74 28 42 74 43 75 72 73 6f  reeFirst(BtCurso
1ac10 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
1ac20 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
1ac30 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
1ac40 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
1ac50 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1ac60 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
1ac70 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
1ac80 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1ac90 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
1aca0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 52  ll==0 );.    *pR
1acb0 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  es = 1;.    retu
1acc0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1acd0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  }.  assert( pCur
1ace0 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30  ->pPage->nCell>0
1acf0 20 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b   );.  *pRes = 0;
1ad00 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65  .  rc = moveToLe
1ad10 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
1ad20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1ad30 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
1ad40 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
1ad50 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ry in the table.
1ad60 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
1ad70 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
1ad80 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20  .  Set *pRes to 
1ad90 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  0 if the cursor 
1ada0 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20  actually points 
1adb0 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20  to something.** 
1adc0 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  or set *pRes to 
1add0 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  1 if the table i
1ade0 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20  s empty..*/.int 
1adf0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74  sqlite3BtreeLast
1ae00 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1ae10 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
1ae20 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 6d 6f  nt rc;.  rc = mo
1ae30 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
1ae40 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1ae50 6e 20 72 63 3b 0a 20 20 69 66 28 20 43 55 52 53  n rc;.  if( CURS
1ae60 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
1ae70 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
1ae80 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
1ae90 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  age->nCell==0 );
1aea0 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a  .    *pRes = 1;.
1aeb0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1aec0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65  E_OK;.  }.  asse
1aed0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
1aee0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
1aef0 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20  ;.  *pRes = 0;. 
1af00 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68   rc = moveToRigh
1af10 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 72  tmost(pCur);.  r
1af20 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
1af30 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
1af40 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
1af50 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65  s to an entry ne
1af60 61 72 20 70 4b 65 79 2f 6e 4b 65 79 2e 0a 2a 2a  ar pKey/nKey..**
1af70 20 52 65 74 75 72 6e 20 61 20 73 75 63 63 65 73   Return a succes
1af80 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f  s code..**.** Fo
1af90 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c  r INTKEY tables,
1afa0 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20 70   only the nKey p
1afb0 61 72 61 6d 65 74 65 72 20 69 73 20 75 73 65 64  arameter is used
1afc0 2e 20 20 70 4b 65 79 20 69 73 0a 2a 2a 20 69 67  .  pKey is.** ig
1afd0 6e 6f 72 65 64 2e 20 20 46 6f 72 20 6f 74 68 65  nored.  For othe
1afe0 72 20 74 61 62 6c 65 73 2c 20 6e 4b 65 79 20 69  r tables, nKey i
1aff0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1b000 62 79 74 65 73 20 6f 66 20 64 61 74 61 0a 2a 2a  bytes of data.**
1b010 20 69 6e 20 70 4b 65 79 2e 20 20 54 68 65 20 63   in pKey.  The c
1b020 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
1b030 6f 6e 20 73 70 65 63 69 66 69 65 64 20 77 68 65  on specified whe
1b040 6e 20 74 68 65 20 63 75 72 73 6f 72 20 77 61 73  n the cursor was
1b050 0a 2a 2a 20 63 72 65 61 74 65 64 20 69 73 20 75  .** created is u
1b060 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 6b  sed to compare k
1b070 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  eys..**.** If an
1b080 20 65 78 61 63 74 20 6d 61 74 63 68 20 69 73 20   exact match is 
1b090 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20  not found, then 
1b0a0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c  the cursor is al
1b0b0 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69  ways.** left poi
1b0c0 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20  nting at a leaf 
1b0d0 70 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64  page which would
1b0e0 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20   hold the entry 
1b0f0 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72  if it.** were pr
1b100 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73  esent.  The curs
1b110 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  or might point t
1b120 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20  o an entry that 
1b130 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20  comes.** before 
1b140 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b 65 79  or after the key
1b150 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75  ..**.** The resu
1b160 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67 20  lt of comparing 
1b170 74 68 65 20 6b 65 79 20 77 69 74 68 20 74 68 65  the key with the
1b180 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20   entry to which 
1b190 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 69 73  the.** cursor is
1b1a0 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 52 65   written to *pRe
1b1b0 73 20 69 66 20 70 52 65 73 21 3d 4e 55 4c 4c 2e  s if pRes!=NULL.
1b1c0 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66    The meaning of
1b1d0 0a 2a 2a 20 74 68 69 73 20 76 61 6c 75 65 20 69  .** this value i
1b1e0 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  s as follows:.**
1b1f0 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20  .**     *pRes<0 
1b200 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
1b210 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
1b220 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
1b230 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
1b240 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72        is smaller
1b250 20 74 68 61 6e 20 70 4b 65 79 20 6f 72 20 69 66   than pKey or if
1b260 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
1b270 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  pty.**          
1b280 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20          and the 
1b290 63 75 72 73 6f 72 20 69 73 20 74 68 65 72 65 66  cursor is theref
1b2a0 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74  ore left point t
1b2b0 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a  o nothing..**.**
1b2c0 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20       *pRes==0   
1b2d0 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
1b2e0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
1b2f0 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
1b300 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1b310 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68     exactly match
1b320 65 73 20 70 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20  es pKey..**.**  
1b330 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20     *pRes>0      
1b340 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
1b350 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
1b360 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
1b370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b380 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
1b390 70 4b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  pKey..*/.int sql
1b3a0 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28  ite3BtreeMoveto(
1b3b0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1b3c0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
1b3d0 2c 20 69 36 34 20 6e 4b 65 79 2c 20 69 6e 74 20  , i64 nKey, int 
1b3e0 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
1b3f0 3b 0a 20 20 69 6e 74 20 74 72 79 52 69 67 68 74  ;.  int tryRight
1b400 6d 6f 73 74 3b 0a 20 20 72 63 20 3d 20 6d 6f 76  most;.  rc = mov
1b410 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
1b420 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1b430 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70   rc;.  assert( p
1b440 43 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20  Cur->pPage );.  
1b450 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
1b460 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
1b470 20 74 72 79 52 69 67 68 74 6d 6f 73 74 20 3d 20   tryRightmost = 
1b480 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74  pCur->pPage->int
1b490 4b 65 79 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  Key;.  if( pCur-
1b4a0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1b4b0 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a  INVALID ){.    *
1b4c0 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61  pRes = -1;.    a
1b4d0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61  ssert( pCur->pPa
1b4e0 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  ge->nCell==0 );.
1b4f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1b500 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 20 66 6f 72  E_OK;.  }.   for
1b510 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77  (;;){.    int lw
1b520 72 2c 20 75 70 72 3b 0a 20 20 20 20 50 67 6e 6f  r, upr;.    Pgno
1b530 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d   chldPg;.    Mem
1b540 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43  Page *pPage = pC
1b550 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 69  ur->pPage;.    i
1b560 6e 74 20 63 20 3d 20 2d 31 3b 20 20 2f 2a 20 70  nt c = -1;  /* p
1b570 52 65 73 20 72 65 74 75 72 6e 20 69 66 20 74 61  Res return if ta
1b580 62 6c 65 20 69 73 20 65 6d 70 74 79 20 6d 75 73  ble is empty mus
1b590 74 20 62 65 20 2d 31 20 2a 2f 0a 20 20 20 20 6c  t be -1 */.    l
1b5a0 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20  wr = 0;.    upr 
1b5b0 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31  = pPage->nCell-1
1b5c0 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ;.    if( !pPage
1b5d0 2d 3e 69 6e 74 4b 65 79 20 26 26 20 70 4b 65 79  ->intKey && pKey
1b5e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
1b5f0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1b600 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
1b610 20 20 20 70 61 67 65 49 6e 74 65 67 72 69 74 79     pageIntegrity
1b620 28 70 50 61 67 65 29 3b 0a 20 20 20 20 77 68 69  (pPage);.    whi
1b630 6c 65 28 20 6c 77 72 3c 3d 75 70 72 20 29 7b 0a  le( lwr<=upr ){.
1b640 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c        void *pCel
1b650 6c 4b 65 79 3b 0a 20 20 20 20 20 20 69 36 34 20  lKey;.      i64 
1b660 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  nCellKey;.      
1b670 70 43 75 72 2d 3e 69 64 78 20 3d 20 28 6c 77 72  pCur->idx = (lwr
1b680 2b 75 70 72 29 2f 32 3b 0a 20 20 20 20 20 20 70  +upr)/2;.      p
1b690 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
1b6a0 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 0;.      if( p
1b6b0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
1b6c0 20 20 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c          u8 *pCel
1b6d0 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 74  l;.        if( t
1b6e0 72 79 52 69 67 68 74 6d 6f 73 74 20 29 7b 0a 20  ryRightmost ){. 
1b6f0 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69           pCur->i
1b700 64 78 20 3d 20 75 70 72 3b 0a 20 20 20 20 20 20  dx = upr;.      
1b710 20 20 7d 0a 20 20 20 20 20 20 20 20 70 43 65 6c    }.        pCel
1b720 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
1b730 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 20 2b  ge, pCur->idx) +
1b740 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
1b750 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Size;.        if
1b760 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
1b770 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33   ){.          u3
1b780 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20  2 dummy;.       
1b790 20 20 20 70 43 65 6c 6c 20 2b 3d 20 67 65 74 56     pCell += getV
1b7a0 61 72 69 6e 74 33 32 28 70 43 65 6c 6c 2c 20 26  arint32(pCell, &
1b7b0 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20  dummy);.        
1b7c0 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56 61 72  }.        getVar
1b7d0 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 20  int(pCell, (u64 
1b7e0 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  *)&nCellKey);.  
1b7f0 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b        if( nCellK
1b800 65 79 3c 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20  ey<nKey ){.     
1b810 20 20 20 20 20 63 20 3d 20 2d 31 3b 0a 20 20 20       c = -1;.   
1b820 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
1b830 43 65 6c 6c 4b 65 79 3e 6e 4b 65 79 20 29 7b 0a  CellKey>nKey ){.
1b840 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 2b 31            c = +1
1b850 3b 0a 20 20 20 20 20 20 20 20 20 20 74 72 79 52  ;.          tryR
1b860 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20  ightmost = 0;.  
1b870 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1b880 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20         c = 0;.  
1b890 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
1b8a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
1b8b0 20 61 76 61 69 6c 61 62 6c 65 3b 0a 20 20 20 20   available;.    
1b8c0 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 28      pCellKey = (
1b8d0 76 6f 69 64 20 2a 29 66 65 74 63 68 50 61 79 6c  void *)fetchPayl
1b8e0 6f 61 64 28 70 43 75 72 2c 20 26 61 76 61 69 6c  oad(pCur, &avail
1b8f0 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  able, 0);.      
1b900 20 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 70 43 75    nCellKey = pCu
1b910 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20  r->info.nKey;.  
1b920 20 20 20 20 20 20 69 66 28 20 61 76 61 69 6c 61        if( availa
1b930 62 6c 65 3e 3d 6e 43 65 6c 6c 4b 65 79 20 29 7b  ble>=nCellKey ){
1b940 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 70  .          c = p
1b950 43 75 72 2d 3e 78 43 6f 6d 70 61 72 65 28 70 43  Cur->xCompare(pC
1b960 75 72 2d 3e 70 41 72 67 2c 20 6e 43 65 6c 6c 4b  ur->pArg, nCellK
1b970 65 79 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 6e 4b  ey, pCellKey, nK
1b980 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20  ey, pKey);.     
1b990 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b9a0 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73      pCellKey = s
1b9b0 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
1b9c0 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 20 20 20 20  nCellKey );.    
1b9d0 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b        if( pCellK
1b9e0 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ey==0 ) return S
1b9f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1ba00 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1ba10 74 65 33 42 74 72 65 65 4b 65 79 28 70 43 75 72  te3BtreeKey(pCur
1ba20 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 28  , 0, nCellKey, (
1ba30 76 6f 69 64 20 2a 29 70 43 65 6c 6c 4b 65 79 29  void *)pCellKey)
1ba40 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  ;.          c = 
1ba50 70 43 75 72 2d 3e 78 43 6f 6d 70 61 72 65 28 70  pCur->xCompare(p
1ba60 43 75 72 2d 3e 70 41 72 67 2c 20 6e 43 65 6c 6c  Cur->pArg, nCell
1ba70 4b 65 79 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 6e  Key, pCellKey, n
1ba80 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20  Key, pKey);.    
1ba90 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
1baa0 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20  (pCellKey);.    
1bab0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
1bac0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1bad0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1bae0 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20    if( c==0 ){.  
1baf0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
1bb00 3e 6c 65 61 66 44 61 74 61 20 26 26 20 21 70 50  >leafData && !pP
1bb10 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
1bb20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 70 43 75         lwr = pCu
1bb30 72 2d 3e 69 64 78 3b 0a 20 20 20 20 20 20 20 20  r->idx;.        
1bb40 20 20 75 70 72 20 3d 20 6c 77 72 20 2d 20 31 3b    upr = lwr - 1;
1bb50 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
1bb60 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1bb70 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
1bb80 52 65 73 20 29 20 2a 70 52 65 73 20 3d 20 30 3b  Res ) *pRes = 0;
1bb90 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1bba0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1bbb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1bbc0 20 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a       if( c<0 ){.
1bbd0 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 70 43          lwr = pC
1bbe0 75 72 2d 3e 69 64 78 2b 31 3b 0a 20 20 20 20 20  ur->idx+1;.     
1bbf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1bc00 75 70 72 20 3d 20 70 43 75 72 2d 3e 69 64 78 2d  upr = pCur->idx-
1bc10 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
1bc20 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72  .    assert( lwr
1bc30 3d 3d 75 70 72 2b 31 20 29 3b 0a 20 20 20 20 61  ==upr+1 );.    a
1bc40 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
1bc50 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20  Init );.    if( 
1bc60 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
1bc70 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 30 3b       chldPg = 0;
1bc80 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  .    }else if( l
1bc90 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  wr>=pPage->nCell
1bca0 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67   ){.      chldPg
1bcb0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
1bcc0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
1bcd0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
1bce0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1bcf0 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79   chldPg = get4by
1bd00 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  te(findCell(pPag
1bd10 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a  e, lwr));.    }.
1bd20 20 20 20 20 69 66 28 20 63 68 6c 64 50 67 3d 3d      if( chldPg==
1bd30 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
1bd40 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20  t( pCur->idx>=0 
1bd50 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 43 75  && pCur->idx<pCu
1bd60 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  r->pPage->nCell 
1bd70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 65  );.      if( pRe
1bd80 73 20 29 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20  s ) *pRes = c;. 
1bd90 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1bda0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
1bdb0 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 6c 77 72   pCur->idx = lwr
1bdc0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f  ;.    pCur->info
1bdd0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
1bde0 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
1bdf0 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a  (pCur, chldPg);.
1be00 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1be10 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1be20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 4e 4f     }.  }.  /* NO
1be30 54 20 52 45 41 43 48 45 44 20 2a 2f 0a 7d 0a 0a  T REACHED */.}..
1be40 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
1be50 45 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  E if the cursor 
1be60 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20  is not pointing 
1be70 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74  at an entry of t
1be80 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
1be90 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74  TRUE will be ret
1bea0 75 72 6e 65 64 20 61 66 74 65 72 20 61 20 63 61  urned after a ca
1beb0 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
1bec0 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a  eeNext() moves.*
1bed0 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20  * past the last 
1bee0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
1bef0 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72  le or sqlite3Btr
1bf00 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70  eePrev() moves p
1bf10 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  ast.** the first
1bf20 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73   entry.  TRUE is
1bf30 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69   also returned i
1bf40 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
1bf50 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
1bf60 69 74 65 33 42 74 72 65 65 45 6f 66 28 42 74 43  ite3BtreeEof(BtC
1bf70 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1bf80 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66  /* TODO: What if
1bf90 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 69   the cursor is i
1bfa0 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  n CURSOR_REQUIRE
1bfb0 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62  SEEK but all tab
1bfc0 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20  le entries.  ** 
1bfd0 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65  have been delete
1bfe0 64 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c  d? This API will
1bff0 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20   need to change 
1c000 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  to return an err
1c010 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20  or code.  ** as 
1c020 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c  well as the bool
1c030 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65  ean result value
1c040 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ..  */.  return 
1c050 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70  (CURSOR_VALID!=p
1c060 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a  Cur->eState);.}.
1c070 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  ./*.** Advance t
1c080 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
1c090 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74   next entry in t
1c0a0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
1c0b0 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74  .** successful t
1c0c0 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e  hen set *pRes=0.
1c0d0 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a    If the cursor.
1c0e0 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70  ** was already p
1c0f0 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c  ointing to the l
1c100 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
1c110 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
1c120 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
1c130 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65   was called, the
1c140 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a  n set *pRes=1..*
1c150 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1c160 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20  eeNext(BtCursor 
1c170 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
1c180 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
1c190 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
1c1a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1c1b0 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
1c1c0 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f  .  rc = restoreO
1c1d0 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69  rClearCursorPosi
1c1e0 74 69 6f 6e 28 70 43 75 72 2c 20 31 29 3b 0a 20  tion(pCur, 1);. 
1c1f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1c200 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
1c210 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70   rc;.  }.  if( p
1c220 43 75 72 2d 3e 73 6b 69 70 3e 30 20 29 7b 0a 20  Cur->skip>0 ){. 
1c230 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20     pCur->skip = 
1c240 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30  0;.    *pRes = 0
1c250 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1c260 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43  ITE_OK;.  }.  pC
1c270 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 23 65  ur->skip = 0;.#e
1c280 6e 64 69 66 20 0a 0a 20 20 61 73 73 65 72 74 28  ndif ..  assert(
1c290 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 70 50   pRes!=0 );.  pP
1c2a0 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
1c2b0 65 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f  e;.  if( CURSOR_
1c2c0 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
1c2d0 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52  State ){.    *pR
1c2e0 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  es = 1;.    retu
1c2f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1c300 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
1c310 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61  e->isInit );.  a
1c320 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78  ssert( pCur->idx
1c330 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
1c340 0a 0a 20 20 70 43 75 72 2d 3e 69 64 78 2b 2b 3b  ..  pCur->idx++;
1c350 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
1c360 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  ize = 0;.  if( p
1c370 43 75 72 2d 3e 69 64 78 3e 3d 70 50 61 67 65 2d  Cur->idx>=pPage-
1c380 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66  >nCell ){.    if
1c390 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
1c3a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  {.      rc = mov
1c3b0 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67  eToChild(pCur, g
1c3c0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
1c3d0 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
1c3e0 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20  Offset+8]));.   
1c3f0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
1c400 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 63 20  rn rc;.      rc 
1c410 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  = moveToLeftmost
1c420 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70  (pCur);.      *p
1c430 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
1c440 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1c450 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66      do{.      if
1c460 28 20 69 73 52 6f 6f 74 50 61 67 65 28 70 50 61  ( isRootPage(pPa
1c470 67 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  ge) ){.        *
1c480 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  pRes = 1;.      
1c490 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
1c4a0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
1c4b0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1c4c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
1c4d0 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50   }.      moveToP
1c4e0 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20  arent(pCur);.   
1c4f0 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d     pPage = pCur-
1c500 3e 70 50 61 67 65 3b 0a 20 20 20 20 7d 77 68 69  >pPage;.    }whi
1c510 6c 65 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 70  le( pCur->idx>=p
1c520 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
1c530 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
1c540 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
1c550 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 72  fData ){.      r
1c560 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1c570 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73 29  Next(pCur, pRes)
1c580 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1c590 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1c5a0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  K;.    }.    ret
1c5b0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70  urn rc;.  }.  *p
1c5c0 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Res = 0;.  if( p
1c5d0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1c5e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c5f0 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6d  OK;.  }.  rc = m
1c600 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
1c610 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ur);.  return rc
1c620 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20  ;.}../*.** Step 
1c630 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
1c640 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72  e back to the pr
1c650 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20  evious entry in 
1c660 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
1c670 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20  f.** successful 
1c680 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30  then set *pRes=0
1c690 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  .  If the cursor
1c6a0 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20  .** was already 
1c6b0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
1c6c0 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74  first entry in t
1c6d0 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  he database befo
1c6e0 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  re.** this routi
1c6f0 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74  ne was called, t
1c700 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e  hen set *pRes=1.
1c710 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1c720 74 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43  treePrevious(BtC
1c730 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
1c740 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
1c750 63 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  c;.  Pgno pgno;.
1c760 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1c770 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
1c780 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
1c790 43 48 45 0a 20 20 72 63 20 3d 20 72 65 73 74 6f  CHE.  rc = resto
1c7a0 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50  reOrClearCursorP
1c7b0 6f 73 69 74 69 6f 6e 28 70 43 75 72 2c 20 31 29  osition(pCur, 1)
1c7c0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1c7d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
1c7e0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66  urn rc;.  }.  if
1c7f0 28 20 70 43 75 72 2d 3e 73 6b 69 70 3c 30 20 29  ( pCur->skip<0 )
1c800 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70  {.    pCur->skip
1c810 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20   = 0;.    *pRes 
1c820 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
1c830 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1c840 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b   pCur->skip = 0;
1c850 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 43  .#endif..  if( C
1c860 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
1c870 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
1c880 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
1c890 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c8a0 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65  OK;.  }..  pPage
1c8b0 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
1c8c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
1c8d0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73  >isInit );.  ass
1c8e0 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d  ert( pCur->idx>=
1c8f0 30 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  0 );.  if( !pPag
1c900 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70  e->leaf ){.    p
1c910 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 20  gno = get4byte( 
1c920 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
1c930 70 43 75 72 2d 3e 69 64 78 29 20 29 3b 0a 20 20  pCur->idx) );.  
1c940 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
1c950 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
1c960 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
1c970 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  urn rc;.    rc =
1c980 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
1c990 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pCur);.  }else{
1c9a0 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75 72  .    while( pCur
1c9b0 2d 3e 69 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20  ->idx==0 ){.    
1c9c0 20 20 69 66 28 20 69 73 52 6f 6f 74 50 61 67 65    if( isRootPage
1c9d0 28 70 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20  (pPage) ){.     
1c9e0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
1c9f0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
1ca00 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20  ;.        *pRes 
1ca10 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 1;.        ret
1ca20 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1ca30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76       }.      mov
1ca40 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b  eToParent(pCur);
1ca50 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70  .      pPage = p
1ca60 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20  Cur->pPage;.    
1ca70 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 64 78 2d  }.    pCur->idx-
1ca80 2d 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66  -;.    pCur->inf
1ca90 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  o.nSize = 0;.   
1caa0 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
1cab0 44 61 74 61 20 26 26 20 21 70 50 61 67 65 2d 3e  Data && !pPage->
1cac0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
1cad0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
1cae0 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52  revious(pCur, pR
1caf0 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  es);.    }else{.
1cb00 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1cb10 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
1cb20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 72    *pRes = 0;.  r
1cb30 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1cb40 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
1cb50 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  w page from the 
1cb60 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1cb70 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67  *.** The new pag
1cb80 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64  e is marked as d
1cb90 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72  irty.  (In other
1cba0 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 70   words, sqlite3p
1cbb0 61 67 65 72 5f 77 72 69 74 65 28 29 0a 2a 2a 20  ager_write().** 
1cbc0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1cbd0 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e   called on the n
1cbe0 65 77 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e  ew page.)  The n
1cbf0 65 77 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f  ew page has also
1cc00 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e  .** been referen
1cc10 63 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c  ced and the call
1cc20 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72  ing routine is r
1cc30 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63  esponsible for c
1cc40 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65  alling.** sqlite
1cc50 33 70 61 67 65 72 5f 75 6e 72 65 66 28 29 20 6f  3pager_unref() o
1cc60 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 77  n the new page w
1cc70 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a  hen it is done..
1cc80 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
1cc90 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
1cca0 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68  uccess.  Any oth
1ccb0 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  er return value 
1ccc0 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20  indicates.** an 
1ccd0 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20  error.  *ppPage 
1cce0 61 6e 64 20 2a 70 50 67 6e 6f 20 61 72 65 20 75  and *pPgno are u
1ccf0 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20  ndefined in the 
1cd00 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f  event of an erro
1cd10 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76  r..** Do not inv
1cd20 6f 6b 65 20 73 71 6c 69 74 65 33 70 61 67 65 72  oke sqlite3pager
1cd30 5f 75 6e 72 65 66 28 29 20 6f 6e 20 2a 70 70 50  _unref() on *ppP
1cd40 61 67 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20  age if an error 
1cd50 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
1cd60 2a 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72 62  ** If the "nearb
1cd70 79 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  y" parameter is 
1cd80 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61 20 28 66  not 0, then a (f
1cd90 65 65 62 6c 65 29 20 65 66 66 6f 72 74 20 69 73  eeble) effort is
1cda0 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63   made to .** loc
1cdb0 61 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73 65  ate a page close
1cdc0 20 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75 6d   to the page num
1cdd0 62 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20 54  ber "nearby".  T
1cde0 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20  his can be used 
1cdf0 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74  in an.** attempt
1ce00 20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65 64   to keep related
1ce10 20 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f 20   pages close to 
1ce20 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68  each other in th
1ce30 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
1ce40 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75 72  .** which in tur
1ce50 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61 62  n can make datab
1ce60 61 73 65 20 61 63 63 65 73 73 20 66 61 73 74 65  ase access faste
1ce70 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
1ce80 22 65 78 61 63 74 22 20 70 61 72 61 6d 65 74 65  "exact" paramete
1ce90 72 20 69 73 20 6e 6f 74 20 30 2c 20 61 6e 64 20  r is not 0, and 
1cea0 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  the page-number 
1ceb0 6e 65 61 72 62 79 20 65 78 69 73 74 73 20 0a 2a  nearby exists .*
1cec0 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68  * anywhere on th
1ced0 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65  e free-list, the
1cee0 6e 20 69 74 20 69 73 20 67 75 61 72 65 6e 74 65  n it is guarente
1cef0 65 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ed to be returne
1cf00 64 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e  d. This.** is on
1cf10 6c 79 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d  ly used by auto-
1cf20 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 73  vacuum databases
1cf30 20 77 68 65 6e 20 61 6c 6c 6f 63 61 74 69 6e 67   when allocating
1cf40 20 61 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2f   a new table..*/
1cf50 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
1cf60 63 61 74 65 50 61 67 65 28 0a 20 20 42 74 53 68  catePage(.  BtSh
1cf70 61 72 65 64 20 2a 70 42 74 2c 20 0a 20 20 4d 65  ared *pBt, .  Me
1cf80 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
1cf90 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20  .  Pgno *pPgno, 
1cfa0 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 0a  .  Pgno nearby,.
1cfb0 20 20 75 38 20 65 78 61 63 74 0a 29 7b 0a 20 20    u8 exact.){.  
1cfc0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
1cfd0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
1cfe0 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   n;     /* Numbe
1cff0 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68  r of pages on th
1d000 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
1d010 69 6e 74 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75  int k;     /* Nu
1d020 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f  mber of leaves o
1d030 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74  n the trunk of t
1d040 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 0a  he freelist */..
1d050 20 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e    pPage1 = pBt->
1d060 70 50 61 67 65 31 3b 0a 20 20 6e 20 3d 20 67 65  pPage1;.  n = ge
1d070 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
1d080 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 69 66  aData[36]);.  if
1d090 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ( n>0 ){.    /* 
1d0a0 54 68 65 72 65 20 61 72 65 20 70 61 67 65 73 20  There are pages 
1d0b0 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  on the freelist.
1d0c0 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74    Reuse one of t
1d0d0 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20  hose pages. */. 
1d0e0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75     MemPage *pTru
1d0f0 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 50 67 6e 6f  nk = 0;.    Pgno
1d100 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 4d 65 6d   iTrunk;.    Mem
1d110 50 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b  Page *pPrevTrunk
1d120 20 3d 20 30 3b 0a 20 20 20 20 75 38 20 73 65 61   = 0;.    u8 sea
1d130 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20  rchList = 0; /* 
1d140 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  If the free-list
1d150 20 6d 75 73 74 20 62 65 20 73 65 61 72 63 68 65   must be searche
1d160 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a  d for 'nearby' *
1d170 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66  /.    .    /* If
1d180 20 74 68 65 20 27 65 78 61 63 74 27 20 70 61 72   the 'exact' par
1d190 61 6d 65 74 65 72 20 77 61 73 20 74 72 75 65 20  ameter was true 
1d1a0 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74  and a query of t
1d1b0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
1d1c0 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74     ** shows that
1d1d0 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
1d1e0 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20  y' is somewhere 
1d1f0 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
1d200 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68  , then.    ** th
1d210 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69  e entire-list wi
1d220 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66  ll be searched f
1d230 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20  or that page..  
1d240 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
1d250 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1d260 55 55 4d 0a 20 20 20 20 69 66 28 20 65 78 61 63  UUM.    if( exac
1d270 74 20 29 7b 0a 20 20 20 20 20 20 75 38 20 65 54  t ){.      u8 eT
1d280 79 70 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ype;.      asser
1d290 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20  t( nearby>0 );. 
1d2a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
1d2b0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a  ->autoVacuum );.
1d2c0 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
1d2d0 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79  pGet(pBt, nearby
1d2e0 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20  , &eType, 0);.  
1d2f0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
1d300 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 69 66  urn rc;.      if
1d310 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1d320 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20  FREEPAGE ){.    
1d330 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
1d340 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
1d350 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 65 61 72 62    *pPgno = nearb
1d360 79 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  y;.    }.#endif.
1d370 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  .    /* Decremen
1d380 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  t the free-list 
1d390 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20  count by 1. Set 
1d3a0 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e  iTrunk to the in
1d3b0 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  dex of the.    *
1d3c0 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73  * first free-lis
1d3d0 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50  t trunk page. iP
1d3e0 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74  revTrunk is init
1d3f0 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a  ially 1..    */.
1d400 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1d410 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67  pager_write(pPag
1d420 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  e1->aData);.    
1d430 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1d440 72 63 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65  rc;.    put4byte
1d450 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
1d460 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20  36], n-1);..    
1d470 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74 68  /* The code with
1d480 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20  in this loop is 
1d490 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66  run only once if
1d4a0 20 74 68 65 20 27 73 65 61 72 63 68 4c 69 73 74   the 'searchList
1d4b0 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a  ' variable.    *
1d4c0 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f  * is not true. O
1d4d0 74 68 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e  therwise, it run
1d4e0 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  s once for each 
1d4f0 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68  trunk-page on th
1d500 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69  e.    ** free-li
1d510 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67  st until the pag
1d520 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f  e 'nearby' is lo
1d530 63 61 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  cated..    */.  
1d540 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72    do {.      pPr
1d550 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b  evTrunk = pTrunk
1d560 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65  ;.      if( pPre
1d570 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  vTrunk ){.      
1d580 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62    iTrunk = get4b
1d590 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d  yte(&pPrevTrunk-
1d5a0 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20  >aData[0]);.    
1d5b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1d5c0 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
1d5d0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
1d5e0 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  a[32]);.      }.
1d5f0 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 50 61        rc = getPa
1d600 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20  ge(pBt, iTrunk, 
1d610 26 70 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  &pTrunk);.      
1d620 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
1d630 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
1d640 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  revTrunk);.     
1d650 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1d660 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
1d670 54 4f 44 4f 3a 20 54 68 69 73 20 73 68 6f 75 6c  TODO: This shoul
1d680 64 20 6d 6f 76 65 20 74 6f 20 61 66 74 65 72 20  d move to after 
1d690 74 68 65 20 6c 6f 6f 70 3f 20 2a 2f 0a 20 20 20  the loop? */.   
1d6a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70     rc = sqlite3p
1d6b0 61 67 65 72 5f 77 72 69 74 65 28 70 54 72 75 6e  ager_write(pTrun
1d6c0 6b 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20  k->aData);.     
1d6d0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1d6e0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1d6f0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
1d700 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65  releasePage(pPre
1d710 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  vTrunk);.       
1d720 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1d730 20 20 7d 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67    }..      k = g
1d740 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
1d750 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20  >aData[4]);.    
1d760 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73    if( k==0 && !s
1d770 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20  earchList ){.   
1d780 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e       /* The trun
1d790 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20  k has no leaves 
1d7a0 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73 20  and the list is 
1d7b0 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63 68  not being search
1d7c0 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ed. .        ** 
1d7d0 53 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 74  So extract the t
1d7e0 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66  runk page itself
1d7f0 20 61 6e 64 20 75 73 65 20 69 74 20 61 73 20 74   and use it as t
1d800 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20  he newly .      
1d810 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70    ** allocated p
1d820 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  age */.        a
1d830 73 73 65 72 74 28 20 70 50 72 65 76 54 72 75 6e  ssert( pPrevTrun
1d840 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  k==0 );.        
1d850 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b  *pPgno = iTrunk;
1d860 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
1d870 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
1d880 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  2], &pTrunk->aDa
1d890 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
1d8a0 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72     *ppPage = pTr
1d8b0 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72  unk;.        pTr
1d8c0 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
1d8d0 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
1d8e0 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64  E: %d trunk - %d
1d8f0 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74   free pages left
1d900 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31  \n", *pPgno, n-1
1d910 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ));.      }else 
1d920 69 66 28 20 6b 3e 70 42 74 2d 3e 75 73 61 62 6c  if( k>pBt->usabl
1d930 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20  eSize/4 - 8 ){. 
1d940 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
1d950 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72  of k is out of r
1d960 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65 20  ange.  Database 
1d970 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20  corruption */.  
1d980 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1d990 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1d9a0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1d9b0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1d9c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1d9d0 20 73 65 61 72 63 68 4c 69 73 74 20 26 26 20 6e   searchList && n
1d9e0 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 29 7b  earby==iTrunk ){
1d9f0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
1da00 6c 69 73 74 20 69 73 20 62 65 69 6e 67 20 73 65  list is being se
1da10 61 72 63 68 65 64 20 61 6e 64 20 74 68 69 73 20  arched and this 
1da20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68  trunk page is th
1da30 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
1da40 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72  * to allocate, r
1da50 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
1da60 74 68 65 72 20 69 74 20 68 61 73 20 6c 65 61 76  ther it has leav
1da70 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
1da80 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2a         assert( *
1da90 70 50 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b  pPgno==iTrunk );
1daa0 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65  .        *ppPage
1dab0 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = pTrunk;.     
1dac0 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
1dad0 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b  0;.        if( k
1dae0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1daf0 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b   if( !pPrevTrunk
1db00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1db10 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e  memcpy(&pPage1->
1db20 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75  aData[32], &pTru
1db30 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
1db40 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
1db50 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  e{.            m
1db60 65 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e  emcpy(&pPrevTrun
1db70 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54  k->aData[0], &pT
1db80 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
1db90 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  4);.          }.
1dba0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1dbb0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1dbc0 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65  trunk page is re
1dbd0 71 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61  quired by the ca
1dbe0 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74  ller but it cont
1dbf0 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20  ains .          
1dc00 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66  ** pointers to f
1dc10 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e  ree-list leaves.
1dc20 20 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20   The first leaf 
1dc30 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a  becomes a trunk.
1dc40 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67            ** pag
1dc50 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  e in this case..
1dc60 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
1dc70 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
1dc80 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20  pNewTrunk;.     
1dc90 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72       Pgno iNewTr
1dca0 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
1dcb0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d  pTrunk->aData[8]
1dcc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
1dcd0 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c 20 69  = getPage(pBt, i
1dce0 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54  NewTrunk, &pNewT
1dcf0 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
1dd00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1dd10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1dd20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
1dd30 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
1dd40 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1dd50 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20  PrevTrunk);.    
1dd60 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1dd70 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  c;.          }. 
1dd80 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1dd90 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
1dda0 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74  (pNewTrunk->aDat
1ddb0 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  a);.          if
1ddc0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1ddd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
1dde0 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54  eleasePage(pNewT
1ddf0 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
1de00 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1de10 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
1de20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1de30 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20  pPrevTrunk);.   
1de40 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1de50 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  rc;.          }.
1de60 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
1de70 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
1de80 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[0], &pTrunk->
1de90 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
1dea0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
1deb0 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
1dec0 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20  ta[4], k-1);.   
1ded0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
1dee0 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
1def0 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  8], &pTrunk->aDa
1df00 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29  ta[12], (k-1)*4)
1df10 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1df20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
1df30 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
1df40 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
1df50 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e  ta[32], iNewTrun
1df60 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  k);.          }e
1df70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1df80 20 70 75 74 34 62 79 74 65 28 26 70 50 72 65 76   put4byte(&pPrev
1df90 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
1dfa0 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20   iNewTrunk);.   
1dfb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1dfc0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1dfd0 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
1dfe0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72     }.        pTr
1dff0 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
1e000 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
1e010 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64  E: %d trunk - %d
1e020 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74   free pages left
1e030 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31  \n", *pPgno, n-1
1e040 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ));.#endif.     
1e050 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1e060 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65 61  /* Extract a lea
1e070 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b  f from the trunk
1e080 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
1e090 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20  closest;.       
1e0a0 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20   Pgno iPage;.   
1e0b0 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
1e0c0 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75  ar *aData = pTru
1e0d0 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20  nk->aData;.     
1e0e0 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20     if( nearby>0 
1e0f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
1e100 20 69 2c 20 64 69 73 74 3b 0a 20 20 20 20 20 20   i, dist;.      
1e110 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b      closest = 0;
1e120 0a 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20  .          dist 
1e130 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74  = get4byte(&aDat
1e140 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a  a[8]) - nearby;.
1e150 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 69            if( di
1e160 73 74 3c 30 20 29 20 64 69 73 74 20 3d 20 2d 64  st<0 ) dist = -d
1e170 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 66  ist;.          f
1e180 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b  or(i=1; i<k; i++
1e190 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
1e1a0 6e 74 20 64 32 20 3d 20 67 65 74 34 62 79 74 65  nt d2 = get4byte
1e1b0 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20  (&aData[8+i*4]) 
1e1c0 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20 20  - nearby;.      
1e1d0 20 20 20 20 20 20 69 66 28 20 64 32 3c 30 20 29        if( d2<0 )
1e1e0 20 64 32 20 3d 20 2d 64 32 3b 0a 20 20 20 20 20   d2 = -d2;.     
1e1f0 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 64 69         if( d2<di
1e200 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
1e210 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b      closest = i;
1e220 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  .              d
1e230 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20  ist = d2;.      
1e240 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e250 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
1e260 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f  e{.          clo
1e270 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  sest = 0;.      
1e280 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61    }..        iPa
1e290 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
1e2a0 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34  Data[8+closest*4
1e2b0 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ]);.        if( 
1e2c0 21 73 65 61 72 63 68 4c 69 73 74 20 7c 7c 20 69  !searchList || i
1e2d0 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 29 7b 0a  Page==nearby ){.
1e2e0 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f            *pPgno
1e2f0 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20   = iPage;.      
1e300 20 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3e 73      if( *pPgno>s
1e310 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65  qlite3pager_page
1e320 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
1e330 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
1e340 20 20 2f 2a 20 46 72 65 65 20 70 61 67 65 20 6f    /* Free page o
1e350 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ff the end of th
1e360 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20  e file */.      
1e370 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1e380 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1e390 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1e3a0 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
1e3b0 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73  ALLOCATE: %d was
1e3c0 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f   leaf %d of %d o
1e3d0 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20  n trunk %d".    
1e3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3a 20               ": 
1e3f0 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67  %d more free pag
1e400 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  es\n",.         
1e410 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20          *pPgno, 
1e420 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54  closest+1, k, pT
1e430 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29  runk->pgno, n-1)
1e440 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1e450 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a   closest<k-1 ){.
1e460 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
1e470 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73  py(&aData[8+clos
1e480 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34  est*4], &aData[4
1e490 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20  +k*4], 4);.     
1e4a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1e4b0 20 70 75 74 34 62 79 74 65 28 26 61 44 61 74 61   put4byte(&aData
1e4c0 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20  [4], k-1);.     
1e4d0 20 20 20 20 20 72 63 20 3d 20 67 65 74 50 61 67       rc = getPag
1e4e0 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70  e(pBt, *pPgno, p
1e4f0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
1e500 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1e510 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1e520 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
1e530 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 28 2a  dont_rollback((*
1e540 70 70 50 61 67 65 29 2d 3e 61 44 61 74 61 29 3b  ppPage)->aData);
1e550 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
1e560 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77  = sqlite3pager_w
1e570 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e  rite((*ppPage)->
1e580 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20  aData);.        
1e590 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1e5a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1e5b0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
1e5c0 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
1e5d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1e5e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1e5f0 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
1e600 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1e610 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65   }.      release
1e620 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29  Page(pPrevTrunk)
1e630 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65  ;.    }while( se
1e640 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 20 20  archList );.    
1e650 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75  releasePage(pTru
1e660 6e 6b 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  nk);.  }else{.  
1e670 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e    /* There are n
1e680 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  o pages on the f
1e690 72 65 65 6c 69 73 74 2c 20 73 6f 20 63 72 65 61  reelist, so crea
1e6a0 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 61 74  te a new page at
1e6b0 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 64 20   the.    ** end 
1e6c0 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  of the file */. 
1e6d0 20 20 20 2a 70 50 67 6e 6f 20 3d 20 73 71 6c 69     *pPgno = sqli
1e6e0 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75  te3pager_pagecou
1e6f0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20  nt(pBt->pPager) 
1e700 2b 20 31 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  + 1;..#ifndef SQ
1e710 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1e720 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
1e730 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20  ->autoVacuum && 
1e740 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
1e750 74 2c 20 2a 70 50 67 6e 6f 29 20 29 7b 0a 20 20  t, *pPgno) ){.  
1e760 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f      /* If *pPgno
1e770 20 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f 69   refers to a poi
1e780 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 61  nter-map page, a
1e790 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77 20  llocate two new 
1e7a0 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 61  pages.      ** a
1e7b0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
1e7c0 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66   file instead of
1e7d0 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74 20   one. The first 
1e7e0 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a 20  allocated page. 
1e7f0 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20       ** becomes 
1e800 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61  a new pointer-ma
1e810 70 20 70 61 67 65 2c 20 74 68 65 20 73 65 63 6f  p page, the seco
1e820 6e 64 20 69 73 20 75 73 65 64 20 62 79 20 74 68  nd is used by th
1e830 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20  e caller..      
1e840 2a 2f 0a 20 20 20 20 20 20 54 52 41 43 45 28 28  */.      TRACE((
1e850 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72  "ALLOCATE: %d fr
1e860 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28  om end of file (
1e870 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
1e880 29 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a  )\n", *pPgno));.
1e890 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2a 70        assert( *p
1e8a0 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
1e8b0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
1e8c0 20 20 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b        (*pPgno)++
1e8d0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
1e8e0 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67      assert( *pPg
1e8f0 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
1e900 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20  _PAGE(pBt) );.  
1e910 20 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70    rc = getPage(p
1e920 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61  Bt, *pPgno, ppPa
1e930 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
1e940 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1e950 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
1e960 65 72 5f 77 72 69 74 65 28 28 2a 70 70 50 61 67  er_write((*ppPag
1e970 65 29 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  e)->aData);.    
1e980 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1e990 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
1e9a0 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
1e9b0 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45  .    }.    TRACE
1e9c0 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
1e9d0 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65  from end of file
1e9e0 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20  \n", *pPgno));. 
1e9f0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70   }..  assert( *p
1ea00 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
1ea10 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
1ea20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1ea30 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 70 61 67 65  /*.** Add a page
1ea40 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1ea50 20 66 69 6c 65 20 74 6f 20 74 68 65 20 66 72 65   file to the fre
1ea60 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 73 71 6c  elist..**.** sql
1ea70 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28  ite3pager_unref(
1ea80 29 20 69 73 20 4e 4f 54 20 63 61 6c 6c 65 64 20  ) is NOT called 
1ea90 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74  for pPage..*/.st
1eaa0 61 74 69 63 20 69 6e 74 20 66 72 65 65 50 61 67  atic int freePag
1eab0 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
1eac0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
1ead0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
1eae0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1eaf0 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
1eb00 3b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 2c 20 6b  ;.  int rc, n, k
1eb10 3b 0a 0a 20 20 2f 2a 20 50 72 65 70 61 72 65 20  ;..  /* Prepare 
1eb20 74 68 65 20 70 61 67 65 20 66 6f 72 20 66 72 65  the page for fre
1eb30 65 69 6e 67 20 2a 2f 0a 20 20 61 73 73 65 72 74  eing */.  assert
1eb40 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3e 31 20  ( pPage->pgno>1 
1eb50 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  );.  pPage->isIn
1eb60 69 74 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73  it = 0;.  releas
1eb70 65 50 61 67 65 28 70 50 61 67 65 2d 3e 70 50 61  ePage(pPage->pPa
1eb80 72 65 6e 74 29 3b 0a 20 20 70 50 61 67 65 2d 3e  rent);.  pPage->
1eb90 70 50 61 72 65 6e 74 20 3d 20 30 3b 0a 0a 20 20  pParent = 0;..  
1eba0 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  /* Increment the
1ebb0 20 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74   free page count
1ebc0 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20   on pPage1 */.  
1ebd0 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
1ebe0 72 5f 77 72 69 74 65 28 70 50 61 67 65 31 2d 3e  r_write(pPage1->
1ebf0 61 44 61 74 61 29 3b 0a 20 20 69 66 28 20 72 63  aData);.  if( rc
1ec00 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1ec10 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  n = get4byte(&pP
1ec20 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
1ec30 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
1ec40 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
1ec50 20 6e 2b 31 29 3b 0a 0a 23 69 66 64 65 66 20 53   n+1);..#ifdef S
1ec60 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c  QLITE_SECURE_DEL
1ec70 45 54 45 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  ETE.  /* If the 
1ec80 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45  SQLITE_SECURE_DE
1ec90 4c 45 54 45 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  LETE compile-tim
1eca0 65 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62  e option is enab
1ecb0 6c 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61  led, then.  ** a
1ecc0 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72  lways fully over
1ecd0 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e  write deleted in
1ece0 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a  formation with z
1ecf0 65 72 6f 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  eros..  */.  rc 
1ed00 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77  = sqlite3pager_w
1ed10 72 69 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  rite(pPage->aDat
1ed20 61 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  a);.  if( rc ) r
1ed30 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 73  eturn rc;.  mems
1ed40 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  et(pPage->aData,
1ed50 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e   0, pPage->pBt->
1ed60 70 61 67 65 53 69 7a 65 29 3b 0a 23 65 6e 64 69  pageSize);.#endi
1ed70 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
1ed80 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1ed90 4d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61  M.  /* If the da
1eda0 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
1edb0 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69  auto-vacuum, wri
1edc0 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  te an entry in t
1edd0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
1ede0 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20   ** to indicate 
1edf0 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
1ee00 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   free..  */.  if
1ee10 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
1ee20 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 74  m ){.    rc = pt
1ee30 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 50 61  rmapPut(pBt, pPa
1ee40 67 65 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50  ge->pgno, PTRMAP
1ee50 5f 46 52 45 45 50 41 47 45 2c 20 30 29 3b 0a 20  _FREEPAGE, 0);. 
1ee60 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
1ee70 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69  rn rc;.  }.#endi
1ee80 66 0a 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b  f..  if( n==0 ){
1ee90 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
1eea0 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20 70  the first free p
1eeb0 61 67 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  age */.    rc = 
1eec0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
1eed0 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29  te(pPage->aData)
1eee0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
1eef0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6d 65  eturn rc;.    me
1ef00 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74  mset(pPage->aDat
1ef10 61 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20 70 75  a, 0, 8);.    pu
1ef20 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
1ef30 61 44 61 74 61 5b 33 32 5d 2c 20 70 50 61 67 65  aData[32], pPage
1ef40 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 54 52 41  ->pgno);.    TRA
1ef50 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20  CE(("FREE-PAGE: 
1ef60 25 64 20 66 69 72 73 74 5c 6e 22 2c 20 70 50 61  %d first\n", pPa
1ef70 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d 65  ge->pgno));.  }e
1ef80 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 74 68 65  lse{.    /* Othe
1ef90 72 20 66 72 65 65 20 70 61 67 65 73 20 61 6c 72  r free pages alr
1efa0 65 61 64 79 20 65 78 69 73 74 2e 20 20 52 65 74  eady exist.  Ret
1efb0 72 69 76 65 20 74 68 65 20 66 69 72 73 74 20 74  rive the first t
1efc0 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 2a 2a  runk page.    **
1efd0 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   of the freelist
1efe0 20 61 6e 64 20 66 69 6e 64 20 6f 75 74 20 68 6f   and find out ho
1eff0 77 20 6d 61 6e 79 20 6c 65 61 76 65 73 20 69 74  w many leaves it
1f000 20 68 61 73 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d   has. */.    Mem
1f010 50 61 67 65 20 2a 70 54 72 75 6e 6b 3b 0a 20 20  Page *pTrunk;.  
1f020 20 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70    rc = getPage(p
1f030 42 74 2c 20 67 65 74 34 62 79 74 65 28 26 70 50  Bt, get4byte(&pP
1f040 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29  age1->aData[32])
1f050 2c 20 26 70 54 72 75 6e 6b 29 3b 0a 20 20 20 20  , &pTrunk);.    
1f060 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1f070 72 63 3b 0a 20 20 20 20 6b 20 3d 20 67 65 74 34  rc;.    k = get4
1f080 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
1f090 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 69 66 28  ata[4]);.    if(
1f0a0 20 6b 3e 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53   k>=pBt->usableS
1f0b0 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20  ize/4 - 8 ){.   
1f0c0 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20     /* The trunk 
1f0d0 69 73 20 66 75 6c 6c 2e 20 20 54 75 72 6e 20 74  is full.  Turn t
1f0e0 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72  he page being fr
1f0f0 65 65 64 20 69 6e 74 6f 20 61 20 6e 65 77 0a 20  eed into a new. 
1f100 20 20 20 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61       ** trunk pa
1f110 67 65 20 77 69 74 68 20 6e 6f 20 6c 65 61 76 65  ge with no leave
1f120 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  s. */.      rc =
1f130 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
1f140 69 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  ite(pPage->aData
1f150 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
1f160 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1f170 20 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67     put4byte(pPag
1f180 65 2d 3e 61 44 61 74 61 2c 20 70 54 72 75 6e 6b  e->aData, pTrunk
1f190 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 70  ->pgno);.      p
1f1a0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  ut4byte(&pPage->
1f1b0 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20  aData[4], 0);.  
1f1c0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
1f1d0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
1f1e0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
1f1f0 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45       TRACE(("FRE
1f200 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74  E-PAGE: %d new t
1f210 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63  runk page replac
1f220 69 6e 67 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ing %d\n",.     
1f230 20 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e           pPage->
1f240 70 67 6e 6f 2c 20 70 54 72 75 6e 6b 2d 3e 70 67  pgno, pTrunk->pg
1f250 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  no));.    }else{
1f260 0a 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68  .      /* Add th
1f270 65 20 6e 65 77 6c 79 20 66 72 65 65 64 20 70 61  e newly freed pa
1f280 67 65 20 61 73 20 61 20 6c 65 61 66 20 6f 6e 20  ge as a leaf on 
1f290 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 75 6e  the current trun
1f2a0 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  k */.      rc = 
1f2b0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
1f2c0 74 65 28 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  te(pTrunk->aData
1f2d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
1f2e0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1f2f0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72     put4byte(&pTr
1f300 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b  unk->aData[4], k
1f310 2b 31 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62  +1);.      put4b
1f320 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
1f330 74 61 5b 38 2b 6b 2a 34 5d 2c 20 70 50 61 67 65  ta[8+k*4], pPage
1f340 2d 3e 70 67 6e 6f 29 3b 0a 23 69 66 6e 64 65 66  ->pgno);.#ifndef
1f350 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44   SQLITE_SECURE_D
1f360 45 4c 45 54 45 0a 20 20 20 20 20 20 73 71 6c 69  ELETE.      sqli
1f370 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 77 72  te3pager_dont_wr
1f380 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ite(pBt->pPager,
1f390 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 23   pPage->pgno);.#
1f3a0 65 6e 64 69 66 0a 20 20 20 20 20 20 54 52 41 43  endif.      TRAC
1f3b0 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25  E(("FREE-PAGE: %
1f3c0 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20  d leaf on trunk 
1f3d0 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61 67 65  page %d\n",pPage
1f3e0 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70  ->pgno,pTrunk->p
1f3f0 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  gno));.    }.   
1f400 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72   releasePage(pTr
1f410 75 6e 6b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  unk);.  }.  retu
1f420 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1f430 46 72 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f  Free any overflo
1f440 77 20 70 61 67 65 73 20 61 73 73 6f 63 69 61 74  w pages associat
1f450 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65  ed with the give
1f460 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  n Cell..*/.stati
1f470 63 20 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28  c int clearCell(
1f480 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
1f490 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
1f4a0 43 65 6c 6c 29 7b 0a 20 20 42 74 53 68 61 72 65  Cell){.  BtShare
1f4b0 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
1f4c0 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  pBt;.  CellInfo 
1f4d0 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66  info;.  Pgno ovf
1f4e0 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b  lPgno;.  int rc;
1f4f0 0a 0a 20 20 70 61 72 73 65 43 65 6c 6c 50 74 72  ..  parseCellPtr
1f500 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
1f510 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66  info);.  if( inf
1f520 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  o.iOverflow==0 )
1f530 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1f540 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f  ITE_OK;  /* No o
1f550 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 52  verflow pages. R
1f560 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f  eturn without do
1f570 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a  ing anything */.
1f580 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d    }.  ovflPgno =
1f590 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c   get4byte(&pCell
1f5a0 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
1f5b0 29 3b 0a 20 20 77 68 69 6c 65 28 20 6f 76 66 6c  );.  while( ovfl
1f5c0 50 67 6e 6f 21 3d 30 20 29 7b 0a 20 20 20 20 4d  Pgno!=0 ){.    M
1f5d0 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 3b 0a 20  emPage *pOvfl;. 
1f5e0 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3e     if( ovflPgno>
1f5f0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67  sqlite3pager_pag
1f600 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
1f610 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  er) ){.      ret
1f620 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1f630 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
1f640 20 20 20 72 63 20 3d 20 67 65 74 50 61 67 65 28     rc = getPage(
1f650 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26  pBt, ovflPgno, &
1f660 70 4f 76 66 6c 29 3b 0a 20 20 20 20 69 66 28 20  pOvfl);.    if( 
1f670 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1f680 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67      ovflPgno = g
1f690 65 74 34 62 79 74 65 28 70 4f 76 66 6c 2d 3e 61  et4byte(pOvfl->a
1f6a0 44 61 74 61 29 3b 0a 20 20 20 20 72 63 20 3d 20  Data);.    rc = 
1f6b0 66 72 65 65 50 61 67 65 28 70 4f 76 66 6c 29 3b  freePage(pOvfl);
1f6c0 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65  .    sqlite3page
1f6d0 72 5f 75 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 61  r_unref(pOvfl->a
1f6e0 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 72  Data);.    if( r
1f6f0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1f700 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1f710 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1f720 43 72 65 61 74 65 20 74 68 65 20 62 79 74 65 20  Create the byte 
1f730 73 65 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f  sequence used to
1f740 20 72 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c   represent a cel
1f750 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a  l on page pPage.
1f760 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68 61  ** and write tha
1f770 74 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20  t byte sequence 
1f780 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f  into pCell[].  O
1f790 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72  verflow pages ar
1f7a0 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61  e.** allocated a
1f7b0 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20  nd filled in as 
1f7c0 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 20  necessary.  The 
1f7d0 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72  calling procedur
1f7e0 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69  e.** is responsi
1f7f0 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73  ble for making s
1f800 75 72 65 20 73 75 66 66 69 63 69 65 6e 74 20 73  ure sufficient s
1f810 70 61 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c  pace has been al
1f820 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70  located.** for p
1f830 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  Cell[]..**.** No
1f840 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f  te that pCell do
1f850 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  es not necessary
1f860 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74   need to point t
1f870 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61  o the pPage->aDa
1f880 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65  ta.** area.  pCe
1f890 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  ll might point t
1f8a0 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79  o some temporary
1f8b0 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63   storage.  The c
1f8c0 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63  ell will.** be c
1f8d0 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74 68  onstructed in th
1f8e0 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65  is temporary are
1f8f0 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e  a then copied in
1f900 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a  to pPage->aData.
1f910 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61  ** later..*/.sta
1f920 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65  tic int fillInCe
1f930 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
1f940 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
1f950 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
1f960 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
1f970 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73  he cell */.  uns
1f980 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
1f990 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  l,          /* C
1f9a0 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20  omplete text of 
1f9b0 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f  the cell */.  co
1f9c0 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
1f9d0 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20  i64 nKey,    /* 
1f9e0 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e  The key */.  con
1f9f0 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 69  st void *pData,i
1fa00 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54  nt nData,   /* T
1fa10 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  he data */.  int
1fa20 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20   *pnSize        
1fa30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
1fa40 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68  rite cell size h
1fa50 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
1fa60 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73  nPayload;.  cons
1fa70 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e  t u8 *pSrc;.  in
1fa80 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20  t nSrc, n, rc;. 
1fa90 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a   int spaceLeft;.
1faa0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c    MemPage *pOvfl
1fab0 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
1fac0 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b  *pToRelease = 0;
1fad0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1fae0 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69   *pPrior;.  unsi
1faf0 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c  gned char *pPayl
1fb00 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20  oad;.  BtShared 
1fb10 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
1fb20 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76  t;.  Pgno pgnoOv
1fb30 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48  fl = 0;.  int nH
1fb40 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e 66  eader;.  CellInf
1fb50 6f 20 69 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 46 69  o info;..  /* Fi
1fb60 6c 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ll in the header
1fb70 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d  . */.  nHeader =
1fb80 20 30 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   0;.  if( !pPage
1fb90 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 6e 48  ->leaf ){.    nH
1fba0 65 61 64 65 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a  eader += 4;.  }.
1fbb0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73    if( pPage->has
1fbc0 44 61 74 61 20 29 7b 0a 20 20 20 20 6e 48 65 61  Data ){.    nHea
1fbd0 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74  der += putVarint
1fbe0 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d  (&pCell[nHeader]
1fbf0 2c 20 6e 44 61 74 61 29 3b 0a 20 20 7d 65 6c 73  , nData);.  }els
1fc00 65 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30  e{.    nData = 0
1fc10 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65 72 20  ;.  }.  nHeader 
1fc20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43  += putVarint(&pC
1fc30 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28  ell[nHeader], *(
1fc40 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 70  u64*)&nKey);.  p
1fc50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
1fc60 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
1fc70 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f  ;.  assert( info
1fc80 2e 6e 48 65 61 64 65 72 3d 3d 6e 48 65 61 64 65  .nHeader==nHeade
1fc90 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  r );.  assert( i
1fca0 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29  nfo.nKey==nKey )
1fcb0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f  ;.  assert( info
1fcc0 2e 6e 44 61 74 61 3d 3d 6e 44 61 74 61 20 29 3b  .nData==nData );
1fcd0 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  .  .  /* Fill in
1fce0 20 74 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a   the payload */.
1fcf0 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61    nPayload = nDa
1fd00 74 61 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  ta;.  if( pPage-
1fd10 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 70  >intKey ){.    p
1fd20 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20  Src = pData;.   
1fd30 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20   nSrc = nData;. 
1fd40 20 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20     nData = 0;.  
1fd50 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50 61 79 6c  }else{.    nPayl
1fd60 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20  oad += nKey;.   
1fd70 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20   pSrc = pKey;.  
1fd80 20 20 6e 53 72 63 20 3d 20 6e 4b 65 79 3b 0a 20    nSrc = nKey;. 
1fd90 20 7d 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69   }.  *pnSize = i
1fda0 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73 70 61  nfo.nSize;.  spa
1fdb0 63 65 4c 65 66 74 20 3d 20 69 6e 66 6f 2e 6e 4c  ceLeft = info.nL
1fdc0 6f 63 61 6c 3b 0a 20 20 70 50 61 79 6c 6f 61 64  ocal;.  pPayload
1fdd0 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65   = &pCell[nHeade
1fde0 72 5d 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 26  r];.  pPrior = &
1fdf0 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
1fe00 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c 65 28  flow];..  while(
1fe10 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20   nPayload>0 ){. 
1fe20 20 20 20 69 66 28 20 73 70 61 63 65 4c 65 66 74     if( spaceLeft
1fe30 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  ==0 ){.#ifndef S
1fe40 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1fe50 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f  ACUUM.      Pgno
1fe60 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67   pgnoPtrmap = pg
1fe70 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66  noOvfl; /* Overf
1fe80 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
1fe90 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65 20  -map entry page 
1fea0 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  */.#endif.      
1feb0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 50 61 67  rc = allocatePag
1fec0 65 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26  e(pBt, &pOvfl, &
1fed0 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76  pgnoOvfl, pgnoOv
1fee0 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20  fl, 0);.#ifndef 
1fef0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1ff00 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20  VACUUM.      /* 
1ff10 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
1ff20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61  supports auto-va
1ff30 63 75 75 6d 2c 20 61 6e 64 20 74 68 65 20 73 65  cuum, and the se
1ff40 63 6f 6e 64 20 6f 72 20 73 75 62 73 65 71 75 65  cond or subseque
1ff50 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72  nt.      ** over
1ff60 66 6c 6f 77 20 70 61 67 65 20 69 73 20 62 65 69  flow page is bei
1ff70 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64  ng allocated, ad
1ff80 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68  d an entry to th
1ff90 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
1ffa0 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 61 74 20      ** for that 
1ffb0 70 61 67 65 20 6e 6f 77 2e 20 54 68 65 20 65 6e  page now. The en
1ffc0 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 72 73  try for the firs
1ffd0 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
1ffe0 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a 2a  will be.      **
1fff0 20 61 64 64 65 64 20 6c 61 74 65 72 2c 20 62 79   added later, by
20000 20 74 68 65 20 69 6e 73 65 72 74 43 65 6c 6c 28   the insertCell(
20010 29 20 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20 20  ) routine..     
20020 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
20030 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
20040 20 70 67 6e 6f 50 74 72 6d 61 70 21 3d 30 20 26   pgnoPtrmap!=0 &
20050 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
20060 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
20070 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
20080 67 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  gnoOvfl, PTRMAP_
20090 4f 56 45 52 46 4c 4f 57 32 2c 20 70 67 6e 6f 50  OVERFLOW2, pgnoP
200a0 74 72 6d 61 70 29 3b 0a 20 20 20 20 20 20 7d 0a  trmap);.      }.
200b0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
200c0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72   rc ){.        r
200d0 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65  eleasePage(pToRe
200e0 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20  lease);.        
200f0 2f 2a 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61  /* clearCell(pPa
20100 67 65 2c 20 70 43 65 6c 6c 29 3b 20 2a 2f 0a 20  ge, pCell); */. 
20110 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
20120 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
20130 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c  put4byte(pPrior,
20140 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20   pgnoOvfl);.    
20150 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
20160 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20  oRelease);.     
20170 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f   pToRelease = pO
20180 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  vfl;.      pPrio
20190 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61  r = pOvfl->aData
201a0 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
201b0 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20  (pPrior, 0);.   
201c0 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70     pPayload = &p
201d0 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a  Ovfl->aData[4];.
201e0 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74 20        spaceLeft 
201f0 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
20200 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20  e - 4;.    }.   
20210 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   n = nPayload;. 
20220 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65     if( n>spaceLe
20230 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65  ft ) n = spaceLe
20240 66 74 3b 0a 20 20 20 20 69 66 28 20 6e 3e 6e 53  ft;.    if( n>nS
20250 72 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20  rc ) n = nSrc;. 
20260 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20     assert( pSrc 
20270 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50  );.    memcpy(pP
20280 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29  ayload, pSrc, n)
20290 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d  ;.    nPayload -
202a0 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61  = n;.    pPayloa
202b0 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63  d += n;.    pSrc
202c0 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20   += n;.    nSrc 
202d0 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c  -= n;.    spaceL
202e0 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66  eft -= n;.    if
202f0 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20  ( nSrc==0 ){.   
20300 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b     nSrc = nData;
20310 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 44  .      pSrc = pD
20320 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ata;.    }.  }. 
20330 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
20340 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75  Release);.  retu
20350 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
20360 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
20370 65 20 4d 65 6d 50 61 67 65 2e 70 50 61 72 65 6e  e MemPage.pParen
20380 74 20 70 6f 69 6e 74 65 72 20 6f 6e 20 74 68 65  t pointer on the
20390 20 70 61 67 65 20 77 68 6f 73 65 20 6e 75 6d 62   page whose numb
203a0 65 72 20 69 73 0a 2a 2a 20 67 69 76 65 6e 20 69  er is.** given i
203b0 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  n the second arg
203c0 75 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 4d 65  ument so that Me
203d0 6d 50 61 67 65 2e 70 50 61 72 65 6e 74 20 68 6f  mPage.pParent ho
203e0 6c 64 73 20 74 68 65 0a 2a 2a 20 70 6f 69 6e 74  lds the.** point
203f0 65 72 20 69 6e 20 74 68 65 20 74 68 69 72 64 20  er in the third 
20400 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
20410 74 69 63 20 69 6e 74 20 72 65 70 61 72 65 6e 74  tic int reparent
20420 50 61 67 65 28 42 74 53 68 61 72 65 64 20 2a 70  Page(BtShared *p
20430 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 4d  Bt, Pgno pgno, M
20440 65 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 72 65  emPage *pNewPare
20450 6e 74 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20  nt, int idx){.  
20460 4d 65 6d 50 61 67 65 20 2a 70 54 68 69 73 3b 0a  MemPage *pThis;.
20470 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
20480 2a 61 44 61 74 61 3b 0a 0a 20 20 61 73 73 65 72  *aData;..  asser
20490 74 28 20 70 4e 65 77 50 61 72 65 6e 74 21 3d 30  t( pNewParent!=0
204a0 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d   );.  if( pgno==
204b0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
204c0 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
204d0 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29  pBt->pPager!=0 )
204e0 3b 0a 20 20 61 44 61 74 61 20 3d 20 73 71 6c 69  ;.  aData = sqli
204f0 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28  te3pager_lookup(
20500 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e  pBt->pPager, pgn
20510 6f 29 3b 0a 20 20 69 66 28 20 61 44 61 74 61 20  o);.  if( aData 
20520 29 7b 0a 20 20 20 20 70 54 68 69 73 20 3d 20 28  ){.    pThis = (
20530 4d 65 6d 50 61 67 65 2a 29 26 61 44 61 74 61 5b  MemPage*)&aData[
20540 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a  pBt->pageSize];.
20550 20 20 20 20 61 73 73 65 72 74 28 20 70 54 68 69      assert( pThi
20560 73 2d 3e 61 44 61 74 61 3d 3d 61 44 61 74 61 20  s->aData==aData 
20570 29 3b 0a 20 20 20 20 69 66 28 20 70 54 68 69 73  );.    if( pThis
20580 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20  ->isInit ){.    
20590 20 20 69 66 28 20 70 54 68 69 73 2d 3e 70 50 61    if( pThis->pPa
205a0 72 65 6e 74 21 3d 70 4e 65 77 50 61 72 65 6e 74  rent!=pNewParent
205b0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
205c0 70 54 68 69 73 2d 3e 70 50 61 72 65 6e 74 20 29  pThis->pParent )
205d0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
205e0 72 65 66 28 70 54 68 69 73 2d 3e 70 50 61 72 65  ref(pThis->pPare
205f0 6e 74 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  nt->aData);.    
20600 20 20 20 20 70 54 68 69 73 2d 3e 70 50 61 72 65      pThis->pPare
20610 6e 74 20 3d 20 70 4e 65 77 50 61 72 65 6e 74 3b  nt = pNewParent;
20620 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20630 70 61 67 65 72 5f 72 65 66 28 70 4e 65 77 50 61  pager_ref(pNewPa
20640 72 65 6e 74 2d 3e 61 44 61 74 61 29 3b 0a 20 20  rent->aData);.  
20650 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 68 69      }.      pThi
20660 73 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d 20 69  s->idxParent = i
20670 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  dx;.    }.    sq
20680 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
20690 28 61 44 61 74 61 29 3b 0a 20 20 7d 0a 0a 23 69  (aData);.  }..#i
206a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
206b0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69  T_AUTOVACUUM.  i
206c0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
206d0 75 6d 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  um ){.    return
206e0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
206f0 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  pgno, PTRMAP_BTR
20700 45 45 2c 20 70 4e 65 77 50 61 72 65 6e 74 2d 3e  EE, pNewParent->
20710 70 67 6e 6f 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  pgno);.  }.#endi
20720 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
20730 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a  E_OK;.}..../*.**
20740 20 43 68 61 6e 67 65 20 74 68 65 20 70 50 61 72   Change the pPar
20750 65 6e 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 61  ent pointer of a
20760 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70  ll children of p
20770 50 61 67 65 20 74 6f 20 70 6f 69 6e 74 20 62 61  Page to point ba
20780 63 6b 0a 2a 2a 20 74 6f 20 70 50 61 67 65 2e 0a  ck.** to pPage..
20790 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77  **.** In other w
207a0 6f 72 64 73 2c 20 66 6f 72 20 65 76 65 72 79 20  ords, for every 
207b0 63 68 69 6c 64 20 6f 66 20 70 50 61 67 65 2c 20  child of pPage, 
207c0 69 6e 76 6f 6b 65 20 72 65 70 61 72 65 6e 74 50  invoke reparentP
207d0 61 67 65 28 29 0a 2a 2a 20 74 6f 20 6d 61 6b 65  age().** to make
207e0 20 73 75 72 65 20 74 68 61 74 20 65 61 63 68 20   sure that each 
207f0 63 68 69 6c 64 20 6b 6e 6f 77 73 20 74 68 61 74  child knows that
20800 20 70 50 61 67 65 20 69 73 20 69 74 73 20 70 61   pPage is its pa
20810 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rent..**.** This
20820 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61   routine gets ca
20830 6c 6c 65 64 20 61 66 74 65 72 20 79 6f 75 20 6d  lled after you m
20840 65 6d 63 70 79 28 29 20 6f 6e 65 20 70 61 67 65  emcpy() one page
20850 20 69 6e 74 6f 0a 2a 2a 20 61 6e 6f 74 68 65 72   into.** another
20860 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
20870 72 65 70 61 72 65 6e 74 43 68 69 6c 64 50 61 67  reparentChildPag
20880 65 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  es(MemPage *pPag
20890 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 42  e){.  int i;.  B
208a0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
208b0 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74  Page->pBt;.  int
208c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
208d0 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c  ..  if( pPage->l
208e0 65 61 66 20 29 20 72 65 74 75 72 6e 20 53 51 4c  eaf ) return SQL
208f0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 66 6f 72 28 69  ITE_OK;..  for(i
20900 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65  =0; i<pPage->nCe
20910 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
20920 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65   *pCell = findCe
20930 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20  ll(pPage, i);.  
20940 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
20950 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  af ){.      rc =
20960 20 72 65 70 61 72 65 6e 74 50 61 67 65 28 70 42   reparentPage(pB
20970 74 2c 20 67 65 74 34 62 79 74 65 28 70 43 65 6c  t, get4byte(pCel
20980 6c 29 2c 20 70 50 61 67 65 2c 20 69 29 3b 0a 20  l), pPage, i);. 
20990 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
209a0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
209b0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rc;.    }.  }.  
209c0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
209d0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 70   ){.    rc = rep
209e0 61 72 65 6e 74 50 61 67 65 28 70 42 74 2c 20 67  arentPage(pBt, g
209f0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
20a00 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
20a10 4f 66 66 73 65 74 2b 38 5d 29 2c 20 0a 20 20 20  Offset+8]), .   
20a20 20 20 20 20 70 50 61 67 65 2c 20 69 29 3b 0a 20      pPage, i);. 
20a30 20 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69     pPage->idxShi
20a40 66 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ft = 0;.  }.  re
20a50 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
20a60 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74  * Remove the i-t
20a70 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67  h cell from pPag
20a80 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
20a90 20 65 66 66 65 63 74 73 20 70 50 61 67 65 20 6f   effects pPage o
20aa0 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c  nly..** The cell
20ab0 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20   content is not 
20ac0 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63  freed or dealloc
20ad0 61 74 65 64 2e 20 20 49 74 20 69 73 20 61 73 73  ated.  It is ass
20ae0 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65  umed that.** the
20af0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61   cell content ha
20b00 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f  s been copied so
20b10 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54  meplace else.  T
20b20 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74  his routine just
20b30 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20  .** removes the 
20b40 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
20b50 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65   cell from pPage
20b60 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73  ..**.** "sz" mus
20b70 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20  t be the number 
20b80 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
20b90 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cell..*/.static 
20ba0 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65  void dropCell(Me
20bb0 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
20bc0 74 20 69 64 78 2c 20 69 6e 74 20 73 7a 29 7b 0a  t idx, int sz){.
20bd0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
20be0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
20bf0 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20  r */.  int pc;  
20c00 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
20c10 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   to cell content
20c20 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64   of cell being d
20c30 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a  eleted */.  u8 *
20c40 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70  data;       /* p
20c50 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20  Page->aData */. 
20c60 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20   u8 *ptr;       
20c70 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65   /* Used to move
20c80 20 62 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69   bytes around wi
20c90 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a  thin data[] */..
20ca0 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30    assert( idx>=0
20cb0 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e   && idx<pPage->n
20cc0 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
20cd0 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70  ( sz==cellSize(p
20ce0 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a 20 20  Page, idx) );.  
20cf0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 70  assert( sqlite3p
20d00 61 67 65 72 5f 69 73 77 72 69 74 65 61 62 6c 65  ager_iswriteable
20d10 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 20 29  (pPage->aData) )
20d20 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65  ;.  data = pPage
20d30 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20 3d  ->aData;.  ptr =
20d40 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 65   &data[pPage->ce
20d50 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 64 78  llOffset + 2*idx
20d60 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79  ];.  pc = get2by
20d70 74 65 28 70 74 72 29 3b 0a 20 20 61 73 73 65 72  te(ptr);.  asser
20d80 74 28 20 70 63 3e 31 30 20 26 26 20 70 63 2b 73  t( pc>10 && pc+s
20d90 7a 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  z<=pPage->pBt->u
20da0 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 66  sableSize );.  f
20db0 72 65 65 53 70 61 63 65 28 70 50 61 67 65 2c 20  reeSpace(pPage, 
20dc0 70 63 2c 20 73 7a 29 3b 0a 20 20 66 6f 72 28 69  pc, sz);.  for(i
20dd0 3d 69 64 78 2b 31 3b 20 69 3c 70 50 61 67 65 2d  =idx+1; i<pPage-
20de0 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 2c 20 70 74 72  >nCell; i++, ptr
20df0 2b 3d 32 29 7b 0a 20 20 20 20 70 74 72 5b 30 5d  +=2){.    ptr[0]
20e00 20 3d 20 70 74 72 5b 32 5d 3b 0a 20 20 20 20 70   = ptr[2];.    p
20e10 74 72 5b 31 5d 20 3d 20 70 74 72 5b 33 5d 3b 0a  tr[1] = ptr[3];.
20e20 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65    }.  pPage->nCe
20e30 6c 6c 2d 2d 3b 0a 20 20 70 75 74 32 62 79 74 65  ll--;.  put2byte
20e40 28 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  (&data[pPage->hd
20e50 72 4f 66 66 73 65 74 2b 33 5d 2c 20 70 50 61 67  rOffset+3], pPag
20e60 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 50 61  e->nCell);.  pPa
20e70 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a  ge->nFree += 2;.
20e80 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66    pPage->idxShif
20e90 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 1;.}../*.** 
20ea0 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c  Insert a new cel
20eb0 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20 63 65  l on pPage at ce
20ec0 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20 20 70  ll index "i".  p
20ed0 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74  Cell points to t
20ee0 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66  he.** content of
20ef0 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a   the cell..**.**
20f00 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   If the cell con
20f10 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e  tent will fit on
20f20 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20   the page, then 
20f30 70 75 74 20 69 74 20 74 68 65 72 65 2e 20 20 49  put it there.  I
20f40 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  f it.** will not
20f50 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20   fit, then make 
20f60 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 65  a copy of the ce
20f70 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20  ll content into 
20f80 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d  pTemp if.** pTem
20f90 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20  p is not null.  
20fa0 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 70 54  Regardless of pT
20fb0 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20  emp, allocate a 
20fc0 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20  new entry.** in 
20fd0 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 5d 20 61  pPage->aOvfl[] a
20fe0 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74  nd make it point
20ff0 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
21000 74 65 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a 20  tent (either.** 
21010 69 6e 20 70 54 65 6d 70 20 6f 72 20 74 68 65 20  in pTemp or the 
21020 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20  original pCell) 
21030 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72 64 20  and also record 
21040 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41  its index. .** A
21050 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20  llocating a new 
21060 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e  entry in pPage->
21070 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20  aCell[] implies 
21080 74 68 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e  that .** pPage->
21090 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 69 6e 63  nOverflow is inc
210a0 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  remented..**.** 
210b0 49 66 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d  If nSkip is non-
210c0 7a 65 72 6f 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  zero, then do no
210d0 74 20 63 6f 70 79 20 74 68 65 20 66 69 72 73 74  t copy the first
210e0 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f 66 20   nSkip bytes of 
210f0 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68 65  the.** cell. The
21100 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 76 65   caller will ove
21110 72 77 72 69 74 65 20 74 68 65 6d 20 61 66 74 65  rwrite them afte
21120 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
21130 72 65 74 75 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e  returns. If.** n
21140 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Skip is non-zero
21150 2c 20 74 68 65 6e 20 70 43 65 6c 6c 20 6d 61 79  , then pCell may
21160 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e   not point to an
21170 20 69 6e 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20   invalid memory 
21180 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20 28 62 75  location .** (bu
21190 74 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 20 69 73  t pCell+nSkip is
211a0 20 61 6c 77 61 79 73 20 76 61 6c 69 64 29 2e 0a   always valid)..
211b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
211c0 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  sertCell(.  MemP
211d0 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a  age *pPage,   /*
211e0 20 50 61 67 65 20 69 6e 74 6f 20 77 68 69 63 68   Page into which
211f0 20 77 65 20 61 72 65 20 63 6f 70 79 69 6e 67 20   we are copying 
21200 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20  */.  int i,     
21210 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65         /* New ce
21220 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20 69  ll becomes the i
21230 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74 68 65 20  -th cell of the 
21240 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43  page */.  u8 *pC
21250 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 43  ell,        /* C
21260 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65  ontent of the ne
21270 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  w cell */.  int 
21280 73 7a 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sz,           /*
21290 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e   Bytes of conten
212a0 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  t in pCell */.  
212b0 75 38 20 2a 70 54 65 6d 70 2c 20 20 20 20 20 20  u8 *pTemp,      
212c0 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67    /* Temp storag
212d0 65 20 73 70 61 63 65 20 66 6f 72 20 70 43 65 6c  e space for pCel
212e0 6c 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a  l, if needed */.
212f0 20 20 75 38 20 6e 53 6b 69 70 20 20 20 20 20 20    u8 nSkip      
21300 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 77 72      /* Do not wr
21310 69 74 65 20 74 68 65 20 66 69 72 73 74 20 6e 53  ite the first nS
21320 6b 69 70 20 62 79 74 65 73 20 6f 66 20 74 68 65  kip bytes of the
21330 20 63 65 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e   cell */.){.  in
21340 74 20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20  t idx;          
21350 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74  /* Where to writ
21360 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65  e new cell conte
21370 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  nt in data[] */.
21380 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20    int j;        
21390 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
213a0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70  ter */.  int top
213b0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
213c0 72 73 74 20 62 79 74 65 20 6f 66 20 63 6f 6e 74  rst byte of cont
213d0 65 6e 74 20 66 6f 72 20 61 6e 79 20 63 65 6c 6c  ent for any cell
213e0 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
213f0 69 6e 74 20 65 6e 64 3b 20 20 20 20 20 20 20 20  int end;        
21400 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
21410 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 63 65  past the last ce
21420 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61  ll pointer in da
21430 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 6e  ta[] */.  int in
21440 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  s;          /* I
21450 6e 64 65 78 20 69 6e 20 64 61 74 61 5b 5d 20 77  ndex in data[] w
21460 68 65 72 65 20 6e 65 77 20 63 65 6c 6c 20 70 6f  here new cell po
21470 69 6e 74 65 72 20 69 73 20 69 6e 73 65 72 74 65  inter is inserte
21480 64 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20  d */.  int hdr; 
21490 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
214a0 65 74 20 69 6e 74 6f 20 64 61 74 61 5b 5d 20 6f  et into data[] o
214b0 66 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  f the page heade
214c0 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f  r */.  int cellO
214d0 66 66 73 65 74 3b 20 20 20 2f 2a 20 41 64 64 72  ffset;   /* Addr
214e0 65 73 73 20 6f 66 20 66 69 72 73 74 20 63 65 6c  ess of first cel
214f0 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74  l pointer in dat
21500 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  a[] */.  u8 *dat
21510 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  a;         /* Th
21520 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
21530 20 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20   whole page */. 
21540 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20   u8 *ptr;       
21550 20 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 6d     /* Used for m
21560 6f 76 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  oving informatio
21570 6e 20 61 72 6f 75 6e 64 20 69 6e 20 64 61 74 61  n around in data
21580 5b 5d 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  [] */..  assert(
21590 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61 67   i>=0 && i<=pPag
215a0 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e  e->nCell+pPage->
215b0 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61  nOverflow );.  a
215c0 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53  ssert( sz==cellS
215d0 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43  izePtr(pPage, pC
215e0 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ell) );.  assert
215f0 28 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 69  ( sqlite3pager_i
21600 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
21610 2d 3e 61 44 61 74 61 29 20 29 3b 0a 20 20 69 66  ->aData) );.  if
21620 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
21630 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65  ow || sz+2>pPage
21640 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 69  ->nFree ){.    i
21650 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20 20  f( pTemp ){.    
21660 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2b 6e    memcpy(pTemp+n
21670 53 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69  Skip, pCell+nSki
21680 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20  p, sz-nSkip);.  
21690 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d      pCell = pTem
216a0 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d  p;.    }.    j =
216b0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
216c0 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  w++;.    assert(
216d0 20 6a 3c 73 69 7a 65 6f 66 28 70 50 61 67 65 2d   j<sizeof(pPage-
216e0 3e 61 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70  >aOvfl)/sizeof(p
216f0 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 20  Page->aOvfl[0]) 
21700 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f  );.    pPage->aO
21710 76 66 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d 20 70  vfl[j].pCell = p
21720 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d  Cell;.    pPage-
21730 3e 61 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20 3d 20  >aOvfl[j].idx = 
21740 69 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46  i;.    pPage->nF
21750 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ree = 0;.  }else
21760 7b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61  {.    data = pPa
21770 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 68  ge->aData;.    h
21780 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
21790 66 66 73 65 74 3b 0a 20 20 20 20 74 6f 70 20 3d  ffset;.    top =
217a0 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
217b0 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 63 65 6c  hdr+5]);.    cel
217c0 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d  lOffset = pPage-
217d0 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20  >cellOffset;.   
217e0 20 65 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65   end = cellOffse
217f0 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65  t + 2*pPage->nCe
21800 6c 6c 20 2b 20 32 3b 0a 20 20 20 20 69 6e 73 20  ll + 2;.    ins 
21810 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
21820 2a 69 3b 0a 20 20 20 20 69 66 28 20 65 6e 64 20  *i;.    if( end 
21830 3e 20 74 6f 70 20 2d 20 73 7a 20 29 7b 0a 20 20  > top - sz ){.  
21840 20 20 20 20 69 6e 74 20 72 63 20 3d 20 64 65 66      int rc = def
21850 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67  ragmentPage(pPag
21860 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
21870 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
21880 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 74  turn rc;.      t
21890 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
218a0 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20  ata[hdr+5]);.   
218b0 20 20 20 61 73 73 65 72 74 28 20 65 6e 64 20 2b     assert( end +
218c0 20 73 7a 20 3c 3d 20 74 6f 70 20 29 3b 0a 20 20   sz <= top );.  
218d0 20 20 7d 0a 20 20 20 20 69 64 78 20 3d 20 61 6c    }.    idx = al
218e0 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50 61 67  locateSpace(pPag
218f0 65 2c 20 73 7a 29 3b 0a 20 20 20 20 61 73 73 65  e, sz);.    asse
21900 72 74 28 20 69 64 78 3e 30 20 29 3b 0a 20 20 20  rt( idx>0 );.   
21910 20 61 73 73 65 72 74 28 20 65 6e 64 20 3c 3d 20   assert( end <= 
21920 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
21930 64 72 2b 35 5d 29 20 29 3b 0a 20 20 20 20 70 50  dr+5]) );.    pP
21940 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20  age->nCell++;.  
21950 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d    pPage->nFree -
21960 3d 20 32 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  = 2;.    memcpy(
21970 26 64 61 74 61 5b 69 64 78 2b 6e 53 6b 69 70 5d  &data[idx+nSkip]
21980 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73  , pCell+nSkip, s
21990 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 66 6f  z-nSkip);.    fo
219a0 72 28 6a 3d 65 6e 64 2d 32 2c 20 70 74 72 3d 26  r(j=end-2, ptr=&
219b0 64 61 74 61 5b 6a 5d 3b 20 6a 3e 69 6e 73 3b 20  data[j]; j>ins; 
219c0 6a 2d 3d 32 2c 20 70 74 72 2d 3d 32 29 7b 0a 20  j-=2, ptr-=2){. 
219d0 20 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74       ptr[0] = pt
219e0 72 5b 2d 32 5d 3b 0a 20 20 20 20 20 20 70 74 72  r[-2];.      ptr
219f0 5b 31 5d 20 3d 20 70 74 72 5b 2d 31 5d 3b 0a 20  [1] = ptr[-1];. 
21a00 20 20 20 7d 0a 20 20 20 20 70 75 74 32 62 79 74     }.    put2byt
21a10 65 28 26 64 61 74 61 5b 69 6e 73 5d 2c 20 69 64  e(&data[ins], id
21a20 78 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  x);.    put2byte
21a30 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70  (&data[hdr+3], p
21a40 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20  Page->nCell);.  
21a50 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66    pPage->idxShif
21a60 74 20 3d 20 31 3b 0a 20 20 20 20 70 61 67 65 49  t = 1;.    pageI
21a70 6e 74 65 67 72 69 74 79 28 70 50 61 67 65 29 3b  ntegrity(pPage);
21a80 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
21a90 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
21aa0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70      if( pPage->p
21ab0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
21ac0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  {.      /* The c
21ad0 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  ell may contain 
21ae0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
21af0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
21b00 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20  f so, write.    
21b10 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66    ** the entry f
21b20 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
21b30 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f  page into the po
21b40 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20  inter map..     
21b50 20 2a 2f 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e   */.      CellIn
21b60 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 70  fo info;.      p
21b70 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
21b80 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
21b90 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 6e 66  ;.      if( (inf
21ba0 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e  o.nData+(pPage->
21bb0 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b  intKey?0:info.nK
21bc0 65 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  ey))>info.nLocal
21bd0 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   ){.        Pgno
21be0 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 67 65 74 34   pgnoOvfl = get4
21bf0 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
21c00 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20  .iOverflow]);.  
21c10 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 70        int rc = p
21c20 74 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e  trmapPut(pPage->
21c30 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 50  pBt, pgnoOvfl, P
21c40 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c  TRMAP_OVERFLOW1,
21c50 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
21c60 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
21c70 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
21c80 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
21c90 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
21ca0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21cb0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  OK;.}../*.** Add
21cc0 20 61 20 6c 69 73 74 20 6f 66 20 63 65 6c 6c 73   a list of cells
21cd0 20 74 6f 20 61 20 70 61 67 65 2e 20 20 54 68 65   to a page.  The
21ce0 20 70 61 67 65 20 73 68 6f 75 6c 64 20 62 65 20   page should be 
21cf0 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79 2e  initially empty.
21d00 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20 61 72  .** The cells ar
21d10 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  e guaranteed to 
21d20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  fit on the page.
21d30 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
21d40 61 73 73 65 6d 62 6c 65 50 61 67 65 28 0a 20 20  assemblePage(.  
21d50 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
21d60 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f    /* The page to
21d70 20 62 65 20 61 73 73 65 6d 62 6c 69 65 64 20 2a   be assemblied *
21d80 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20  /.  int nCell,  
21d90 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d        /* The num
21da0 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20  ber of cells to 
21db0 61 64 64 20 74 6f 20 74 68 69 73 20 70 61 67 65  add to this page
21dc0 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c   */.  u8 **apCel
21dd0 6c 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  l,      /* Point
21de0 65 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f 64 69  ers to cell bodi
21df0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 53 69  es */.  int *aSi
21e00 7a 65 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  ze        /* Siz
21e10 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20  es of the cells 
21e20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  */.){.  int i;  
21e30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
21e40 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
21e50 6e 74 20 74 6f 74 61 6c 53 69 7a 65 3b 20 20 20  nt totalSize;   
21e60 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f   /* Total size o
21e70 66 20 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a 20  f all cells */. 
21e80 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20   int hdr;       
21e90 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 70     /* Index of p
21ea0 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  age header */.  
21eb0 69 6e 74 20 63 65 6c 6c 70 74 72 3b 20 20 20 20  int cellptr;    
21ec0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
21ed0 6e 65 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  next cell pointe
21ee0 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 62  r */.  int cellb
21ef0 6f 64 79 3b 20 20 20 20 20 2f 2a 20 41 64 64 72  ody;     /* Addr
21f00 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c  ess of next cell
21f10 20 62 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a 64   body */.  u8 *d
21f20 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ata;         /* 
21f30 44 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67  Data for the pag
21f40 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
21f50 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
21f60 3d 3d 30 20 29 3b 0a 20 20 74 6f 74 61 6c 53 69  ==0 );.  totalSi
21f70 7a 65 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d  ze = 0;.  for(i=
21f80 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
21f90 7b 0a 20 20 20 20 74 6f 74 61 6c 53 69 7a 65 20  {.    totalSize 
21fa0 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 7d  += aSize[i];.  }
21fb0 0a 20 20 61 73 73 65 72 74 28 20 74 6f 74 61 6c  .  assert( total
21fc0 53 69 7a 65 2b 32 2a 6e 43 65 6c 6c 3c 3d 70 50  Size+2*nCell<=pP
21fd0 61 67 65 2d 3e 6e 46 72 65 65 20 29 3b 0a 20 20  age->nFree );.  
21fe0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
21ff0 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 63 65 6c  Cell==0 );.  cel
22000 6c 70 74 72 20 3d 20 70 50 61 67 65 2d 3e 63 65  lptr = pPage->ce
22010 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 64 61 74 61  llOffset;.  data
22020 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
22030 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
22040 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 70 75 74  hdrOffset;.  put
22050 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
22060 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20 69 66  3], nCell);.  if
22070 28 20 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 63  ( nCell ){.    c
22080 65 6c 6c 62 6f 64 79 20 3d 20 61 6c 6c 6f 63 61  ellbody = alloca
22090 74 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 74  teSpace(pPage, t
220a0 6f 74 61 6c 53 69 7a 65 29 3b 0a 20 20 20 20 61  otalSize);.    a
220b0 73 73 65 72 74 28 20 63 65 6c 6c 62 6f 64 79 3e  ssert( cellbody>
220c0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
220d0 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3e 3d   pPage->nFree >=
220e0 20 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20   2*nCell );.    
220f0 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20  pPage->nFree -= 
22100 32 2a 6e 43 65 6c 6c 3b 0a 20 20 20 20 66 6f 72  2*nCell;.    for
22110 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
22120 2b 2b 29 7b 0a 20 20 20 20 20 20 70 75 74 32 62  ++){.      put2b
22130 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 70 74  yte(&data[cellpt
22140 72 5d 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20  r], cellbody);. 
22150 20 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74       memcpy(&dat
22160 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c 20 61 70 43  a[cellbody], apC
22170 65 6c 6c 5b 69 5d 2c 20 61 53 69 7a 65 5b 69 5d  ell[i], aSize[i]
22180 29 3b 0a 20 20 20 20 20 20 63 65 6c 6c 70 74 72  );.      cellptr
22190 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 63 65 6c   += 2;.      cel
221a0 6c 62 6f 64 79 20 2b 3d 20 61 53 69 7a 65 5b 69  lbody += aSize[i
221b0 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  ];.    }.    ass
221c0 65 72 74 28 20 63 65 6c 6c 62 6f 64 79 3d 3d 70  ert( cellbody==p
221d0 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
221e0 65 53 69 7a 65 20 29 3b 0a 20 20 7d 0a 20 20 70  eSize );.  }.  p
221f0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 6e 43  Page->nCell = nC
22200 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ell;.}../*.** Th
22210 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61  e following para
22220 6d 65 74 65 72 73 20 64 65 74 65 72 6d 69 6e 65  meters determine
22230 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63 65   how many adjace
22240 6e 74 20 70 61 67 65 73 20 67 65 74 20 69 6e 76  nt pages get inv
22250 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61  olved.** in a ba
22260 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f  lancing operatio
22270 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65 20 6e 75  n.  NN is the nu
22280 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72  mber of neighbor
22290 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
222a0 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20  .** of the page 
222b0 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65  that participate
222c0 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e   in the balancin
222d0 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42  g operation.  NB
222e0 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c   is the.** total
222f0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
22300 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74   that participat
22310 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  e, including the
22320 20 74 61 72 67 65 74 20 70 61 67 65 20 61 6e 64   target page and
22330 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73  .** NN neighbors
22340 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 2e   on either side.
22350 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d  .**.** The minim
22360 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69  um value of NN i
22370 73 20 31 20 28 6f 66 20 63 6f 75 72 73 65 29 2e  s 1 (of course).
22380 20 20 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20    Increasing NN 
22390 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32  above 1.** (to 2
223a0 20 6f 72 20 33 29 20 67 69 76 65 73 20 61 20 6d   or 3) gives a m
223b0 6f 64 65 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e  odest improvemen
223c0 74 20 69 6e 20 53 45 4c 45 43 54 20 61 6e 64 20  t in SELECT and 
223d0 44 45 4c 45 54 45 20 70 65 72 66 6f 72 6d 61 6e  DELETE performan
223e0 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67  ce.** in exchang
223f0 65 20 66 6f 72 20 61 20 6c 61 72 67 65 72 20 64  e for a larger d
22400 65 67 72 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e  egradation in IN
22410 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20  SERT and UPDATE 
22420 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20  performance..** 
22430 54 68 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20  The value of NN 
22440 61 70 70 65 61 72 73 20 74 6f 20 67 69 76 65 20  appears to give 
22450 74 68 65 20 62 65 73 74 20 72 65 73 75 6c 74 73  the best results
22460 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65   overall..*/.#de
22470 66 69 6e 65 20 4e 4e 20 31 20 20 20 20 20 20 20  fine NN 1       
22480 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
22490 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20  of neighbors on 
224a0 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 70  either side of p
224b0 50 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  Page */.#define 
224c0 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20  NB (NN*2+1)     
224d0 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67 65 73 20   /* Total pages 
224e0 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20  involved in the 
224f0 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 2f 2a 20 46  balance */../* F
22500 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
22510 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62   */.static int b
22520 61 6c 61 6e 63 65 28 4d 65 6d 50 61 67 65 2a 2c  alance(MemPage*,
22530 20 69 6e 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20   int);..#ifndef 
22540 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43  SQLITE_OMIT_QUIC
22550 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54  KBALANCE./*.** T
22560 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 62  his version of b
22570 61 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c 65 73  alance() handles
22580 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65 63   the common spec
22590 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 0a 2a  ial case where.*
225a0 2a 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 73  * a new entry is
225b0 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20   being inserted 
225c0 6f 6e 20 74 68 65 20 65 78 74 72 65 6d 65 20 72  on the extreme r
225d0 69 67 68 74 2d 65 6e 64 20 6f 66 20 74 68 65 0a  ight-end of the.
225e0 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74 68 65  ** tree, in othe
225f0 72 20 77 6f 72 64 73 2c 20 77 68 65 6e 20 74 68  r words, when th
22600 65 20 6e 65 77 20 65 6e 74 72 79 20 77 69 6c 6c  e new entry will
22610 20 62 65 63 6f 6d 65 20 74 68 65 20 6c 61 72 67   become the larg
22620 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20  est.** entry in 
22630 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  the tree..**.** 
22640 49 6e 73 74 65 61 64 20 6f 66 20 74 72 79 69 6e  Instead of tryin
22650 67 20 62 61 6c 61 6e 63 65 20 74 68 65 20 33 20  g balance the 3 
22660 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20  right-most leaf 
22670 70 61 67 65 73 2c 20 6a 75 73 74 20 61 64 64 0a  pages, just add.
22680 2a 2a 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f  ** a new page to
22690 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
226a0 73 69 64 65 20 61 6e 64 20 70 75 74 20 74 68 65  side and put the
226b0 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79 20 69   one new entry i
226c0 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 2e 20  n.** that page. 
226d0 20 54 68 69 73 20 6c 65 61 76 65 73 20 74 68 65   This leaves the
226e0 20 72 69 67 68 74 20 73 69 64 65 20 6f 66 20 74   right side of t
226f0 68 65 20 74 72 65 65 20 73 6f 6d 65 77 68 61 74  he tree somewhat
22700 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20  .** unbalanced. 
22710 20 42 75 74 20 6f 64 64 73 20 61 72 65 20 74 68   But odds are th
22720 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 69 6e  at we will be in
22730 73 65 72 74 69 6e 67 20 6e 65 77 20 65 6e 74 72  serting new entr
22740 69 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e  ies.** at the en
22750 64 20 73 6f 6f 6e 20 61 66 74 65 72 77 61 72 64  d soon afterward
22760 73 20 73 6f 20 74 68 65 20 6e 65 61 72 6c 79 20  s so the nearly 
22770 65 6d 70 74 79 20 70 61 67 65 20 77 69 6c 6c 20  empty page will 
22780 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20  quickly.** fill 
22790 75 70 2e 20 20 4f 6e 20 61 76 65 72 61 67 65 2e  up.  On average.
227a0 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73 20  .**.** pPage is 
227b0 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 77 68  the leaf page wh
227c0 69 63 68 20 69 73 20 74 68 65 20 72 69 67 68 74  ich is the right
227d0 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e 20 74 68  -most page in th
227e0 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65  e tree..** pPare
227f0 6e 74 20 69 73 20 69 74 73 20 70 61 72 65 6e 74  nt is its parent
22800 2e 20 20 70 50 61 67 65 20 6d 75 73 74 20 68 61  .  pPage must ha
22810 76 65 20 61 20 73 69 6e 67 6c 65 20 6f 76 65 72  ve a single over
22820 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68  flow entry.** wh
22830 69 63 68 20 69 73 20 61 6c 73 6f 20 74 68 65 20  ich is also the 
22840 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79  right-most entry
22850 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f   on the page..*/
22860 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61  .static int bala
22870 6e 63 65 5f 71 75 69 63 6b 28 4d 65 6d 50 61 67  nce_quick(MemPag
22880 65 20 2a 70 50 61 67 65 2c 20 4d 65 6d 50 61 67  e *pPage, MemPag
22890 65 20 2a 70 50 61 72 65 6e 74 29 7b 0a 20 20 69  e *pParent){.  i
228a0 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
228b0 20 2a 70 4e 65 77 3b 0a 20 20 50 67 6e 6f 20 70   *pNew;.  Pgno p
228c0 67 6e 6f 4e 65 77 3b 0a 20 20 75 38 20 2a 70 43  gnoNew;.  u8 *pC
228d0 65 6c 6c 3b 0a 20 20 69 6e 74 20 73 7a 43 65 6c  ell;.  int szCel
228e0 6c 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  l;.  CellInfo in
228f0 66 6f 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  fo;.  BtShared *
22900 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
22910 3b 0a 20 20 69 6e 74 20 70 61 72 65 6e 74 49 64  ;.  int parentId
22920 78 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65  x = pParent->nCe
22930 6c 6c 3b 20 20 20 2f 2a 20 70 50 61 72 65 6e 74  ll;   /* pParent
22940 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c   new divider cel
22950 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  l index */.  int
22960 20 70 61 72 65 6e 74 53 69 7a 65 3b 20 20 20 20   parentSize;    
22970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22980 2a 20 53 69 7a 65 20 6f 66 20 6e 65 77 20 64 69  * Size of new di
22990 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20  vider cell */.  
229a0 75 38 20 70 61 72 65 6e 74 43 65 6c 6c 5b 36 34  u8 parentCell[64
229b0 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ];              
229c0 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 74    /* Space for t
229d0 68 65 20 6e 65 77 20 64 69 76 69 64 65 72 20 63  he new divider c
229e0 65 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c  ell */..  /* All
229f0 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
22a00 2e 20 49 6e 73 65 72 74 20 74 68 65 20 6f 76 65  . Insert the ove
22a10 72 66 6c 6f 77 20 63 65 6c 6c 20 66 72 6f 6d 20  rflow cell from 
22a20 70 50 61 67 65 0a 20 20 2a 2a 20 69 6e 74 6f 20  pPage.  ** into 
22a30 69 74 2e 20 54 68 65 6e 20 72 65 6d 6f 76 65 20  it. Then remove 
22a40 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  the overflow cel
22a50 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 20 20  l from pPage..  
22a60 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  */.  rc = alloca
22a70 74 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65  tePage(pBt, &pNe
22a80 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20 30 2c 20  w, &pgnoNew, 0, 
22a90 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
22aa0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
22ab0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
22ac0 70 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 61  pCell = pPage->a
22ad0 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20  Ovfl[0].pCell;. 
22ae0 20 73 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69   szCell = cellSi
22af0 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  zePtr(pPage, pCe
22b00 6c 6c 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28  ll);.  zeroPage(
22b10 70 4e 65 77 2c 20 70 50 61 67 65 2d 3e 61 44 61  pNew, pPage->aDa
22b20 74 61 5b 30 5d 29 3b 0a 20 20 61 73 73 65 6d 62  ta[0]);.  assemb
22b30 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 31 2c 20  lePage(pNew, 1, 
22b40 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29  &pCell, &szCell)
22b50 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  ;.  pPage->nOver
22b60 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  flow = 0;..  /* 
22b70 53 65 74 20 74 68 65 20 70 61 72 65 6e 74 20 6f  Set the parent o
22b80 66 20 74 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f  f the newly allo
22b90 63 61 74 65 64 20 70 61 67 65 20 74 6f 20 70 50  cated page to pP
22ba0 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 70 4e 65 77  arent. */.  pNew
22bb0 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 50 61 72  ->pParent = pPar
22bc0 65 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33 70 61  ent;.  sqlite3pa
22bd0 67 65 72 5f 72 65 66 28 70 50 61 72 65 6e 74 2d  ger_ref(pParent-
22be0 3e 61 44 61 74 61 29 3b 0a 0a 20 20 2f 2a 20 70  >aData);..  /* p
22bf0 50 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c  Page is currentl
22c00 79 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  y the right-chil
22c10 64 20 6f 66 20 70 50 61 72 65 6e 74 2e 20 43 68  d of pParent. Ch
22c20 61 6e 67 65 20 74 68 69 73 0a 20 20 2a 2a 20 73  ange this.  ** s
22c30 6f 20 74 68 61 74 20 74 68 65 20 72 69 67 68 74  o that the right
22c40 2d 63 68 69 6c 64 20 69 73 20 74 68 65 20 6e 65  -child is the ne
22c50 77 20 70 61 67 65 20 61 6c 6c 6f 63 61 74 65 64  w page allocated
22c60 20 61 62 6f 76 65 20 61 6e 64 0a 20 20 2a 2a 20   above and.  ** 
22c70 70 50 61 67 65 20 69 73 20 74 68 65 20 6e 65 78  pPage is the nex
22c80 74 2d 74 6f 2d 72 69 67 68 74 20 63 68 69 6c 64  t-to-right child
22c90 2e 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  . .  */.  assert
22ca0 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30  ( pPage->nCell>0
22cb0 20 29 3b 0a 20 20 70 61 72 73 65 43 65 6c 6c 50   );.  parseCellP
22cc0 74 72 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65  tr(pPage, findCe
22cd0 6c 6c 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d  ll(pPage, pPage-
22ce0 3e 6e 43 65 6c 6c 2d 31 29 2c 20 26 69 6e 66 6f  >nCell-1), &info
22cf0 29 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e  );.  rc = fillIn
22d00 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 61  Cell(pParent, pa
22d10 72 65 6e 74 43 65 6c 6c 2c 20 30 2c 20 69 6e 66  rentCell, 0, inf
22d20 6f 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c 20 26 70  o.nKey, 0, 0, &p
22d30 61 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 69 66  arentSize);.  if
22d40 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
22d50 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
22d60 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
22d70 70 61 72 65 6e 74 53 69 7a 65 3c 36 34 20 29 3b  parentSize<64 );
22d80 0a 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65  .  rc = insertCe
22d90 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 61 72 65  ll(pParent, pare
22da0 6e 74 49 64 78 2c 20 70 61 72 65 6e 74 43 65 6c  ntIdx, parentCel
22db0 6c 2c 20 70 61 72 65 6e 74 53 69 7a 65 2c 20 30  l, parentSize, 0
22dc0 2c 20 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 4);.  if( rc!=
22dd0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22de0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
22df0 20 20 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f    put4byte(findO
22e00 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72  verflowCell(pPar
22e10 65 6e 74 2c 70 61 72 65 6e 74 49 64 78 29 2c 20  ent,parentIdx), 
22e20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
22e30 70 75 74 34 62 79 74 65 28 26 70 50 61 72 65 6e  put4byte(&pParen
22e40 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74  t->aData[pParent
22e50 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
22e60 70 67 6e 6f 4e 65 77 29 3b 0a 0a 23 69 66 6e 64  pgnoNew);..#ifnd
22e70 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
22e80 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 49  UTOVACUUM.  /* I
22e90 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74  f this is an aut
22ea0 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
22eb0 65 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f  e, update the po
22ec0 69 6e 74 65 72 20 6d 61 70 0a 20 20 2a 2a 20 77  inter map.  ** w
22ed0 69 74 68 20 65 6e 74 72 69 65 73 20 66 6f 72 20  ith entries for 
22ee0 74 68 65 20 6e 65 77 20 70 61 67 65 2c 20 61 6e  the new page, an
22ef0 64 20 61 6e 79 20 70 6f 69 6e 74 65 72 20 66 72  d any pointer fr
22f00 6f 6d 20 74 68 65 20 0a 20 20 2a 2a 20 63 65 6c  om the .  ** cel
22f10 6c 20 6f 6e 20 74 68 65 20 70 61 67 65 20 74 6f  l on the page to
22f20 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
22f30 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42  e..  */.  if( pB
22f40 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
22f50 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
22f60 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77  Put(pBt, pgnoNew
22f70 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
22f80 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a  pParent->pgno);.
22f90 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
22fa0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
22fb0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
22fc0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
22fd0 75 74 4f 76 66 6c 28 70 4e 65 77 2c 20 30 29 3b  utOvfl(pNew, 0);
22fe0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
22ff0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
23000 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
23010 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
23020 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 72 65  * Release the re
23030 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6e  ference to the n
23040 65 77 20 70 61 67 65 20 61 6e 64 20 62 61 6c 61  ew page and bala
23050 6e 63 65 20 74 68 65 20 70 61 72 65 6e 74 20 70  nce the parent p
23060 61 67 65 2c 0a 20 20 2a 2a 20 69 6e 20 63 61 73  age,.  ** in cas
23070 65 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  e the divider ce
23080 6c 6c 20 69 6e 73 65 72 74 65 64 20 63 61 75 73  ll inserted caus
23090 65 64 20 69 74 20 74 6f 20 62 65 63 6f 6d 65 20  ed it to become 
230a0 6f 76 65 72 66 75 6c 6c 2e 0a 20 20 2a 2f 0a 20  overfull..  */. 
230b0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65   releasePage(pNe
230c0 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 61 6c  w);.  return bal
230d0 61 6e 63 65 28 70 50 61 72 65 6e 74 2c 20 30 29  ance(pParent, 0)
230e0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
230f0 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42  LITE_OMIT_QUICKB
23100 41 4c 41 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ALANCE */../*.**
23110 20 54 68 65 20 49 53 41 55 54 4f 56 41 43 55 55   The ISAUTOVACUU
23120 4d 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64 20  M macro is used 
23130 77 69 74 68 69 6e 20 62 61 6c 61 6e 63 65 5f 6e  within balance_n
23140 6f 6e 72 6f 6f 74 28 29 20 74 6f 20 64 65 74 65  onroot() to dete
23150 72 6d 69 6e 65 0a 2a 2a 20 69 66 20 74 68 65 20  rmine.** if the 
23160 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74  database support
23170 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6f 72  s auto-vacuum or
23180 20 6e 6f 74 2e 20 42 65 63 61 75 73 65 20 69 74   not. Because it
23190 20 69 73 20 75 73 65 64 0a 2a 2a 20 77 69 74 68   is used.** with
231a0 69 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  in an expression
231b0 20 74 68 61 74 20 69 73 20 61 6e 20 61 72 67 75   that is an argu
231c0 6d 65 6e 74 20 74 6f 20 61 6e 6f 74 68 65 72 20  ment to another 
231d0 6d 61 63 72 6f 20 0a 2a 2a 20 28 73 71 6c 69 74  macro .** (sqlit
231e0 65 4d 61 6c 6c 6f 63 52 61 77 29 2c 20 69 74 20  eMallocRaw), it 
231f0 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
23200 74 6f 20 75 73 65 20 63 6f 6e 64 69 74 69 6f 6e  to use condition
23210 61 6c 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 2e 0a  al compilation..
23220 2a 2a 20 53 6f 2c 20 74 68 69 73 20 6d 61 63 72  ** So, this macr
23230 6f 20 69 73 20 64 65 66 69 6e 65 64 20 69 6e 73  o is defined ins
23240 74 65 61 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tead..*/.#ifndef
23250 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
23260 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65 20  OVACUUM.#define 
23270 49 53 41 55 54 4f 56 41 43 55 55 4d 20 28 70 42  ISAUTOVACUUM (pB
23280 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 0a 23  t->autoVacuum).#
23290 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 49 53 41  else.#define ISA
232a0 55 54 4f 56 41 43 55 55 4d 20 30 0a 23 65 6e 64  UTOVACUUM 0.#end
232b0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
232c0 6f 75 74 69 6e 65 20 72 65 64 69 73 74 72 69 62  outine redistrib
232d0 75 74 65 73 20 43 65 6c 6c 73 20 6f 6e 20 70 50  utes Cells on pP
232e0 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 4e 4e  age and up to NN
232f0 2a 32 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 6f  *2 siblings.** o
23300 66 20 70 50 61 67 65 20 73 6f 20 74 68 61 74 20  f pPage so that 
23310 61 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 61  all pages have a
23320 62 6f 75 74 20 74 68 65 20 73 61 6d 65 20 61 6d  bout the same am
23330 6f 75 6e 74 20 6f 66 20 66 72 65 65 20 73 70 61  ount of free spa
23340 63 65 2e 0a 2a 2a 20 55 73 75 61 6c 6c 79 20 4e  ce..** Usually N
23350 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65 69  N siblings on ei
23360 74 68 65 72 20 73 69 64 65 20 6f 66 20 70 50 61  ther side of pPa
23370 67 65 20 69 73 20 75 73 65 64 20 69 6e 20 74 68  ge is used in th
23380 65 20 62 61 6c 61 6e 63 69 6e 67 2c 0a 2a 2a 20  e balancing,.** 
23390 74 68 6f 75 67 68 20 6d 6f 72 65 20 73 69 62 6c  though more sibl
233a0 69 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d 65 20  ings might come 
233b0 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 20 69 66  from one side if
233c0 20 70 50 61 67 65 20 69 73 20 74 68 65 20 66 69   pPage is the fi
233d0 72 73 74 0a 2a 2a 20 6f 72 20 6c 61 73 74 20 63  rst.** or last c
233e0 68 69 6c 64 20 6f 66 20 69 74 73 20 70 61 72 65  hild of its pare
233f0 6e 74 2e 20 20 49 66 20 70 50 61 67 65 20 68 61  nt.  If pPage ha
23400 73 20 66 65 77 65 72 20 74 68 61 6e 20 32 2a 4e  s fewer than 2*N
23410 4e 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 28 73  N siblings.** (s
23420 6f 6d 65 74 68 69 6e 67 20 77 68 69 63 68 20 63  omething which c
23430 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  an only happen i
23440 66 20 70 50 61 67 65 20 69 73 20 74 68 65 20 72  f pPage is the r
23450 6f 6f 74 20 70 61 67 65 20 6f 72 20 61 20 0a 2a  oot page or a .*
23460 2a 20 63 68 69 6c 64 20 6f 66 20 72 6f 6f 74 29  * child of root)
23470 20 74 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c 61   then all availa
23480 62 6c 65 20 73 69 62 6c 69 6e 67 73 20 70 61 72  ble siblings par
23490 74 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20  ticipate in the 
234a0 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a  balancing..**.**
234b0 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   The number of s
234c0 69 62 6c 69 6e 67 73 20 6f 66 20 70 50 61 67 65  iblings of pPage
234d0 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65 61   might be increa
234e0 73 65 64 20 6f 72 20 64 65 63 72 65 61 73 65 64  sed or decreased
234f0 20 62 79 20 6f 6e 65 20 6f 72 0a 2a 2a 20 74 77   by one or.** tw
23500 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72 74 20 74  o in an effort t
23510 6f 20 6b 65 65 70 20 70 61 67 65 73 20 6e 65 61  o keep pages nea
23520 72 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e 6f 74  rly full but not
23530 20 6f 76 65 72 20 66 75 6c 6c 2e 20 54 68 65 20   over full. The 
23540 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73 20  root page.** is 
23550 73 70 65 63 69 61 6c 20 61 6e 64 20 69 73 20 61  special and is a
23560 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 6e 65 61  llowed to be nea
23570 72 6c 79 20 65 6d 70 74 79 2e 20 49 66 20 70 50  rly empty. If pP
23580 61 67 65 20 69 73 20 0a 2a 2a 20 74 68 65 20 72  age is .** the r
23590 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74  oot page, then t
235a0 68 65 20 64 65 70 74 68 20 6f 66 20 74 68 65 20  he depth of the 
235b0 74 72 65 65 20 6d 69 67 68 74 20 62 65 20 69 6e  tree might be in
235c0 63 72 65 61 73 65 64 0a 2a 2a 20 6f 72 20 64 65  creased.** or de
235d0 63 72 65 61 73 65 64 20 62 79 20 6f 6e 65 2c 20  creased by one, 
235e0 61 73 20 6e 65 63 65 73 73 61 72 79 2c 20 74 6f  as necessary, to
235f0 20 6b 65 65 70 20 74 68 65 20 72 6f 6f 74 20 70   keep the root p
23600 61 67 65 20 66 72 6f 6d 20 62 65 69 6e 67 0a 2a  age from being.*
23610 2a 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 63 6f  * overfull or co
23620 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 0a  mpletely empty..
23630 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
23640 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
23650 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d  e is called, som
23660 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 73 20 6f  e of the Cells o
23670 6e 20 70 50 61 67 65 0a 2a 2a 20 6d 69 67 68 74  n pPage.** might
23680 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 62 65   not actually be
23690 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61 67 65   stored in pPage
236a0 2d 3e 61 44 61 74 61 5b 5d 2e 20 20 54 68 69 73  ->aData[].  This
236b0 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a 20 69   can happen.** i
236c0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6f 76  f the page is ov
236d0 65 72 66 75 6c 6c 2e 20 20 50 61 72 74 20 6f 66  erfull.  Part of
236e0 20 74 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73   the job of this
236f0 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 0a 2a   routine is to.*
23700 2a 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  * make sure all 
23710 43 65 6c 6c 73 20 66 6f 72 20 70 50 61 67 65 20  Cells for pPage 
23720 6f 6e 63 65 20 61 67 61 69 6e 20 66 69 74 20 69  once again fit i
23730 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  n pPage->aData[]
23740 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63  ..**.** In the c
23750 6f 75 72 73 65 20 6f 66 20 62 61 6c 61 6e 63 69  ourse of balanci
23760 6e 67 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  ng the siblings 
23770 6f 66 20 70 50 61 67 65 2c 20 74 68 65 20 70 61  of pPage, the pa
23780 72 65 6e 74 20 6f 66 20 70 50 61 67 65 0a 2a 2a  rent of pPage.**
23790 20 6d 69 67 68 74 20 62 65 63 6f 6d 65 20 6f 76   might become ov
237a0 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66  erfull or underf
237b0 75 6c 6c 2e 20 20 49 66 20 74 68 61 74 20 68 61  ull.  If that ha
237c0 70 70 65 6e 73 2c 20 74 68 65 6e 20 74 68 69 73  ppens, then this
237d0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63   routine.** is c
237e0 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c  alled recursivel
237f0 79 20 6f 6e 20 74 68 65 20 70 61 72 65 6e 74 2e  y on the parent.
23800 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 72  .**.** If this r
23810 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 66 6f 72  outine fails for
23820 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 69 74 20   any reason, it 
23830 6d 69 67 68 74 20 6c 65 61 76 65 20 74 68 65 20  might leave the 
23840 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 61  database.** in a
23850 20 63 6f 72 72 75 70 74 65 64 20 73 74 61 74 65   corrupted state
23860 2e 20 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  .  So if this ro
23870 75 74 69 6e 65 20 66 61 69 6c 73 2c 20 74 68 65  utine fails, the
23880 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64   database should
23890 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  .** be rolled ba
238a0 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ck..*/.static in
238b0 74 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f  t balance_nonroo
238c0 74 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  t(MemPage *pPage
238d0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
238e0 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20  arent;          
238f0 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20    /* The parent 
23900 6f 66 20 70 50 61 67 65 20 2a 2f 0a 20 20 42 74  of pPage */.  Bt
23910 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
23920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23930 20 54 68 65 20 77 68 6f 6c 65 20 64 61 74 61 62   The whole datab
23940 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  ase */.  int nCe
23950 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ll = 0;         
23960 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
23970 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  of cells in apCe
23980 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  ll[] */.  int nM
23990 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20  axCells = 0;    
239a0 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
239b0 74 65 64 20 73 69 7a 65 20 6f 66 20 61 70 43 65  ted size of apCe
239c0 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61 46 72 6f  ll, szCell, aFro
239d0 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64  m. */.  int nOld
239e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
239f0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
23a00 66 20 70 61 67 65 73 20 69 6e 20 61 70 4f 6c 64  f pages in apOld
23a10 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77  [] */.  int nNew
23a20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23a30 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
23a40 66 20 70 61 67 65 73 20 69 6e 20 61 70 4e 65 77  f pages in apNew
23a50 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 69 76  [] */.  int nDiv
23a60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23a70 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
23a80 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 44 69 76  f cells in apDiv
23a90 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  [] */.  int i, j
23aa0 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  , k;            
23ab0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
23ac0 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  nters */.  int i
23ad0 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
23ae0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
23af0 20 6f 66 20 70 50 61 67 65 20 69 6e 20 70 50 61   of pPage in pPa
23b00 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f  rent->aCell[] */
23b10 0a 20 20 69 6e 74 20 6e 78 44 69 76 3b 20 20 20  .  int nxDiv;   
23b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b30 2f 2a 20 4e 65 78 74 20 64 69 76 69 64 65 72 20  /* Next divider 
23b40 73 6c 6f 74 20 69 6e 20 70 50 61 72 65 6e 74 2d  slot in pParent-
23b50 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e  >aCell[] */.  in
23b60 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
23b70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
23b80 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  e return code */
23b90 0a 20 20 69 6e 74 20 6c 65 61 66 43 6f 72 72 65  .  int leafCorre
23ba0 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  ction;          
23bb0 2f 2a 20 34 20 69 66 20 70 50 61 67 65 20 69 73  /* 4 if pPage is
23bc0 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20 6e   a leaf.  0 if n
23bd0 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66  ot */.  int leaf
23be0 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
23bf0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
23c00 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 20  pPage is a leaf 
23c10 6f 66 20 61 20 4c 45 41 46 44 41 54 41 20 74 72  of a LEAFDATA tr
23c20 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62  ee */.  int usab
23c30 6c 65 53 70 61 63 65 3b 20 20 20 20 20 20 20 20  leSpace;        
23c40 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 69 6e       /* Bytes in
23c50 20 70 50 61 67 65 20 62 65 79 6f 6e 64 20 74 68   pPage beyond th
23c60 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  e header */.  in
23c70 74 20 70 61 67 65 46 6c 61 67 73 3b 20 20 20 20  t pageFlags;    
23c80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
23c90 6c 75 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44  lue of pPage->aD
23ca0 61 74 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74 20  ata[0] */.  int 
23cb0 73 75 62 74 6f 74 61 6c 3b 20 20 20 20 20 20 20  subtotal;       
23cc0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 74           /* Subt
23cd0 6f 74 61 6c 20 6f 66 20 62 79 74 65 73 20 69 6e  otal of bytes in
23ce0 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20 70 61   cells on one pa
23cf0 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70 61  ge */.  int iSpa
23d00 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ce = 0;         
23d10 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e       /* First un
23d20 75 73 65 64 20 62 79 74 65 20 6f 66 20 61 53 70  used byte of aSp
23d30 61 63 65 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61  ace[] */.  MemPa
23d40 67 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20 20  ge *apOld[NB];  
23d50 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65          /* pPage
23d60 20 61 6e 64 20 75 70 20 74 6f 20 74 77 6f 20 73   and up to two s
23d70 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 50 67 6e  iblings */.  Pgn
23d80 6f 20 70 67 6e 6f 4f 6c 64 5b 4e 42 5d 3b 20 20  o pgnoOld[NB];  
23d90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
23da0 65 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 65 61  e numbers for ea
23db0 63 68 20 70 61 67 65 20 69 6e 20 61 70 4f 6c 64  ch page in apOld
23dc0 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  [] */.  MemPage 
23dd0 2a 61 70 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20  *apCopy[NB];    
23de0 20 20 20 20 20 2f 2a 20 50 72 69 76 61 74 65 20       /* Private 
23df0 63 6f 70 69 65 73 20 6f 66 20 61 70 4f 6c 64 5b  copies of apOld[
23e00 5d 20 70 61 67 65 73 20 2a 2f 0a 20 20 4d 65 6d  ] pages */.  Mem
23e10 50 61 67 65 20 2a 61 70 4e 65 77 5b 4e 42 2b 32  Page *apNew[NB+2
23e20 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61  ];        /* pPa
23e30 67 65 20 61 6e 64 20 75 70 20 74 6f 20 4e 42 20  ge and up to NB 
23e40 73 69 62 6c 69 6e 67 73 20 61 66 74 65 72 20 62  siblings after b
23e50 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20 20 50 67  alancing */.  Pg
23e60 6e 6f 20 70 67 6e 6f 4e 65 77 5b 4e 42 2b 32 5d  no pgnoNew[NB+2]
23e70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ;          /* Pa
23e80 67 65 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 65  ge numbers for e
23e90 61 63 68 20 70 61 67 65 20 69 6e 20 61 70 4e 65  ach page in apNe
23ea0 77 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 70 44  w[] */.  u8 *apD
23eb0 69 76 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20  iv[NB];         
23ec0 20 20 20 20 20 20 2f 2a 20 44 69 76 69 64 65 72        /* Divider
23ed0 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e   cells in pParen
23ee0 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 4e 65  t */.  int cntNe
23ef0 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20  w[NB+2];        
23f00 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
23f10 61 43 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20  aCell[] of cell 
23f20 61 66 74 65 72 20 69 2d 74 68 20 70 61 67 65 20  after i-th page 
23f30 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77 5b 4e  */.  int szNew[N
23f40 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20  B+2];           
23f50 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 73 69    /* Combined si
23f60 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70 6c 61 63  ze of cells plac
23f70 65 20 6f 6e 20 69 2d 74 68 20 70 61 67 65 20 2a  e on i-th page *
23f80 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 20  /.  u8 **apCell 
23f90 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
23fa0 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65   /* All cells be
23fb0 67 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a  gin balanced */.
23fc0 20 20 69 6e 74 20 2a 73 7a 43 65 6c 6c 3b 20 20    int *szCell;  
23fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23fe0 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20  * Local size of 
23ff0 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43  all cells in apC
24000 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61  ell[] */.  u8 *a
24010 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20  Copy[NB];       
24020 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
24030 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 64 61 74   for holding dat
24040 61 20 6f 66 20 61 70 43 6f 70 79 5b 5d 20 2a 2f  a of apCopy[] */
24050 0a 20 20 75 38 20 2a 61 53 70 61 63 65 3b 20 20  .  u8 *aSpace;  
24060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24070 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  /* Space to hold
24080 20 63 6f 70 69 65 73 20 6f 66 20 64 69 76 69 64   copies of divid
24090 65 72 73 20 63 65 6c 6c 73 20 2a 2f 0a 23 69 66  ers cells */.#if
240a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
240b0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 75 38  _AUTOVACUUM.  u8
240c0 20 2a 61 46 72 6f 6d 20 3d 20 30 3b 0a 23 65 6e   *aFrom = 0;.#en
240d0 64 69 66 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  dif..  /* .  ** 
240e0 46 69 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20  Find the parent 
240f0 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  page..  */.  ass
24100 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
24110 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  it );.  assert( 
24120 73 71 6c 69 74 65 33 70 61 67 65 72 5f 69 73 77  sqlite3pager_isw
24130 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
24140 61 44 61 74 61 29 20 29 3b 0a 20 20 70 42 74 20  aData) );.  pBt 
24150 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
24160 70 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d  pParent = pPage-
24170 3e 70 50 61 72 65 6e 74 3b 0a 20 20 61 73 73 65  >pParent;.  asse
24180 72 74 28 20 70 50 61 72 65 6e 74 20 29 3b 0a 20  rt( pParent );. 
24190 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
241a0 28 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67  (rc = sqlite3pag
241b0 65 72 5f 77 72 69 74 65 28 70 50 61 72 65 6e 74  er_write(pParent
241c0 2d 3e 61 44 61 74 61 29 29 20 29 7b 0a 20 20 20  ->aData)) ){.   
241d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
241e0 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
241f0 45 3a 20 62 65 67 69 6e 20 70 61 67 65 20 25 64  E: begin page %d
24200 20 63 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c   child of %d\n",
24210 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50   pPage->pgno, pP
24220 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 0a  arent->pgno));..
24230 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
24240 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45  MIT_QUICKBALANCE
24250 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 20 73 70 65  .  /*.  ** A spe
24260 63 69 61 6c 20 63 61 73 65 3a 20 20 49 66 20 61  cial case:  If a
24270 20 6e 65 77 20 65 6e 74 72 79 20 68 61 73 20 6a   new entry has j
24280 75 73 74 20 62 65 65 6e 20 69 6e 73 65 72 74 65  ust been inserte
24290 64 20 69 6e 74 6f 20 61 0a 20 20 2a 2a 20 74 61  d into a.  ** ta
242a0 62 6c 65 20 28 74 68 61 74 20 69 73 2c 20 61 20  ble (that is, a 
242b0 62 74 72 65 65 20 77 69 74 68 20 69 6e 74 65 67  btree with integ
242c0 65 72 20 6b 65 79 73 20 61 6e 64 20 61 6c 6c 20  er keys and all 
242d0 64 61 74 61 20 61 74 20 74 68 65 20 6c 65 61 76  data at the leav
242e0 65 73 29 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  es).  ** and the
242f0 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 74 68   new entry is th
24300 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
24310 72 79 20 69 6e 20 74 68 65 20 74 72 65 65 20 28  ry in the tree (
24320 69 74 20 68 61 73 20 74 68 65 0a 20 20 2a 2a 20  it has the.  ** 
24330 6c 61 72 67 65 73 74 20 6b 65 79 29 20 74 68 65  largest key) the
24340 6e 20 75 73 65 20 74 68 65 20 73 70 65 63 69 61  n use the specia
24350 6c 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28  l balance_quick(
24360 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 0a 20 20  ) routine for.  
24370 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 2e 20 20 62  ** balancing.  b
24380 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69  alance_quick() i
24390 73 20 6d 75 63 68 20 66 61 73 74 65 72 20 61 6e  s much faster an
243a0 64 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74  d results in a t
243b0 69 67 68 74 65 72 0a 20 20 2a 2a 20 70 61 63 6b  ighter.  ** pack
243c0 69 6e 67 20 6f 66 20 64 61 74 61 20 69 6e 20 74  ing of data in t
243d0 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a  he common case..
243e0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
243f0 2d 3e 6c 65 61 66 20 26 26 0a 20 20 20 20 20 20  ->leaf &&.      
24400 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
24410 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 6c 65  .      pPage->le
24420 61 66 44 61 74 61 20 26 26 0a 20 20 20 20 20 20  afData &&.      
24430 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
24440 3d 3d 31 20 26 26 0a 20 20 20 20 20 20 70 50 61  ==1 &&.      pPa
24450 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78  ge->aOvfl[0].idx
24460 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 26  ==pPage->nCell &
24470 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70  &.      pPage->p
24480 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20  Parent->pgno!=1 
24490 26 26 0a 20 20 20 20 20 20 67 65 74 34 62 79 74  &&.      get4byt
244a0 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
244b0 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
244c0 66 73 65 74 2b 38 5d 29 3d 3d 70 50 61 67 65 2d  fset+8])==pPage-
244d0 3e 70 67 6e 6f 0a 20 20 29 7b 0a 20 20 20 20 2f  >pgno.  ){.    /
244e0 2a 0a 20 20 20 20 2a 2a 20 54 4f 44 4f 3a 20 43  *.    ** TODO: C
244f0 68 65 63 6b 20 74 68 65 20 73 69 62 6c 69 6e 67  heck the sibling
24500 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  s to the left of
24510 20 70 50 61 67 65 2e 20 49 74 20 6d 61 79 20 62   pPage. It may b
24520 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68  e that.    ** th
24530 65 79 20 61 72 65 20 6e 6f 74 20 66 75 6c 6c 20  ey are not full 
24540 61 6e 64 20 6e 6f 20 6e 65 77 20 70 61 67 65 20  and no new page 
24550 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20  is required..   
24560 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 62   */.    return b
24570 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 70 50 61  alance_quick(pPa
24580 67 65 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20  ge, pParent);.  
24590 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20  }.#endif..  /*. 
245a0 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 65 6c   ** Find the cel
245b0 6c 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20  l in the parent 
245c0 70 61 67 65 20 77 68 6f 73 65 20 6c 65 66 74 20  page whose left 
245d0 63 68 69 6c 64 20 70 6f 69 6e 74 73 20 62 61 63  child points bac
245e0 6b 0a 20 20 2a 2a 20 74 6f 20 70 50 61 67 65 2e  k.  ** to pPage.
245f0 20 20 54 68 65 20 22 69 64 78 22 20 76 61 72 69    The "idx" vari
24600 61 62 6c 65 20 69 73 20 74 68 65 20 69 6e 64 65  able is the inde
24610 78 20 6f 66 20 74 68 61 74 20 63 65 6c 6c 2e 20  x of that cell. 
24620 20 49 66 20 70 50 61 67 65 0a 20 20 2a 2a 20 69   If pPage.  ** i
24630 73 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20  s the rightmost 
24640 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74  child of pParent
24650 20 74 68 65 6e 20 73 65 74 20 69 64 78 20 74 6f   then set idx to
24660 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20   pParent->nCell 
24670 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
24680 65 6e 74 2d 3e 69 64 78 53 68 69 66 74 20 29 7b  ent->idxShift ){
24690 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  .    Pgno pgno;.
246a0 20 20 20 20 70 67 6e 6f 20 3d 20 70 50 61 67 65      pgno = pPage
246b0 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65  ->pgno;.    asse
246c0 72 74 28 20 70 67 6e 6f 3d 3d 73 71 6c 69 74 65  rt( pgno==sqlite
246d0 33 70 61 67 65 72 5f 70 61 67 65 6e 75 6d 62 65  3pager_pagenumbe
246e0 72 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 20  r(pPage->aData) 
246f0 29 3b 0a 20 20 20 20 66 6f 72 28 69 64 78 3d 30  );.    for(idx=0
24700 3b 20 69 64 78 3c 70 50 61 72 65 6e 74 2d 3e 6e  ; idx<pParent->n
24710 43 65 6c 6c 3b 20 69 64 78 2b 2b 29 7b 0a 20 20  Cell; idx++){.  
24720 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65      if( get4byte
24730 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e  (findCell(pParen
24740 74 2c 20 69 64 78 29 29 3d 3d 70 67 6e 6f 20 29  t, idx))==pgno )
24750 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
24760 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
24770 20 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 70     assert( idx<p
24780 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 0a 20 20  Parent->nCell.  
24790 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 67 65             || ge
247a0 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
247b0 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
247c0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 70  hdrOffset+8])==p
247d0 67 6e 6f 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  gno );.  }else{.
247e0 20 20 20 20 69 64 78 20 3d 20 70 50 61 67 65 2d      idx = pPage-
247f0 3e 69 64 78 50 61 72 65 6e 74 3b 0a 20 20 7d 0a  >idxParent;.  }.
24800 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 6e 69 74 69  .  /*.  ** Initi
24810 61 6c 69 7a 65 20 76 61 72 69 61 62 6c 65 73 20  alize variables 
24820 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20  so that it will 
24830 62 65 20 73 61 66 65 20 74 6f 20 6a 75 6d 70 0a  be safe to jump.
24840 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f    ** directly to
24850 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
24860 20 61 74 20 61 6e 79 20 6d 6f 6d 65 6e 74 2e 0a   at any moment..
24870 20 20 2a 2f 0a 20 20 6e 4f 6c 64 20 3d 20 6e 4e    */.  nOld = nN
24880 65 77 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  ew = 0;.  sqlite
24890 33 70 61 67 65 72 5f 72 65 66 28 70 50 61 72 65  3pager_ref(pPare
248a0 6e 74 2d 3e 61 44 61 74 61 29 3b 0a 0a 20 20 2f  nt->aData);..  /
248b0 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 73 69 62 6c  *.  ** Find sibl
248c0 69 6e 67 20 70 61 67 65 73 20 74 6f 20 70 50 61  ing pages to pPa
248d0 67 65 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 73  ge and the cells
248e0 20 69 6e 20 70 50 61 72 65 6e 74 20 74 68 61 74   in pParent that
248f0 20 64 69 76 69 64 65 0a 20 20 2a 2a 20 74 68 65   divide.  ** the
24900 20 73 69 62 6c 69 6e 67 73 2e 20 20 41 6e 20 61   siblings.  An a
24910 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
24920 6f 20 66 69 6e 64 20 4e 4e 20 73 69 62 6c 69 6e  o find NN siblin
24930 67 73 20 6f 6e 20 65 69 74 68 65 72 0a 20 20 2a  gs on either.  *
24940 2a 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 2e  * side of pPage.
24950 20 20 4d 6f 72 65 20 73 69 62 6c 69 6e 67 73 20    More siblings 
24960 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 6f  are taken from o
24970 6e 65 20 73 69 64 65 2c 20 68 6f 77 65 76 65 72  ne side, however
24980 2c 20 69 66 0a 20 20 2a 2a 20 70 50 61 67 65 20  , if.  ** pPage 
24990 74 68 65 72 65 20 61 72 65 20 66 65 77 65 72 20  there are fewer 
249a0 74 68 61 6e 20 4e 4e 20 73 69 62 6c 69 6e 67 73  than NN siblings
249b0 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 73 69   on the other si
249c0 64 65 2e 20 20 49 66 20 70 50 61 72 65 6e 74 0a  de.  If pParent.
249d0 20 20 2a 2a 20 68 61 73 20 4e 42 20 6f 72 20 66    ** has NB or f
249e0 65 77 65 72 20 63 68 69 6c 64 72 65 6e 20 74 68  ewer children th
249f0 65 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20  en all children 
24a00 6f 66 20 70 50 61 72 65 6e 74 20 61 72 65 20 74  of pParent are t
24a10 61 6b 65 6e 2e 0a 20 20 2a 2f 0a 20 20 6e 78 44  aken..  */.  nxD
24a20 69 76 20 3d 20 69 64 78 20 2d 20 4e 4e 3b 0a 20  iv = idx - NN;. 
24a30 20 69 66 28 20 6e 78 44 69 76 20 2b 20 4e 42 20   if( nxDiv + NB 
24a40 3e 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  > pParent->nCell
24a50 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d 20   ){.    nxDiv = 
24a60 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 2d  pParent->nCell -
24a70 20 4e 42 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 69   NB + 1;.  }.  i
24a80 66 28 20 6e 78 44 69 76 3c 30 20 29 7b 0a 20 20  f( nxDiv<0 ){.  
24a90 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20 7d    nxDiv = 0;.  }
24aa0 0a 20 20 6e 44 69 76 20 3d 20 30 3b 0a 20 20 66  .  nDiv = 0;.  f
24ab0 6f 72 28 69 3d 30 2c 20 6b 3d 6e 78 44 69 76 3b  or(i=0, k=nxDiv;
24ac0 20 69 3c 4e 42 3b 20 69 2b 2b 2c 20 6b 2b 2b 29   i<NB; i++, k++)
24ad0 7b 0a 20 20 20 20 69 66 28 20 6b 3c 70 50 61 72  {.    if( k<pPar
24ae0 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  ent->nCell ){.  
24af0 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 66      apDiv[i] = f
24b00 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  indCell(pParent,
24b10 20 6b 29 3b 0a 20 20 20 20 20 20 6e 44 69 76 2b   k);.      nDiv+
24b20 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  +;.      assert(
24b30 20 21 70 50 61 72 65 6e 74 2d 3e 6c 65 61 66 20   !pParent->leaf 
24b40 29 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4f 6c 64  );.      pgnoOld
24b50 5b 69 5d 20 3d 20 67 65 74 34 62 79 74 65 28 61  [i] = get4byte(a
24b60 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 7d 65  pDiv[i]);.    }e
24b70 6c 73 65 20 69 66 28 20 6b 3d 3d 70 50 61 72 65  lse if( k==pPare
24b80 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  nt->nCell ){.   
24b90 20 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20     pgnoOld[i] = 
24ba0 67 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e  get4byte(&pParen
24bb0 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74  t->aData[pParent
24bc0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
24bd0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
24be0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
24bf0 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e     rc = getAndIn
24c00 69 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f  itPage(pBt, pgno
24c10 4f 6c 64 5b 69 5d 2c 20 26 61 70 4f 6c 64 5b 69  Old[i], &apOld[i
24c20 5d 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20 20  ], pParent);.   
24c30 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
24c40 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
24c50 20 20 20 20 61 70 4f 6c 64 5b 69 5d 2d 3e 69 64      apOld[i]->id
24c60 78 50 61 72 65 6e 74 20 3d 20 6b 3b 0a 20 20 20  xParent = k;.   
24c70 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20 30 3b 0a   apCopy[i] = 0;.
24c80 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 6e      assert( i==n
24c90 4f 6c 64 20 29 3b 0a 20 20 20 20 6e 4f 6c 64 2b  Old );.    nOld+
24ca0 2b 3b 0a 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73  +;.    nMaxCells
24cb0 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e   += 1+apOld[i]->
24cc0 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e  nCell+apOld[i]->
24cd0 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 7d 0a 0a  nOverflow;.  }..
24ce0 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43 65    /* Make nMaxCe
24cf0 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f  lls a multiple o
24d00 66 20 32 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  f 2 in order to 
24d10 70 72 65 73 65 72 76 65 20 38 2d 62 79 74 65 0a  preserve 8-byte.
24d20 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20 2a    ** alignment *
24d30 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20  /.  nMaxCells = 
24d40 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 31 29 26  (nMaxCells + 1)&
24d50 7e 31 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41  ~1;..  /*.  ** A
24d60 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
24d70 72 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  r memory structu
24d80 72 65 73 0a 20 20 2a 2f 0a 20 20 61 70 43 65 6c  res.  */.  apCel
24d90 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  l = sqliteMalloc
24da0 52 61 77 28 20 0a 20 20 20 20 20 20 20 6e 4d 61  Raw( .       nMa
24db0 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 38  xCells*sizeof(u8
24dc0 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *)              
24dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24de0 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b  apCell */.     +
24df0 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f   nMaxCells*sizeo
24e00 66 28 69 6e 74 29 20 20 20 20 20 20 20 20 20 20  f(int)          
24e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e20 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20   /* szCell */.  
24e30 20 20 20 2b 20 52 4f 55 4e 44 38 28 73 69 7a 65     + ROUND8(size
24e40 6f 66 28 4d 65 6d 50 61 67 65 29 29 2a 4e 42 20  of(MemPage))*NB 
24e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e60 20 20 20 20 20 2f 2a 20 61 43 6f 70 79 20 2a 2f       /* aCopy */
24e70 0a 20 20 20 20 20 2b 20 70 42 74 2d 3e 70 61 67  .     + pBt->pag
24e80 65 53 69 7a 65 2a 28 35 2b 4e 42 29 20 20 20 20  eSize*(5+NB)    
24e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ea0 20 20 20 20 20 20 20 20 2f 2a 20 61 53 70 61 63          /* aSpac
24eb0 65 20 2a 2f 0a 20 20 20 20 20 2b 20 28 49 53 41  e */.     + (ISA
24ec0 55 54 4f 56 41 43 55 55 4d 20 3f 20 6e 4d 61 78  UTOVACUUM ? nMax
24ed0 43 65 6c 6c 73 20 3a 20 30 29 20 20 20 20 20 20  Cells : 0)      
24ee0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
24ef0 46 72 6f 6d 20 2a 2f 0a 20 20 29 3b 0a 20 20 69  From */.  );.  i
24f00 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a  f( apCell==0 ){.
24f10 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
24f20 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20  NOMEM;.    goto 
24f30 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
24f40 0a 20 20 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d 20  .  }.  szCell = 
24f50 28 69 6e 74 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d  (int*)&apCell[nM
24f60 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 43 6f 70  axCells];.  aCop
24f70 79 5b 30 5d 20 3d 20 28 75 38 2a 29 26 73 7a 43  y[0] = (u8*)&szC
24f80 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a  ell[nMaxCells];.
24f90 20 20 61 73 73 65 72 74 28 20 28 28 61 43 6f 70    assert( ((aCop
24fa0 79 5b 30 5d 20 2d 20 28 75 38 2a 29 61 70 43 65  y[0] - (u8*)apCe
24fb0 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f  ll) & 7)==0 ); /
24fc0 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65  * 8-byte alignme
24fd0 6e 74 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  nt required */. 
24fe0 20 66 6f 72 28 69 3d 31 3b 20 69 3c 4e 42 3b 20   for(i=1; i<NB; 
24ff0 69 2b 2b 29 7b 0a 20 20 20 20 61 43 6f 70 79 5b  i++){.    aCopy[
25000 69 5d 20 3d 20 26 61 43 6f 70 79 5b 69 2d 31 5d  i] = &aCopy[i-1]
25010 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2b 52  [pBt->pageSize+R
25020 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d  OUND8(sizeof(Mem
25030 50 61 67 65 29 29 5d 3b 0a 20 20 20 20 61 73 73  Page))];.    ass
25040 65 72 74 28 20 28 28 61 43 6f 70 79 5b 69 5d 20  ert( ((aCopy[i] 
25050 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c 29 20 26  - (u8*)apCell) &
25060 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d 62   7)==0 ); /* 8-b
25070 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72 65  yte alignment re
25080 71 75 69 72 65 64 20 2a 2f 0a 20 20 7d 0a 20 20  quired */.  }.  
25090 61 53 70 61 63 65 20 3d 20 26 61 43 6f 70 79 5b  aSpace = &aCopy[
250a0 4e 42 2d 31 5d 5b 70 42 74 2d 3e 70 61 67 65 53  NB-1][pBt->pageS
250b0 69 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f  ize+ROUND8(sizeo
250c0 66 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a 20 20  f(MemPage))];.  
250d0 61 73 73 65 72 74 28 20 28 28 61 53 70 61 63 65  assert( ((aSpace
250e0 20 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c 29 20   - (u8*)apCell) 
250f0 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d  & 7)==0 ); /* 8-
25100 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72  byte alignment r
25110 65 71 75 69 72 65 64 20 2a 2f 0a 23 69 66 6e 64  equired */.#ifnd
25120 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
25130 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20  UTOVACUUM.  if( 
25140 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
25150 29 7b 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 26  ){.    aFrom = &
25160 61 53 70 61 63 65 5b 35 2a 70 42 74 2d 3e 70 61  aSpace[5*pBt->pa
25170 67 65 53 69 7a 65 5d 3b 0a 20 20 7d 0a 23 65 6e  geSize];.  }.#en
25180 64 69 66 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a  dif.  .  /*.  **
25190 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20   Make copies of 
251a0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70  the content of p
251b0 50 61 67 65 20 61 6e 64 20 69 74 73 20 73 69 62  Page and its sib
251c0 6c 69 6e 67 73 20 69 6e 74 6f 20 61 4f 6c 64 5b  lings into aOld[
251d0 5d 2e 0a 20 20 2a 2a 20 54 68 65 20 72 65 73 74  ]..  ** The rest
251e0 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
251f0 6e 20 77 69 6c 6c 20 75 73 65 20 64 61 74 61 20  n will use data 
25200 66 72 6f 6d 20 74 68 65 20 63 6f 70 69 65 73 20  from the copies 
25210 72 61 74 68 65 72 0a 20 20 2a 2a 20 74 68 61 74  rather.  ** that
25220 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
25230 67 65 73 20 73 69 6e 63 65 20 74 68 65 20 6f 72  ges since the or
25240 69 67 69 6e 61 6c 20 70 61 67 65 73 20 77 69 6c  iginal pages wil
25250 6c 20 62 65 20 69 6e 20 74 68 65 0a 20 20 2a 2a  l be in the.  **
25260 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e   process of bein
25270 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a 20  g overwritten.. 
25280 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
25290 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nOld; i++){.   
252a0 20 4d 65 6d 50 61 67 65 20 2a 70 20 3d 20 61 70   MemPage *p = ap
252b0 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61  Copy[i] = (MemPa
252c0 67 65 2a 29 26 61 43 6f 70 79 5b 69 5d 5b 70 42  ge*)&aCopy[i][pB
252d0 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20  t->pageSize];.  
252e0 20 20 70 2d 3e 61 44 61 74 61 20 3d 20 26 28 28    p->aData = &((
252f0 75 38 2a 29 70 29 5b 2d 70 42 74 2d 3e 70 61 67  u8*)p)[-pBt->pag
25300 65 53 69 7a 65 5d 3b 0a 20 20 20 20 6d 65 6d 63  eSize];.    memc
25310 70 79 28 70 2d 3e 61 44 61 74 61 2c 20 61 70 4f  py(p->aData, apO
25320 6c 64 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70 42  ld[i]->aData, pB
25330 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 73 69  t->pageSize + si
25340 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a  zeof(MemPage));.
25350 20 20 20 20 2f 2a 20 54 68 65 20 6d 65 6d 63 70      /* The memcp
25360 79 28 29 20 61 62 6f 76 65 20 63 68 61 6e 67 65  y() above change
25370 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 70  s the value of p
25380 2d 3e 61 44 61 74 61 20 73 6f 20 77 65 20 68 61  ->aData so we ha
25390 76 65 20 74 6f 0a 20 20 20 20 2a 2a 20 73 65 74  ve to.    ** set
253a0 20 69 74 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20   it again. */.  
253b0 20 20 70 2d 3e 61 44 61 74 61 20 3d 20 26 28 28    p->aData = &((
253c0 75 38 2a 29 70 29 5b 2d 70 42 74 2d 3e 70 61 67  u8*)p)[-pBt->pag
253d0 65 53 69 7a 65 5d 3b 0a 20 20 7d 0a 0a 20 20 2f  eSize];.  }..  /
253e0 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69 6e  *.  ** Load poin
253f0 74 65 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c 6c  ters to all cell
25400 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61 67  s on sibling pag
25410 65 73 20 61 6e 64 20 74 68 65 20 64 69 76 69 64  es and the divid
25420 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e  er cells.  ** in
25430 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61 70 43  to the local apC
25440 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d 61  ell[] array.  Ma
25450 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65  ke copies of the
25460 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20   divider cells. 
25470 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65 20 6f   ** into space o
25480 62 74 61 69 6e 65 64 20 66 6f 72 6d 20 61 53 70  btained form aSp
25490 61 63 65 5b 5d 20 61 6e 64 20 72 65 6d 6f 76 65  ace[] and remove
254a0 20 74 68 65 20 74 68 65 20 64 69 76 69 64 65 72   the the divider
254b0 20 43 65 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f 6d   Cells.  ** from
254c0 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a 20   pParent..  **. 
254d0 20 2a 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69   ** If the sibli
254e0 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65 61 66 20  ngs are on leaf 
254f0 70 61 67 65 73 2c 20 74 68 65 6e 20 74 68 65 20  pages, then the 
25500 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 20 6f  child pointers o
25510 66 20 74 68 65 0a 20 20 2a 2a 20 64 69 76 69 64  f the.  ** divid
25520 65 72 20 63 65 6c 6c 73 20 61 72 65 20 73 74 72  er cells are str
25530 69 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63  ipped from the c
25540 65 6c 6c 73 20 62 65 66 6f 72 65 20 74 68 65 79  ells before they
25550 20 61 72 65 20 63 6f 70 69 65 64 0a 20 20 2a 2a   are copied.  **
25560 20 69 6e 74 6f 20 61 53 70 61 63 65 5b 5d 2e 20   into aSpace[]. 
25570 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20 61 6c   In this way, al
25580 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  l cells in apCel
25590 6c 5b 5d 20 61 72 65 20 77 69 74 68 6f 75 74 0a  l[] are without.
255a0 20 20 2a 2a 20 63 68 69 6c 64 20 70 6f 69 6e 74    ** child point
255b0 65 72 73 2e 20 20 49 66 20 73 69 62 6c 69 6e 67  ers.  If sibling
255c0 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73  s are not leaves
255d0 2c 20 74 68 65 6e 20 61 6c 6c 20 63 65 6c 6c 20  , then all cell 
255e0 69 6e 0a 20 20 2a 2a 20 61 70 43 65 6c 6c 5b 5d  in.  ** apCell[]
255f0 20 69 6e 63 6c 75 64 65 20 63 68 69 6c 64 20 70   include child p
25600 6f 69 6e 74 65 72 73 2e 20 20 45 69 74 68 65 72  ointers.  Either
25610 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20   way, all cells 
25620 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a 2a  in apCell[].  **
25630 20 61 72 65 20 61 6c 69 6b 65 2e 0a 20 20 2a 2a   are alike..  **
25640 0a 20 20 2a 2a 20 6c 65 61 66 43 6f 72 72 65 63  .  ** leafCorrec
25650 74 69 6f 6e 3a 20 20 34 20 69 66 20 70 50 61 67  tion:  4 if pPag
25660 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20  e is a leaf.  0 
25670 69 66 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20  if pPage is not 
25680 61 20 6c 65 61 66 2e 0a 20 20 2a 2a 20 20 20 20  a leaf..  **    
25690 20 20 20 6c 65 61 66 44 61 74 61 3a 20 20 31 20     leafData:  1 
256a0 69 66 20 70 50 61 67 65 20 68 6f 6c 64 73 20 6b  if pPage holds k
256b0 65 79 2b 64 61 74 61 20 61 6e 64 20 70 50 61 72  ey+data and pPar
256c0 65 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c 79 20 6b  ent holds only k
256d0 65 79 73 2e 0a 20 20 2a 2f 0a 20 20 6e 43 65 6c  eys..  */.  nCel
256e0 6c 20 3d 20 30 3b 0a 20 20 6c 65 61 66 43 6f 72  l = 0;.  leafCor
256f0 72 65 63 74 69 6f 6e 20 3d 20 70 50 61 67 65 2d  rection = pPage-
25700 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61 66 44  >leaf*4;.  leafD
25710 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61  ata = pPage->lea
25720 66 44 61 74 61 20 26 26 20 70 50 61 67 65 2d 3e  fData && pPage->
25730 6c 65 61 66 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  leaf;.  for(i=0;
25740 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20   i<nOld; i++){. 
25750 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64     MemPage *pOld
25760 20 3d 20 61 70 43 6f 70 79 5b 69 5d 3b 0a 20 20   = apCopy[i];.  
25770 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 70 4f    int limit = pO
25780 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d 3e  ld->nCell+pOld->
25790 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 66  nOverflow;.    f
257a0 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b  or(j=0; j<limit;
257b0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73   j++){.      ass
257c0 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43  ert( nCell<nMaxC
257d0 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 61 70  ells );.      ap
257e0 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69  Cell[nCell] = fi
257f0 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70  ndOverflowCell(p
25800 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20 20 20 73  Old, j);.      s
25810 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63  zCell[nCell] = c
25820 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64 2c  ellSizePtr(pOld,
25830 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b   apCell[nCell]);
25840 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
25850 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
25860 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61        if( pBt->a
25870 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
25880 20 20 20 20 20 69 6e 74 20 61 3b 0a 20 20 20 20       int a;.    
25890 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d      aFrom[nCell]
258a0 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f   = i;.        fo
258b0 72 28 61 3d 30 3b 20 61 3c 70 4f 6c 64 2d 3e 6e  r(a=0; a<pOld->n
258c0 4f 76 65 72 66 6c 6f 77 3b 20 61 2b 2b 29 7b 0a  Overflow; a++){.
258d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f            if( pO
258e0 6c 64 2d 3e 61 4f 76 66 6c 5b 61 5d 2e 70 43 65  ld->aOvfl[a].pCe
258f0 6c 6c 3d 3d 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c  ll==apCell[nCell
25900 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ] ){.           
25910 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20   aFrom[nCell] = 
25920 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20 20 20  0xFF;.          
25930 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
25940 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
25950 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
25960 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20      nCell++;.   
25970 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c   }.    if( i<nOl
25980 64 2d 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  d-1 ){.      int
25990 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74   sz = cellSizePt
259a0 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69 76  r(pParent, apDiv
259b0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [i]);.      if( 
259c0 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20  leafData ){.    
259d0 20 20 20 20 2f 2a 20 57 69 74 68 20 74 68 65 20      /* With the 
259e0 4c 45 41 46 44 41 54 41 20 66 6c 61 67 2c 20 70  LEAFDATA flag, p
259f0 50 61 72 65 6e 74 20 63 65 6c 6c 73 20 68 6f 6c  Parent cells hol
25a00 64 20 6f 6e 6c 79 20 49 4e 54 4b 45 59 73 20 74  d only INTKEYs t
25a10 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  hat.        ** a
25a20 72 65 20 64 75 70 6c 69 63 61 74 65 73 20 6f 66  re duplicates of
25a30 20 6b 65 79 73 20 6f 6e 20 74 68 65 20 63 68 69   keys on the chi
25a40 6c 64 20 70 61 67 65 73 2e 20 20 57 65 20 6e 65  ld pages.  We ne
25a50 65 64 20 74 6f 20 72 65 6d 6f 76 65 0a 20 20 20  ed to remove.   
25a60 20 20 20 20 20 2a 2a 20 74 68 65 20 64 69 76 69       ** the divi
25a70 64 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70  der cells from p
25a80 50 61 72 65 6e 74 2c 20 62 75 74 20 74 68 65 20  Parent, but the 
25a90 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20 61  dividers cells a
25aa0 72 65 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a  re not.        *
25ab0 2a 20 61 64 64 65 64 20 74 6f 20 61 70 43 65 6c  * added to apCel
25ac0 6c 5b 5d 20 62 65 63 61 75 73 65 20 74 68 65 79  l[] because they
25ad0 20 61 72 65 20 64 75 70 6c 69 63 61 74 65 73 20   are duplicates 
25ae0 6f 66 20 63 68 69 6c 64 20 63 65 6c 6c 73 2e 0a  of child cells..
25af0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
25b00 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72     dropCell(pPar
25b10 65 6e 74 2c 20 6e 78 44 69 76 2c 20 73 7a 29 3b  ent, nxDiv, sz);
25b20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
25b30 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b        u8 *pTemp;
25b40 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
25b50 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73   nCell<nMaxCells
25b60 20 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65   );.        szCe
25b70 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b 0a  ll[nCell] = sz;.
25b80 20 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20          pTemp = 
25b90 26 61 53 70 61 63 65 5b 69 53 70 61 63 65 5d 3b  &aSpace[iSpace];
25ba0 0a 20 20 20 20 20 20 20 20 69 53 70 61 63 65 20  .        iSpace 
25bb0 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 61  += sz;.        a
25bc0 73 73 65 72 74 28 20 69 53 70 61 63 65 3c 3d 70  ssert( iSpace<=p
25bd0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 35 20 29  Bt->pageSize*5 )
25be0 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
25bf0 28 70 54 65 6d 70 2c 20 61 70 44 69 76 5b 69 5d  (pTemp, apDiv[i]
25c00 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 61  , sz);.        a
25c10 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70  pCell[nCell] = p
25c20 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63 74  Temp+leafCorrect
25c30 69 6f 6e 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ion;.#ifndef SQL
25c40 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
25c50 55 55 4d 0a 20 20 20 20 20 20 20 20 69 66 28 20  UUM.        if( 
25c60 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
25c70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 46 72  ){.          aFr
25c80 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78 46 46  om[nCell] = 0xFF
25c90 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64  ;.        }.#end
25ca0 69 66 0a 20 20 20 20 20 20 20 20 64 72 6f 70 43  if.        dropC
25cb0 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44  ell(pParent, nxD
25cc0 69 76 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 20  iv, sz);.       
25cd0 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d   szCell[nCell] -
25ce0 3d 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  = leafCorrection
25cf0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
25d00 28 20 67 65 74 34 62 79 74 65 28 70 54 65 6d 70  ( get4byte(pTemp
25d10 29 3d 3d 70 67 6e 6f 4f 6c 64 5b 69 5d 20 29 3b  )==pgnoOld[i] );
25d20 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 4f  .        if( !pO
25d30 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ld->leaf ){.    
25d40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65        assert( le
25d50 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20  afCorrection==0 
25d60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  );.          /* 
25d70 54 68 65 20 72 69 67 68 74 20 70 6f 69 6e 74 65  The right pointe
25d80 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70  r of the child p
25d90 61 67 65 20 70 4f 6c 64 20 62 65 63 6f 6d 65 73  age pOld becomes
25da0 20 74 68 65 20 6c 65 66 74 0a 20 20 20 20 20 20   the left.      
25db0 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 6f      ** pointer o
25dc0 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  f the divider ce
25dd0 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ll */.          
25de0 6d 65 6d 63 70 79 28 61 70 43 65 6c 6c 5b 6e 43  memcpy(apCell[nC
25df0 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44 61  ell], &pOld->aDa
25e00 74 61 5b 70 4f 6c 64 2d 3e 68 64 72 4f 66 66 73  ta[pOld->hdrOffs
25e10 65 74 2b 38 5d 2c 20 34 29 3b 0a 20 20 20 20 20  et+8], 4);.     
25e20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25e30 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66      assert( leaf
25e40 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b  Correction==4 );
25e50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
25e60 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20     nCell++;.    
25e70 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
25e80 20 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65 20   /*.  ** Figure 
25e90 6f 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  out the number o
25ea0 66 20 70 61 67 65 73 20 6e 65 65 64 65 64 20 74  f pages needed t
25eb0 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c  o hold all nCell
25ec0 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f   cells..  ** Sto
25ed0 72 65 20 74 68 69 73 20 6e 75 6d 62 65 72 20 69  re this number i
25ee0 6e 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f 6d  n "k".  Also com
25ef0 70 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68 69  pute szNew[] whi
25f00 63 68 20 69 73 20 74 68 65 20 74 6f 74 61 6c 0a  ch is the total.
25f10 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c 6c    ** size of all
25f20 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 2d   cells on the i-
25f30 74 68 20 70 61 67 65 20 61 6e 64 20 63 6e 74 4e  th page and cntN
25f40 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68  ew[] which is th
25f50 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e 20  e index.  ** in 
25f60 61 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65 20  apCell[] of the 
25f70 63 65 6c 6c 20 74 68 61 74 20 64 69 76 69 64 65  cell that divide
25f80 73 20 70 61 67 65 20 69 20 66 72 6f 6d 20 70 61  s page i from pa
25f90 67 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20 63  ge i+1.  .  ** c
25fa0 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64 20  ntNew[k] should 
25fb0 65 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a  equal nCell..  *
25fc0 2a 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20 63 6f  *.  ** Values co
25fd0 6d 70 75 74 65 64 20 62 79 20 74 68 69 73 20 62  mputed by this b
25fe0 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lock:.  **.  ** 
25ff0 20 20 20 20 20 20 20 20 20 20 6b 3a 20 54 68 65            k: The
26000 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
26010 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 0a 20   sibling pages. 
26020 20 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 3a   **    szNew[i]:
26030 20 53 70 61 63 65 64 20 75 73 65 64 20 6f 6e 20   Spaced used on 
26040 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67  the i-th sibling
26050 20 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63 6e   page..  **   cn
26060 74 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20 69  tNew[i]: Index i
26070 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73  n apCell[] and s
26080 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65 20  zCell[] for the 
26090 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20 20  first cell to.  
260a0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
260b0 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68 65  the right of the
260c0 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61   i-th sibling pa
260d0 67 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65 53  ge..  ** usableS
260e0 70 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66 20  pace: Number of 
260f0 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
26100 76 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63 68  vailable on each
26110 20 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a   sibling..  ** .
26120 20 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70 61    */.  usableSpa
26130 63 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ce = pBt->usable
26140 53 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61 66  Size - 12 + leaf
26150 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66 6f  Correction;.  fo
26160 72 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30  r(subtotal=k=i=0
26170 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
26180 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e  .    assert( i<n
26190 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
261a0 73 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43 65  subtotal += szCe
261b0 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20 69  ll[i] + 2;.    i
261c0 66 28 20 73 75 62 74 6f 74 61 6c 20 3e 20 75 73  f( subtotal > us
261d0 61 62 6c 65 53 70 61 63 65 20 29 7b 0a 20 20 20  ableSpace ){.   
261e0 20 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75     szNew[k] = su
261f0 62 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b  btotal - szCell[
26200 69 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77  i];.      cntNew
26210 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 69  [k] = i;.      i
26220 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 20 69  f( leafData ){ i
26230 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75 62 74  --; }.      subt
26240 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  otal = 0;.      
26250 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  k++;.    }.  }. 
26260 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74   szNew[k] = subt
26270 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b  otal;.  cntNew[k
26280 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b  ] = nCell;.  k++
26290 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65  ;..  /*.  ** The
262a0 20 70 61 63 6b 69 6e 67 20 63 6f 6d 70 75 74 65   packing compute
262b0 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75  d by the previou
262c0 73 20 62 6c 6f 63 6b 20 69 73 20 62 69 61 73 65  s block is biase
262d0 64 20 74 6f 77 61 72 64 20 74 68 65 20 73 69 62  d toward the sib
262e0 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20 74 68  lings.  ** on th
262f0 65 20 6c 65 66 74 20 73 69 64 65 2e 20 20 54 68  e left side.  Th
26300 65 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 73 20  e left siblings 
26310 61 72 65 20 61 6c 77 61 79 73 20 6e 65 61 72 6c  are always nearl
26320 79 20 66 75 6c 6c 2c 20 77 68 69 6c 65 20 74 68  y full, while th
26330 65 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d 6f 73  e.  ** right-mos
26340 74 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20  t sibling might 
26350 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e  be nearly empty.
26360 20 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20    This block of 
26370 63 6f 64 65 20 61 74 74 65 6d 70 74 73 0a 20 20  code attempts.  
26380 2a 2a 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65  ** to adjust the
26390 20 70 61 63 6b 69 6e 67 20 6f 66 20 73 69 62 6c   packing of sibl
263a0 69 6e 67 73 20 74 6f 20 67 65 74 20 61 20 62 65  ings to get a be
263b0 74 74 65 72 20 62 61 6c 61 6e 63 65 2e 0a 20 20  tter balance..  
263c0 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 61 64 6a  **.  ** This adj
263d0 75 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72 65 20  ustment is more 
263e0 74 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69 7a 61  than an optimiza
263f0 74 69 6f 6e 2e 20 20 54 68 65 20 70 61 63 6b 69  tion.  The packi
26400 6e 67 20 61 62 6f 76 65 20 6d 69 67 68 74 0a 20  ng above might. 
26410 20 2a 2a 20 62 65 20 73 6f 20 6f 75 74 20 6f 66   ** be so out of
26420 20 62 61 6c 61 6e 63 65 20 61 73 20 74 6f 20 62   balance as to b
26430 65 20 69 6c 6c 65 67 61 6c 2e 20 20 46 6f 72 20  e illegal.  For 
26440 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 72 69 67  example, the rig
26450 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73 69 62  ht-most.  ** sib
26460 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20 63 6f  ling might be co
26470 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 20  mpletely empty. 
26480 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74   This adjustment
26490 20 69 73 20 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c   is not optional
264a0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b  ..  */.  for(i=k
264b0 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20  -1; i>0; i--){. 
264c0 20 20 20 69 6e 74 20 73 7a 52 69 67 68 74 20 3d     int szRight =
264d0 20 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20 53   szNew[i];  /* S
264e0 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f  ize of sibling o
264f0 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20  n the right */. 
26500 20 20 20 69 6e 74 20 73 7a 4c 65 66 74 20 3d 20     int szLeft = 
26510 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53  szNew[i-1]; /* S
26520 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f  ize of sibling o
26530 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20  n the left */.  
26540 20 20 69 6e 74 20 72 3b 20 20 20 20 20 20 20 20    int r;        
26550 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
26560 66 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c  f right-most cel
26570 6c 20 69 6e 20 6c 65 66 74 20 73 69 62 6c 69 6e  l in left siblin
26580 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 3b 20  g */.    int d; 
26590 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
265a0 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 63  Index of first c
265b0 65 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66 74 20  ell to the left 
265c0 6f 66 20 72 69 67 68 74 20 73 69 62 6c 69 6e 67  of right sibling
265d0 20 2a 2f 0a 0a 20 20 20 20 72 20 3d 20 63 6e 74   */..    r = cnt
265e0 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20  New[i-1] - 1;.  
265f0 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65    d = r + 1 - le
26600 61 66 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65  afData;.    asse
26610 72 74 28 20 64 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( d<nMaxCells 
26620 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
26630 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
26640 20 20 77 68 69 6c 65 28 20 73 7a 52 69 67 68 74    while( szRight
26650 3d 3d 30 20 7c 7c 20 73 7a 52 69 67 68 74 2b 73  ==0 || szRight+s
26660 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65  zCell[d]+2<=szLe
26670 66 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29  ft-(szCell[r]+2)
26680 20 29 7b 0a 20 20 20 20 20 20 73 7a 52 69 67 68   ){.      szRigh
26690 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b  t += szCell[d] +
266a0 20 32 3b 0a 20 20 20 20 20 20 73 7a 4c 65 66 74   2;.      szLeft
266b0 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20   -= szCell[r] + 
266c0 32 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b  2;.      cntNew[
266d0 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20 20 72 20  i-1]--;.      r 
266e0 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20  = cntNew[i-1] - 
266f0 31 3b 0a 20 20 20 20 20 20 64 20 3d 20 72 20 2b  1;.      d = r +
26700 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20   1 - leafData;. 
26710 20 20 20 7d 0a 20 20 20 20 73 7a 4e 65 77 5b 69     }.    szNew[i
26720 5d 20 3d 20 73 7a 52 69 67 68 74 3b 0a 20 20 20  ] = szRight;.   
26730 20 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20 73 7a   szNew[i-1] = sz
26740 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Left;.  }..  /* 
26750 45 69 74 68 65 72 20 77 65 20 66 6f 75 6e 64 20  Either we found 
26760 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 65 6c 6c  one or more cell
26770 73 20 28 63 6e 74 6e 65 77 5b 30 5d 29 3e 30 29  s (cntnew[0])>0)
26780 20 6f 72 20 77 65 20 61 72 65 20 74 68 65 0a 20   or we are the. 
26790 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 72 6f   ** a virtual ro
267a0 6f 74 20 70 61 67 65 2e 20 20 41 20 76 69 72 74  ot page.  A virt
267b0 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 73  ual root page is
267c0 20 77 68 65 6e 20 74 68 65 20 72 65 61 6c 20 72   when the real r
267d0 6f 6f 74 0a 20 20 2a 2a 20 70 61 67 65 20 69 73  oot.  ** page is
267e0 20 70 61 67 65 20 31 20 61 6e 64 20 77 65 20 61   page 1 and we a
267f0 72 65 20 74 68 65 20 6f 6e 6c 79 20 63 68 69 6c  re the only chil
26800 64 20 6f 66 20 74 68 61 74 20 70 61 67 65 2e 0a  d of that page..
26810 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 63    */.  assert( c
26820 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20 28 70  ntNew[0]>0 || (p
26830 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31 20  Parent->pgno==1 
26840 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  && pParent->nCel
26850 6c 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20  l==0) );..  /*. 
26860 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20 6e   ** Allocate k n
26870 65 77 20 70 61 67 65 73 2e 20 20 52 65 75 73 65  ew pages.  Reuse
26880 20 6f 6c 64 20 70 61 67 65 73 20 77 68 65 72 65   old pages where
26890 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a   possible..  */.
268a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
268b0 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20 20 70 61 67  >pgno>1 );.  pag
268c0 65 46 6c 61 67 73 20 3d 20 70 50 61 67 65 2d 3e  eFlags = pPage->
268d0 61 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f 72 28  aData[0];.  for(
268e0 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a  i=0; i<k; i++){.
268f0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65      MemPage *pNe
26900 77 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c  w;.    if( i<nOl
26910 64 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20  d ){.      pNew 
26920 3d 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f  = apNew[i] = apO
26930 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 70 67 6e  ld[i];.      pgn
26940 6f 4e 65 77 5b 69 5d 20 3d 20 70 67 6e 6f 4f 6c  oNew[i] = pgnoOl
26950 64 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f 6c  d[i];.      apOl
26960 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  d[i] = 0;.      
26970 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
26980 72 5f 77 72 69 74 65 28 70 4e 65 77 2d 3e 61 44  r_write(pNew->aD
26990 61 74 61 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ata);.      if( 
269a0 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
269b0 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d  e_cleanup;.    }
269c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
269d0 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 20  rt( i>0 );.     
269e0 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 50 61   rc = allocatePa
269f0 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26  ge(pBt, &pNew, &
26a00 70 67 6e 6f 4e 65 77 5b 69 5d 2c 20 70 67 6e 6f  pgnoNew[i], pgno
26a10 4e 65 77 5b 69 2d 31 5d 2c 20 30 29 3b 0a 20 20  New[i-1], 0);.  
26a20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
26a30 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
26a40 70 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69  p;.      apNew[i
26a50 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d 0a  ] = pNew;.    }.
26a60 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20      nNew++;.    
26a70 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 70  zeroPage(pNew, p
26a80 61 67 65 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a  ageFlags);.  }..
26a90 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f 6c    /* Free any ol
26aa0 64 20 70 61 67 65 73 20 74 68 61 74 20 77 65 72  d pages that wer
26ab0 65 20 6e 6f 74 20 72 65 75 73 65 64 20 61 73 20  e not reused as 
26ac0 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a  new pages..  */.
26ad0 20 20 77 68 69 6c 65 28 20 69 3c 6e 4f 6c 64 20    while( i<nOld 
26ae0 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65  ){.    rc = free
26af0 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a  Page(apOld[i]);.
26b00 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
26b10 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
26b20 70 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  p;.    releasePa
26b30 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20  ge(apOld[i]);.  
26b40 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a    apOld[i] = 0;.
26b50 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20      i++;.  }..  
26b60 2f 2a 0a 20 20 2a 2a 20 50 75 74 20 74 68 65 20  /*.  ** Put the 
26b70 6e 65 77 20 70 61 67 65 73 20 69 6e 20 61 63 63  new pages in acc
26b80 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 54  ending order.  T
26b90 68 69 73 20 68 65 6c 70 73 20 74 6f 0a 20 20 2a  his helps to.  *
26ba0 2a 20 6b 65 65 70 20 65 6e 74 72 69 65 73 20 69  * keep entries i
26bb0 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20  n the disk file 
26bc0 69 6e 20 6f 72 64 65 72 20 73 6f 20 74 68 61 74  in order so that
26bd0 20 61 20 73 63 61 6e 0a 20 20 2a 2a 20 6f 66 20   a scan.  ** of 
26be0 74 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 6c  the table is a l
26bf0 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f 75  inear scan throu
26c00 67 68 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68  gh the file.  Th
26c10 61 74 0a 20 20 2a 2a 20 69 6e 20 74 75 72 6e 20  at.  ** in turn 
26c20 68 65 6c 70 73 20 74 68 65 20 6f 70 65 72 61 74  helps the operat
26c30 69 6e 67 20 73 79 73 74 65 6d 20 74 6f 20 64 65  ing system to de
26c40 6c 69 76 65 72 20 70 61 67 65 73 0a 20 20 2a 2a  liver pages.  **
26c50 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 6d   from the disk m
26c60 6f 72 65 20 72 61 70 69 64 6c 79 2e 0a 20 20 2a  ore rapidly..  *
26c70 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29  *.  ** An O(n^2)
26c80 20 69 6e 73 65 72 74 69 6f 6e 20 73 6f 72 74 20   insertion sort 
26c90 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 75 73 65  algorithm is use
26ca0 64 2c 20 62 75 74 20 73 69 6e 63 65 0a 20 20 2a  d, but since.  *
26cb0 2a 20 6e 20 69 73 20 6e 65 76 65 72 20 6d 6f 72  * n is never mor
26cc0 65 20 74 68 61 6e 20 4e 42 20 28 61 20 73 6d 61  e than NB (a sma
26cd0 6c 6c 20 63 6f 6e 73 74 61 6e 74 29 2c 20 74 68  ll constant), th
26ce0 61 74 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e  at should.  ** n
26cf0 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e  ot be a problem.
26d00 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
26d10 4e 42 3d 3d 33 2c 20 74 68 69 73 20 6f 6e 65 20  NB==3, this one 
26d20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b  optimization mak
26d30 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  es the database.
26d40 20 20 2a 2a 20 61 62 6f 75 74 20 32 35 25 20 66    ** about 25% f
26d50 61 73 74 65 72 20 66 6f 72 20 6c 61 72 67 65 20  aster for large 
26d60 69 6e 73 65 72 74 69 6f 6e 73 20 61 6e 64 20 64  insertions and d
26d70 65 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  eletions..  */. 
26d80 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b   for(i=0; i<k-1;
26d90 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6d   i++){.    int m
26da0 69 6e 56 20 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d  inV = pgnoNew[i]
26db0 3b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 49 20 3d  ;.    int minI =
26dc0 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b   i;.    for(j=i+
26dd0 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20  1; j<k; j++){.  
26de0 20 20 20 20 69 66 28 20 70 67 6e 6f 4e 65 77 5b      if( pgnoNew[
26df0 6a 5d 3c 28 75 6e 73 69 67 6e 65 64 29 6d 69 6e  j]<(unsigned)min
26e00 56 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 69 6e  V ){.        min
26e10 49 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 6d  I = j;.        m
26e20 69 6e 56 20 3d 20 70 67 6e 6f 4e 65 77 5b 6a 5d  inV = pgnoNew[j]
26e30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
26e40 20 20 20 20 69 66 28 20 6d 69 6e 49 3e 69 20 29      if( minI>i )
26e50 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 3b 0a 20  {.      int t;. 
26e60 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 54       MemPage *pT
26e70 3b 0a 20 20 20 20 20 20 74 20 3d 20 70 67 6e 6f  ;.      t = pgno
26e80 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 70 54  New[i];.      pT
26e90 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20   = apNew[i];.   
26ea0 20 20 20 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20     pgnoNew[i] = 
26eb0 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20  pgnoNew[minI];. 
26ec0 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20       apNew[i] = 
26ed0 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20  apNew[minI];.   
26ee0 20 20 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d     pgnoNew[minI]
26ef0 20 3d 20 74 3b 0a 20 20 20 20 20 20 61 70 4e 65   = t;.      apNe
26f00 77 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a 20 20  w[minI] = pT;.  
26f10 20 20 7d 0a 20 20 7d 0a 20 20 54 52 41 43 45 28    }.  }.  TRACE(
26f20 28 22 42 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20  ("BALANCE: old: 
26f30 25 64 20 25 64 20 25 64 20 20 6e 65 77 3a 20 25  %d %d %d  new: %
26f40 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28  d(%d) %d(%d) %d(
26f50 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64  %d) %d(%d) %d(%d
26f60 29 5c 6e 22 2c 0a 20 20 20 20 70 67 6e 6f 4f 6c  )\n",.    pgnoOl
26f70 64 5b 30 5d 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e  d[0], .    nOld>
26f80 3d 32 20 3f 20 70 67 6e 6f 4f 6c 64 5b 31 5d 20  =2 ? pgnoOld[1] 
26f90 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33  : 0,.    nOld>=3
26fa0 20 3f 20 70 67 6e 6f 4f 6c 64 5b 32 5d 20 3a 20   ? pgnoOld[2] : 
26fb0 30 2c 0a 20 20 20 20 70 67 6e 6f 4e 65 77 5b 30  0,.    pgnoNew[0
26fc0 5d 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20  ], szNew[0],.   
26fd0 20 6e 4e 65 77 3e 3d 32 20 3f 20 70 67 6e 6f 4e   nNew>=2 ? pgnoN
26fe0 65 77 5b 31 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e  ew[1] : 0, nNew>
26ff0 3d 32 20 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a 20  =2 ? szNew[1] : 
27000 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 33 20 3f  0,.    nNew>=3 ?
27010 20 70 67 6e 6f 4e 65 77 5b 32 5d 20 3a 20 30 2c   pgnoNew[2] : 0,
27020 20 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e 65 77   nNew>=3 ? szNew
27030 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65  [2] : 0,.    nNe
27040 77 3e 3d 34 20 3f 20 70 67 6e 6f 4e 65 77 5b 33  w>=4 ? pgnoNew[3
27050 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f  ] : 0, nNew>=4 ?
27060 20 73 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a 20   szNew[3] : 0,. 
27070 20 20 20 6e 4e 65 77 3e 3d 35 20 3f 20 70 67 6e     nNew>=5 ? pgn
27080 6f 4e 65 77 5b 34 5d 20 3a 20 30 2c 20 6e 4e 65  oNew[4] : 0, nNe
27090 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b 34 5d 20  w>=5 ? szNew[4] 
270a0 3a 20 30 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  : 0));..  /*.  *
270b0 2a 20 45 76 65 6e 6c 79 20 64 69 73 74 72 69 62  * Evenly distrib
270c0 75 74 65 20 74 68 65 20 64 61 74 61 20 69 6e 20  ute the data in 
270d0 61 70 43 65 6c 6c 5b 5d 20 61 63 72 6f 73 73 20  apCell[] across 
270e0 74 68 65 20 6e 65 77 20 70 61 67 65 73 2e 0a 20  the new pages.. 
270f0 20 2a 2a 20 49 6e 73 65 72 74 20 64 69 76 69 64   ** Insert divid
27100 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 70 50  er cells into pP
27110 61 72 65 6e 74 20 61 73 20 6e 65 63 65 73 73 61  arent as necessa
27120 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20 30  ry..  */.  j = 0
27130 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
27140 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f  New; i++){.    /
27150 2a 20 41 73 73 65 6d 62 6c 65 20 74 68 65 20 6e  * Assemble the n
27160 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e  ew sibling page.
27170 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   */.    MemPage 
27180 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d  *pNew = apNew[i]
27190 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c  ;.    assert( j<
271a0 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
271b0 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70   assert( pNew->p
271c0 67 6e 6f 3d 3d 70 67 6e 6f 4e 65 77 5b 69 5d 20  gno==pgnoNew[i] 
271d0 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50  );.    assembleP
271e0 61 67 65 28 70 4e 65 77 2c 20 63 6e 74 4e 65 77  age(pNew, cntNew
271f0 5b 69 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a  [i]-j, &apCell[j
27200 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a  ], &szCell[j]);.
27210 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
27220 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e  ->nCell>0 || (nN
27230 65 77 3d 3d 31 20 26 26 20 63 6e 74 4e 65 77 5b  ew==1 && cntNew[
27240 30 5d 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61 73  0]==0) );.    as
27250 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 76 65  sert( pNew->nOve
27260 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 23 69 66  rflow==0 );..#if
27270 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
27280 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
27290 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
272a0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
272b0 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68  abase, update th
272c0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
272d0 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 74 68 61  tries.    ** tha
272e0 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73  t point to the s
272f0 69 62 6c 69 6e 67 73 20 74 68 61 74 20 77 65 72  iblings that wer
27300 65 20 72 65 61 72 72 61 6e 67 65 64 2e 20 54 68  e rearranged. Th
27310 65 73 65 20 63 61 6e 20 62 65 3a 20 6c 65 66 74  ese can be: left
27320 0a 20 20 20 20 2a 2a 20 63 68 69 6c 64 72 65 6e  .    ** children
27330 20 6f 66 20 63 65 6c 6c 73 2c 20 74 68 65 20 72   of cells, the r
27340 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 74 68  ight-child of th
27350 65 20 70 61 67 65 2c 20 6f 72 20 6f 76 65 72 66  e page, or overf
27360 6c 6f 77 20 70 61 67 65 73 0a 20 20 20 20 2a 2a  low pages.    **
27370 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 63   pointed to by c
27380 65 6c 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ells..    */.   
27390 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
273a0 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 66 6f  cuum ){.      fo
273b0 72 28 6b 3d 6a 3b 20 6b 3c 63 6e 74 4e 65 77 5b  r(k=j; k<cntNew[
273c0 69 5d 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; k++){.      
273d0 20 20 61 73 73 65 72 74 28 20 6b 3c 6e 4d 61 78    assert( k<nMax
273e0 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 20  Cells );.       
273f0 20 69 66 28 20 61 46 72 6f 6d 5b 6b 5d 3d 3d 30   if( aFrom[k]==0
27400 78 46 46 20 7c 7c 20 61 70 43 6f 70 79 5b 61 46  xFF || apCopy[aF
27410 72 6f 6d 5b 6b 5d 5d 2d 3e 70 67 6e 6f 21 3d 70  rom[k]]->pgno!=p
27420 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20  New->pgno ){.   
27430 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d         rc = ptrm
27440 61 70 50 75 74 4f 76 66 6c 28 70 4e 65 77 2c 20  apPutOvfl(pNew, 
27450 6b 2d 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  k-j);.          
27460 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
27470 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
27480 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
27490 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 20  eanup;.         
274a0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
274b0 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
274c0 66 0a 0a 20 20 20 20 6a 20 3d 20 63 6e 74 4e 65  f..    j = cntNe
274d0 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  w[i];..    /* If
274e0 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67   the sibling pag
274f0 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76  e assembled abov
27500 65 20 77 61 73 20 6e 6f 74 20 74 68 65 20 72 69  e was not the ri
27510 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67  ght-most sibling
27520 2c 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 20  ,.    ** insert 
27530 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69  a divider cell i
27540 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70  nto the parent p
27550 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
27560 69 66 28 20 69 3c 6e 4e 65 77 2d 31 20 26 26 20  if( i<nNew-1 && 
27570 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  j<nCell ){.     
27580 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20   u8 *pCell;.    
27590 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20    u8 *pTemp;.   
275a0 20 20 20 69 6e 74 20 73 7a 3b 0a 0a 20 20 20 20     int sz;..    
275b0 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78    assert( j<nMax
275c0 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 70  Cells );.      p
275d0 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d  Cell = apCell[j]
275e0 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 73 7a 43  ;.      sz = szC
275f0 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f 72  ell[j] + leafCor
27600 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 69  rection;.      i
27610 66 28 20 21 70 4e 65 77 2d 3e 6c 65 61 66 20 29  f( !pNew->leaf )
27620 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
27630 28 26 70 4e 65 77 2d 3e 61 44 61 74 61 5b 38 5d  (&pNew->aData[8]
27640 2c 20 70 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20  , pCell, 4);.   
27650 20 20 20 20 20 70 54 65 6d 70 20 3d 20 30 3b 0a       pTemp = 0;.
27660 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
27670 6c 65 61 66 44 61 74 61 20 29 7b 0a 09 2f 2a 20  leafData ){../* 
27680 49 66 20 74 68 65 20 74 72 65 65 20 69 73 20 61  If the tree is a
27690 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c   leaf-data tree,
276a0 20 61 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67   and the sibling
276b0 73 20 61 72 65 20 6c 65 61 76 65 73 2c 20 0a 20  s are leaves, . 
276c0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74         ** then t
276d0 68 65 72 65 20 69 73 20 6e 6f 20 64 69 76 69 64  here is no divid
276e0 65 72 20 63 65 6c 6c 20 69 6e 20 61 70 43 65 6c  er cell in apCel
276f0 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c 20 74 68  l[]. Instead, th
27700 65 20 64 69 76 69 64 65 72 20 0a 20 20 20 20 20  e divider .     
27710 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73 69     ** cell consi
27720 73 74 73 20 6f 66 20 74 68 65 20 69 6e 74 65 67  sts of the integ
27730 65 72 20 6b 65 79 20 66 6f 72 20 74 68 65 20 72  er key for the r
27740 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f  ight-most cell o
27750 66 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  f .        ** th
27760 65 20 73 69 62 6c 69 6e 67 2d 70 61 67 65 20 61  e sibling-page a
27770 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 6f  ssembled above o
27780 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  nly..        */.
27790 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f          CellInfo
277a0 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 6a   info;.        j
277b0 2d 2d 3b 0a 20 20 20 20 20 20 20 20 70 61 72 73  --;.        pars
277c0 65 43 65 6c 6c 50 74 72 28 70 4e 65 77 2c 20 61  eCellPtr(pNew, a
277d0 70 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29  pCell[j], &info)
277e0 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20  ;.        pCell 
277f0 3d 20 26 61 53 70 61 63 65 5b 69 53 70 61 63 65  = &aSpace[iSpace
27800 5d 3b 0a 20 20 20 20 20 20 20 20 66 69 6c 6c 49  ];.        fillI
27810 6e 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70  nCell(pParent, p
27820 43 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b  Cell, 0, info.nK
27830 65 79 2c 20 30 2c 20 30 2c 20 26 73 7a 29 3b 0a  ey, 0, 0, &sz);.
27840 20 20 20 20 20 20 20 20 69 53 70 61 63 65 20 2b          iSpace +
27850 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 61 73  = sz;.        as
27860 73 65 72 74 28 20 69 53 70 61 63 65 3c 3d 70 42  sert( iSpace<=pB
27870 74 2d 3e 70 61 67 65 53 69 7a 65 2a 35 20 29 3b  t->pageSize*5 );
27880 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d  .        pTemp =
27890 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
278a0 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2d  .        pCell -
278b0 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 70 54 65  = 4;.        pTe
278c0 6d 70 20 3d 20 26 61 53 70 61 63 65 5b 69 53 70  mp = &aSpace[iSp
278d0 61 63 65 5d 3b 0a 20 20 20 20 20 20 20 20 69 53  ace];.        iS
278e0 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20  pace += sz;.    
278f0 20 20 20 20 61 73 73 65 72 74 28 20 69 53 70 61      assert( iSpa
27900 63 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  ce<=pBt->pageSiz
27910 65 2a 35 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  e*5 );.      }. 
27920 20 20 20 20 20 72 63 20 3d 20 69 6e 73 65 72 74       rc = insert
27930 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78  Cell(pParent, nx
27940 44 69 76 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c 20  Div, pCell, sz, 
27950 70 54 65 6d 70 2c 20 34 29 3b 0a 20 20 20 20 20  pTemp, 4);.     
27960 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
27970 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  OK ) goto balanc
27980 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  e_cleanup;.     
27990 20 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76   put4byte(findOv
279a0 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65  erflowCell(pPare
279b0 6e 74 2c 6e 78 44 69 76 29 2c 20 70 4e 65 77 2d  nt,nxDiv), pNew-
279c0 3e 70 67 6e 6f 29 3b 0a 23 69 66 6e 64 65 66 20  >pgno);.#ifndef 
279d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
279e0 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20  VACUUM.      /* 
279f0 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75  If this is an au
27a00 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
27a10 73 65 2c 20 61 6e 64 20 6e 6f 74 20 61 20 6c 65  se, and not a le
27a20 61 66 2d 64 61 74 61 20 74 72 65 65 2c 0a 20 20  af-data tree,.  
27a30 20 20 20 20 2a 2a 20 74 68 65 6e 20 75 70 64 61      ** then upda
27a40 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  te the pointer m
27a50 61 70 20 77 69 74 68 20 61 6e 20 65 6e 74 72 79  ap with an entry
27a60 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
27a70 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  w page.      ** 
27a80 74 68 61 74 20 74 68 65 20 63 65 6c 6c 20 6a 75  that the cell ju
27a90 73 74 20 69 6e 73 65 72 74 65 64 20 70 6f 69 6e  st inserted poin
27aa0 74 73 20 74 6f 20 28 69 66 20 61 6e 79 29 2e 0a  ts to (if any)..
27ab0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
27ac0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
27ad0 75 6d 20 26 26 20 21 6c 65 61 66 44 61 74 61 20  um && !leafData 
27ae0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
27af0 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 50  ptrmapPutOvfl(pP
27b00 61 72 65 6e 74 2c 20 6e 78 44 69 76 29 3b 0a 20  arent, nxDiv);. 
27b10 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
27b20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
27b30 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e        goto balan
27b40 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
27b50 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65      }.      }.#e
27b60 6e 64 69 66 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a  ndif.      j++;.
27b70 20 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20        nxDiv++;. 
27b80 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
27b90 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20  t( j==nCell );. 
27ba0 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20   assert( nOld>0 
27bb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65  );.  assert( nNe
27bc0 77 3e 30 20 29 3b 0a 20 20 69 66 28 20 28 70 61  w>0 );.  if( (pa
27bd0 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f 4c 45  geFlags & PTF_LE
27be0 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65  AF)==0 ){.    me
27bf0 6d 63 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77  mcpy(&apNew[nNew
27c00 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26  -1]->aData[8], &
27c10 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e  apCopy[nOld-1]->
27c20 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b 0a 20 20  aData[8], 4);.  
27c30 7d 0a 20 20 69 66 28 20 6e 78 44 69 76 3d 3d 70  }.  if( nxDiv==p
27c40 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2b 70 50  Parent->nCell+pP
27c50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
27c60 20 29 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68 74   ){.    /* Right
27c70 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 69 73  -most sibling is
27c80 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
27c90 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74  child of pParent
27ca0 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65   */.    put4byte
27cb0 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
27cc0 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
27cd0 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 5b  set+8], pgnoNew[
27ce0 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 65 6c 73  nNew-1]);.  }els
27cf0 65 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68 74 2d  e{.    /* Right-
27d00 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 69 73 20  most sibling is 
27d10 74 68 65 20 6c 65 66 74 20 63 68 69 6c 64 20 6f  the left child o
27d20 66 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  f the first entr
27d30 79 20 69 6e 20 70 50 61 72 65 6e 74 0a 20 20 20  y in pParent.   
27d40 20 2a 2a 20 70 61 73 74 20 74 68 65 20 72 69 67   ** past the rig
27d50 68 74 2d 6d 6f 73 74 20 64 69 76 69 64 65 72 20  ht-most divider 
27d60 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 70 75 74  entry */.    put
27d70 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c  4byte(findOverfl
27d80 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  owCell(pParent, 
27d90 6e 78 44 69 76 29 2c 20 70 67 6e 6f 4e 65 77 5b  nxDiv), pgnoNew[
27da0 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 0a 0a 20  nNew-1]);.  }.. 
27db0 20 2f 2a 0a 20 20 2a 2a 20 52 65 70 61 72 65 6e   /*.  ** Reparen
27dc0 74 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 61 6c  t children of al
27dd0 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2f 0a 20 20  l cells..  */.  
27de0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b  for(i=0; i<nNew;
27df0 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20   i++){.    rc = 
27e00 72 65 70 61 72 65 6e 74 43 68 69 6c 64 50 61 67  reparentChildPag
27e10 65 73 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20  es(apNew[i]);.  
27e20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
27e30 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e  _OK ) goto balan
27e40 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  ce_cleanup;.  }.
27e50 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74 43    rc = reparentC
27e60 68 69 6c 64 50 61 67 65 73 28 70 50 61 72 65 6e  hildPages(pParen
27e70 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  t);.  if( rc!=SQ
27e80 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62  LITE_OK ) goto b
27e90 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
27ea0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 61 6c 61 6e  .  /*.  ** Balan
27eb0 63 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  ce the parent pa
27ec0 67 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74  ge.  Note that t
27ed0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
27ee0 28 70 50 61 67 65 29 20 6d 69 67 68 74 0a 20 20  (pPage) might.  
27ef0 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 61 64 64  ** have been add
27f00 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ed to the freeli
27f10 73 74 20 73 6f 20 69 74 20 6d 69 67 68 74 20 6e  st so it might n
27f20 6f 20 6c 6f 6e 67 65 72 20 62 65 20 69 6e 69 74  o longer be init
27f30 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 42 75  ialized..  ** Bu
27f40 74 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  t the parent pag
27f50 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65  e will always be
27f60 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20   initialized..  
27f70 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
27f80 72 65 6e 74 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  rent->isInit );.
27f90 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 50 61    /* assert( pPa
27fa0 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 20 2f 2f  ge->isInit ); //
27fb0 20 4e 6f 21 20 70 50 61 67 65 20 6d 69 67 68 74   No! pPage might
27fc0 20 68 61 76 65 20 62 65 65 6e 20 61 64 64 65 64   have been added
27fd0 20 74 6f 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a   to freelist */.
27fe0 20 20 2f 2a 20 70 61 67 65 49 6e 74 65 67 72 69    /* pageIntegri
27ff0 74 79 28 70 50 61 67 65 29 3b 20 20 20 20 2f 2f  ty(pPage);    //
28000 20 4e 6f 21 20 70 50 61 67 65 20 6d 69 67 68 74   No! pPage might
28010 20 68 61 76 65 20 62 65 65 6e 20 61 64 64 65 64   have been added
28020 20 74 6f 20 66 72 65 65 6c 69 73 74 20 2a 2f 20   to freelist */ 
28030 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28  .  rc = balance(
28040 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a 20 20 0a  pParent, 0);.  .
28050 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75    /*.  ** Cleanu
28060 70 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  p before returni
28070 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65  ng..  */.balance
28080 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69  _cleanup:.  sqli
28090 74 65 46 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a  teFree(apCell);.
280a0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c    for(i=0; i<nOl
280b0 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c  d; i++){.    rel
280c0 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69  easePage(apOld[i
280d0 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  ]);.  }.  for(i=
280e0 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b  0; i<nNew; i++){
280f0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
28100 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 7d 0a  (apNew[i]);.  }.
28110 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
28120 61 72 65 6e 74 29 3b 0a 20 20 54 52 41 43 45 28  arent);.  TRACE(
28130 28 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e 69 73  ("BALANCE: finis
28140 68 65 64 20 77 69 74 68 20 25 64 3a 20 6f 6c 64  hed with %d: old
28150 3d 25 64 20 6e 65 77 3d 25 64 20 63 65 6c 6c 73  =%d new=%d cells
28160 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
28170 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 6e    pPage->pgno, n
28180 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c  Old, nNew, nCell
28190 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
281a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
281b0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
281c0 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 70 61   for the root pa
281d0 67 65 20 6f 66 20 61 20 62 74 72 65 65 20 77 68  ge of a btree wh
281e0 65 6e 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70  en the root.** p
281f0 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  age contains no 
28200 63 65 6c 6c 73 2e 20 20 54 68 69 73 20 69 73 20  cells.  This is 
28210 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74  an opportunity t
28220 6f 20 6d 61 6b 65 20 74 68 65 20 74 72 65 65 0a  o make the tree.
28230 2a 2a 20 73 68 61 6c 6c 6f 77 65 72 20 62 79 20  ** shallower by 
28240 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  one level..*/.st
28250 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
28260 5f 73 68 61 6c 6c 6f 77 65 72 28 4d 65 6d 50 61  _shallower(MemPa
28270 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 4d 65  ge *pPage){.  Me
28280 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 3b 20 20  mPage *pChild;  
28290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
282a0 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 70 61 67  e only child pag
282b0 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 20 20  e of pPage */.  
282c0 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b 20  Pgno pgnoChild; 
282d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
282e0 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  Page number for 
282f0 70 43 68 69 6c 64 20 2a 2f 0a 20 20 69 6e 74 20  pChild */.  int 
28300 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
28310 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
28320 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
28330 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20  procedures */.  
28340 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
28350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28360 2f 2a 20 54 68 65 20 6d 61 69 6e 20 42 54 72 65  /* The main BTre
28370 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  e structure */. 
28380 20 69 6e 74 20 6d 78 43 65 6c 6c 50 65 72 50 61   int mxCellPerPa
28390 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ge;           /*
283a0 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   Maximum number 
283b0 6f 66 20 63 65 6c 6c 73 20 70 65 72 20 70 61 67  of cells per pag
283c0 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
283d0 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
283e0 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73      /* All cells
283f0 20 66 72 6f 6d 20 70 61 67 65 73 20 62 65 69 6e   from pages bein
28400 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20  g balanced */.  
28410 69 6e 74 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20  int *szCell;    
28420 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28430 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c  Local size of al
28440 6c 20 63 65 6c 6c 73 20 2a 2f 0a 0a 20 20 61 73  l cells */..  as
28450 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 50 61  sert( pPage->pPa
28460 72 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73  rent==0 );.  ass
28470 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
28480 6c 3d 3d 30 20 29 3b 0a 20 20 70 42 74 20 3d 20  l==0 );.  pBt = 
28490 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 6d 78  pPage->pBt;.  mx
284a0 43 65 6c 6c 50 65 72 50 61 67 65 20 3d 20 4d 58  CellPerPage = MX
284b0 5f 43 45 4c 4c 28 70 42 74 29 3b 0a 20 20 61 70  _CELL(pBt);.  ap
284c0 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Cell = sqliteMal
284d0 6c 6f 63 52 61 77 28 20 6d 78 43 65 6c 6c 50 65  locRaw( mxCellPe
284e0 72 50 61 67 65 2a 28 73 69 7a 65 6f 66 28 75 38  rPage*(sizeof(u8
284f0 2a 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29 20  *)+sizeof(int)) 
28500 29 3b 0a 20 20 69 66 28 20 61 70 43 65 6c 6c 3d  );.  if( apCell=
28510 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
28520 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 73 7a 43 65  TE_NOMEM;.  szCe
28530 6c 6c 20 3d 20 28 69 6e 74 2a 29 26 61 70 43 65  ll = (int*)&apCe
28540 6c 6c 5b 6d 78 43 65 6c 6c 50 65 72 50 61 67 65  ll[mxCellPerPage
28550 5d 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  ];.  if( pPage->
28560 6c 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a 20 54  leaf ){.    /* T
28570 68 65 20 74 61 62 6c 65 20 69 73 20 63 6f 6d 70  he table is comp
28580 6c 65 74 65 6c 79 20 65 6d 70 74 79 20 2a 2f 0a  letely empty */.
28590 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c 41      TRACE(("BALA
285a0 4e 43 45 3a 20 65 6d 70 74 79 20 74 61 62 6c 65  NCE: empty table
285b0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70   %d\n", pPage->p
285c0 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  gno));.  }else{.
285d0 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20      /* The root 
285e0 70 61 67 65 20 69 73 20 65 6d 70 74 79 20 62 75  page is empty bu
285f0 74 20 68 61 73 20 6f 6e 65 20 63 68 69 6c 64 2e  t has one child.
28600 20 20 54 72 61 6e 73 66 65 72 20 74 68 65 0a 20    Transfer the. 
28610 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f     ** informatio
28620 6e 20 66 72 6f 6d 20 74 68 61 74 20 6f 6e 65 20  n from that one 
28630 63 68 69 6c 64 20 69 6e 74 6f 20 74 68 65 20 72  child into the r
28640 6f 6f 74 20 70 61 67 65 20 69 66 20 69 74 20 0a  oot page if it .
28650 20 20 20 20 2a 2a 20 77 69 6c 6c 20 66 69 74 2e      ** will fit.
28660 20 20 54 68 69 73 20 72 65 64 75 63 65 73 20 74    This reduces t
28670 68 65 20 64 65 70 74 68 20 6f 66 20 74 68 65 20  he depth of the 
28680 74 72 65 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20  tree by one..   
28690 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
286a0 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 70  e root page is p
286b0 61 67 65 20 31 2c 20 69 74 20 68 61 73 20 6c 65  age 1, it has le
286c0 73 73 20 73 70 61 63 65 20 61 76 61 69 6c 61 62  ss space availab
286d0 6c 65 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 69  le than.    ** i
286e0 74 73 20 63 68 69 6c 64 20 28 64 75 65 20 74 6f  ts child (due to
286f0 20 74 68 65 20 31 30 30 20 62 79 74 65 20 68 65   the 100 byte he
28700 61 64 65 72 20 74 68 61 74 20 6f 63 63 75 72 73  ader that occurs
28710 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
28720 67 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  g.    ** of the 
28730 64 61 74 61 62 61 73 65 20 66 6c 65 29 2c 20 73  database fle), s
28740 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 62  o it might not b
28750 65 20 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 61  e able to hold a
28760 6c 6c 20 6f 66 20 74 68 65 20 0a 20 20 20 20 2a  ll of the .    *
28770 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 75  * information cu
28780 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 65  rrently containe
28790 64 20 69 6e 20 74 68 65 20 63 68 69 6c 64 2e 20  d in the child. 
287a0 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
287b0 0a 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68  .    ** case, th
287c0 65 6e 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 65  en do not do the
287d0 20 74 72 61 6e 73 66 65 72 2e 20 20 4c 65 61 76   transfer.  Leav
287e0 65 20 70 61 67 65 20 31 20 65 6d 70 74 79 20 65  e page 1 empty e
287f0 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72  xcept.    ** for
28800 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e 74   the right-point
28810 65 72 20 74 6f 20 74 68 65 20 63 68 69 6c 64 20  er to the child 
28820 70 61 67 65 2e 20 20 54 68 65 20 63 68 69 6c 64  page.  The child
28830 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a 20 20   page becomes.  
28840 20 20 2a 2a 20 74 68 65 20 76 69 72 74 75 61 6c    ** the virtual
28850 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 72 65   root of the tre
28860 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 67  e..    */.    pg
28870 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74 34 62 79  noChild = get4by
28880 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
28890 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
288a0 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  t+8]);.    asser
288b0 74 28 20 70 67 6e 6f 43 68 69 6c 64 3e 30 20 29  t( pgnoChild>0 )
288c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67  ;.    assert( pg
288d0 6e 6f 43 68 69 6c 64 3c 3d 73 71 6c 69 74 65 33  noChild<=sqlite3
288e0 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28  pager_pagecount(
288f0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67  pPage->pBt->pPag
28900 65 72 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  er) );.    rc = 
28910 67 65 74 50 61 67 65 28 70 50 61 67 65 2d 3e 70  getPage(pPage->p
28920 42 74 2c 20 70 67 6e 6f 43 68 69 6c 64 2c 20 26  Bt, pgnoChild, &
28930 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 69 66 28  pChild);.    if(
28940 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73   rc ) goto end_s
28950 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a  hallow_balance;.
28960 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70      if( pPage->p
28970 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno==1 ){.      
28980 72 63 20 3d 20 69 6e 69 74 50 61 67 65 28 70 43  rc = initPage(pC
28990 68 69 6c 64 2c 20 70 50 61 67 65 29 3b 0a 20 20  hild, pPage);.  
289a0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
289b0 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61  o end_shallow_ba
289c0 6c 61 6e 63 65 3b 0a 20 20 20 20 20 20 61 73 73  lance;.      ass
289d0 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e 4f 76  ert( pChild->nOv
289e0 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 20  erflow==0 );.   
289f0 20 20 20 69 66 28 20 70 43 68 69 6c 64 2d 3e 6e     if( pChild->n
28a00 46 72 65 65 3e 3d 31 30 30 20 29 7b 0a 20 20 20  Free>=100 ){.   
28a10 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68 69 6c       /* The chil
28a20 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69  d information wi
28a30 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 72 6f  ll fit on the ro
28a40 6f 74 20 70 61 67 65 2c 20 73 6f 20 64 6f 20 74  ot page, so do t
28a50 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  he.        ** co
28a60 70 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  py */.        in
28a70 74 20 69 3b 0a 20 20 20 20 20 20 20 20 7a 65 72  t i;.        zer
28a80 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70 43 68  oPage(pPage, pCh
28a90 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a  ild->aData[0]);.
28aa0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
28ab0 20 69 3c 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c   i<pChild->nCell
28ac0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
28ad0 20 20 61 70 43 65 6c 6c 5b 69 5d 20 3d 20 66 69    apCell[i] = fi
28ae0 6e 64 43 65 6c 6c 28 70 43 68 69 6c 64 2c 69 29  ndCell(pChild,i)
28af0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 43 65  ;.          szCe
28b00 6c 6c 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65  ll[i] = cellSize
28b10 50 74 72 28 70 43 68 69 6c 64 2c 20 61 70 43 65  Ptr(pChild, apCe
28b20 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  ll[i]);.        
28b30 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 6d 62  }.        assemb
28b40 6c 65 50 61 67 65 28 70 50 61 67 65 2c 20 70 43  lePage(pPage, pC
28b50 68 69 6c 64 2d 3e 6e 43 65 6c 6c 2c 20 61 70 43  hild->nCell, apC
28b60 65 6c 6c 2c 20 73 7a 43 65 6c 6c 29 3b 0a 20 20  ell, szCell);.  
28b70 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68        /* Copy th
28b80 65 20 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 20  e right-pointer 
28b90 6f 66 20 74 68 65 20 63 68 69 6c 64 20 74 6f 20  of the child to 
28ba0 74 68 65 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20  the parent. */. 
28bb0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
28bc0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
28bd0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
28be0 5d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ], .            
28bf0 67 65 74 34 62 79 74 65 28 26 70 43 68 69 6c 64  get4byte(&pChild
28c00 2d 3e 61 44 61 74 61 5b 70 43 68 69 6c 64 2d 3e  ->aData[pChild->
28c10 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a  hdrOffset+8]));.
28c20 20 20 20 20 20 20 20 20 66 72 65 65 50 61 67 65          freePage
28c30 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20  (pChild);.      
28c40 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
28c50 45 3a 20 63 68 69 6c 64 20 25 64 20 74 72 61 6e  E: child %d tran
28c60 73 66 65 72 20 74 6f 20 70 61 67 65 20 31 5c 6e  sfer to page 1\n
28c70 22 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29  ", pChild->pgno)
28c80 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
28c90 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
28ca0 68 69 6c 64 20 68 61 73 20 6d 6f 72 65 20 69 6e  hild has more in
28cb0 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 77  formation that w
28cc0 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 72  ill fit on the r
28cd0 6f 6f 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  oot..        ** 
28ce0 54 68 65 20 74 72 65 65 20 69 73 20 61 6c 72 65  The tree is alre
28cf0 61 64 79 20 62 61 6c 61 6e 63 65 64 2e 20 20 44  ady balanced.  D
28d00 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a 20 20  o nothing. */.  
28d10 20 20 20 20 20 20 54 52 41 43 45 28 28 22 42 41        TRACE(("BA
28d20 4c 41 4e 43 45 3a 20 63 68 69 6c 64 20 25 64 20  LANCE: child %d 
28d30 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20  will not fit on 
28d40 70 61 67 65 20 31 5c 6e 22 2c 20 70 43 68 69 6c  page 1\n", pChil
28d50 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  d->pgno));.     
28d60 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
28d70 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65      memcpy(pPage
28d80 2d 3e 61 44 61 74 61 2c 20 70 43 68 69 6c 64 2d  ->aData, pChild-
28d90 3e 61 44 61 74 61 2c 20 70 50 61 67 65 2d 3e 70  >aData, pPage->p
28da0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b  Bt->usableSize);
28db0 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 73  .      pPage->is
28dc0 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Init = 0;.      
28dd0 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d  pPage->pParent =
28de0 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 69   0;.      rc = i
28df0 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c 20 30  nitPage(pPage, 0
28e00 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
28e10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
28e20 3b 0a 20 20 20 20 20 20 66 72 65 65 50 61 67 65  ;.      freePage
28e30 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20  (pChild);.      
28e40 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
28e50 20 74 72 61 6e 73 66 65 72 20 63 68 69 6c 64 20   transfer child 
28e60 25 64 20 69 6e 74 6f 20 72 6f 6f 74 20 25 64 5c  %d into root %d\
28e70 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
28e80 20 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c 20    pChild->pgno, 
28e90 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20  pPage->pgno));. 
28ea0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 72 65     }.    rc = re
28eb0 70 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73  parentChildPages
28ec0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 61 73 73  (pPage);.    ass
28ed0 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
28ee0 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 23 69 66 6e  rflow==0 );.#ifn
28ef0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
28f00 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
28f10 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
28f20 75 6d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  um ){.      int 
28f30 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  i;.      for(i=0
28f40 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ; i<pPage->nCell
28f50 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 20  ; i++){ .       
28f60 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f   rc = ptrmapPutO
28f70 76 66 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20  vfl(pPage, i);. 
28f80 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
28f90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28fa0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73        goto end_s
28fb0 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a  hallow_balance;.
28fc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28fd0 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
28fe0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
28ff0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f  E_OK ) goto end_
29000 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b  shallow_balance;
29010 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
29020 28 70 43 68 69 6c 64 29 3b 0a 20 20 7d 0a 65 6e  (pChild);.  }.en
29030 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63  d_shallow_balanc
29040 65 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  e:.  sqliteFree(
29050 61 70 43 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72  apCell);.  retur
29060 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
29070 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73  The root page is
29080 20 6f 76 65 72 66 75 6c 6c 0a 2a 2a 0a 2a 2a 20   overfull.**.** 
29090 57 68 65 6e 20 74 68 69 73 20 68 61 70 70 65 6e  When this happen
290a0 73 2c 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  s, Create a new 
290b0 63 68 69 6c 64 20 70 61 67 65 20 61 6e 64 20 63  child page and c
290c0 6f 70 79 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  opy the.** conte
290d0 6e 74 73 20 6f 66 20 74 68 65 20 72 6f 6f 74 20  nts of the root 
290e0 69 6e 74 6f 20 74 68 65 20 63 68 69 6c 64 2e 20  into the child. 
290f0 20 54 68 65 6e 20 6d 61 6b 65 20 74 68 65 20 72   Then make the r
29100 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 61 6e 20 65  oot.** page an e
29110 6d 70 74 79 20 70 61 67 65 20 77 69 74 68 20 72  mpty page with r
29120 69 67 68 74 43 68 69 6c 64 20 70 6f 69 6e 74 69  ightChild pointi
29130 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a  ng to the new.**
29140 20 63 68 69 6c 64 2e 20 20 20 46 69 6e 61 6c 6c   child.   Finall
29150 79 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65 5f  y, call balance_
29160 69 6e 74 65 72 6e 61 6c 28 29 20 6f 6e 20 74 68  internal() on th
29170 65 20 6e 65 77 20 63 68 69 6c 64 0a 2a 2a 20 74  e new child.** t
29180 6f 20 63 61 75 73 65 20 69 74 20 74 6f 20 73 70  o cause it to sp
29190 6c 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lit..*/.static i
291a0 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65  nt balance_deepe
291b0 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
291c0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
291d0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
291e0 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 73 75  rn value from su
291f0 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20  bprocedures */. 
29200 20 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64   MemPage *pChild
29210 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ;    /* Pointer 
29220 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70  to a new child p
29230 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  age */.  Pgno pg
29240 6e 6f 43 68 69 6c 64 3b 20 20 20 20 20 2f 2a 20  noChild;     /* 
29250 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  Page number of t
29260 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67  he new child pag
29270 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  e */.  BtShared 
29280 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  *pBt;         /*
29290 20 54 68 65 20 42 54 72 65 65 20 2a 2f 0a 20 20   The BTree */.  
292a0 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
292b0 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 75 73 61      /* Total usa
292c0 62 6c 65 20 73 69 7a 65 20 6f 66 20 61 20 70 61  ble size of a pa
292d0 67 65 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  ge */.  u8 *data
292e0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
292f0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
29300 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 75  rent page */.  u
29310 38 20 2a 63 64 61 74 61 3b 20 20 20 20 20 20 20  8 *cdata;       
29320 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66     /* Content of
29330 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
29340 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
29350 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
29360 65 74 20 74 6f 20 70 61 67 65 20 68 65 61 64 65  et to page heade
29370 72 20 69 6e 20 70 61 72 65 6e 74 20 2a 2f 0a 20  r in parent */. 
29380 20 69 6e 74 20 62 72 6b 3b 20 20 20 20 20 20 20   int brk;       
29390 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
293a0 6f 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66 69 72  o content of fir
293b0 73 74 20 63 65 6c 6c 20 69 6e 20 70 61 72 65 6e  st cell in paren
293c0 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
293d0 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d  pPage->pParent==
293e0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
293f0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e  Page->nOverflow>
29400 30 20 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61  0 );.  pBt = pPa
29410 67 65 2d 3e 70 42 74 3b 0a 20 20 72 63 20 3d 20  ge->pBt;.  rc = 
29420 61 6c 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74  allocatePage(pBt
29430 2c 20 26 70 43 68 69 6c 64 2c 20 26 70 67 6e 6f  , &pChild, &pgno
29440 43 68 69 6c 64 2c 20 70 50 61 67 65 2d 3e 70 67  Child, pPage->pg
29450 6e 6f 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  no, 0);.  if( rc
29460 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
29470 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 70  assert( sqlite3p
29480 61 67 65 72 5f 69 73 77 72 69 74 65 61 62 6c 65  ager_iswriteable
29490 28 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 29 20  (pChild->aData) 
294a0 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20  );.  usableSize 
294b0 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
294c0 65 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67  e;.  data = pPag
294d0 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20  e->aData;.  hdr 
294e0 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
294f0 65 74 3b 0a 20 20 62 72 6b 20 3d 20 67 65 74 32  et;.  brk = get2
29500 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
29510 5d 29 3b 0a 20 20 63 64 61 74 61 20 3d 20 70 43  ]);.  cdata = pC
29520 68 69 6c 64 2d 3e 61 44 61 74 61 3b 0a 20 20 6d  hild->aData;.  m
29530 65 6d 63 70 79 28 63 64 61 74 61 2c 20 26 64 61  emcpy(cdata, &da
29540 74 61 5b 68 64 72 5d 2c 20 70 50 61 67 65 2d 3e  ta[hdr], pPage->
29550 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50 61  cellOffset+2*pPa
29560 67 65 2d 3e 6e 43 65 6c 6c 2d 68 64 72 29 3b 0a  ge->nCell-hdr);.
29570 20 20 6d 65 6d 63 70 79 28 26 63 64 61 74 61 5b    memcpy(&cdata[
29580 62 72 6b 5d 2c 20 26 64 61 74 61 5b 62 72 6b 5d  brk], &data[brk]
29590 2c 20 75 73 61 62 6c 65 53 69 7a 65 2d 62 72 6b  , usableSize-brk
295a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 68  );.  assert( pCh
295b0 69 6c 64 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29  ild->isInit==0 )
295c0 3b 0a 20 20 72 63 20 3d 20 69 6e 69 74 50 61 67  ;.  rc = initPag
295d0 65 28 70 43 68 69 6c 64 2c 20 70 50 61 67 65 29  e(pChild, pPage)
295e0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
295f0 6f 20 62 61 6c 61 6e 63 65 64 65 65 70 65 72 5f  o balancedeeper_
29600 6f 75 74 3b 0a 20 20 6d 65 6d 63 70 79 28 70 43  out;.  memcpy(pC
29610 68 69 6c 64 2d 3e 61 4f 76 66 6c 2c 20 70 50 61  hild->aOvfl, pPa
29620 67 65 2d 3e 61 4f 76 66 6c 2c 20 70 50 61 67 65  ge->aOvfl, pPage
29630 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2a 73 69 7a 65  ->nOverflow*size
29640 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b  of(pPage->aOvfl[
29650 30 5d 29 29 3b 0a 20 20 70 43 68 69 6c 64 2d 3e  0]));.  pChild->
29660 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70 50 61 67  nOverflow = pPag
29670 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20  e->nOverflow;.  
29680 69 66 28 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65  if( pChild->nOve
29690 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 70 43 68  rflow ){.    pCh
296a0 69 6c 64 2d 3e 6e 46 72 65 65 20 3d 20 30 3b 0a  ild->nFree = 0;.
296b0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
296c0 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 50 61  hild->nCell==pPa
296d0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 7a  ge->nCell );.  z
296e0 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70  eroPage(pPage, p
296f0 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 20  Child->aData[0] 
29700 26 20 7e 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20  & ~PTF_LEAF);.  
29710 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
29720 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
29730 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f  rOffset+8], pgno
29740 43 68 69 6c 64 29 3b 0a 20 20 54 52 41 43 45 28  Child);.  TRACE(
29750 28 22 42 41 4c 41 4e 43 45 3a 20 63 6f 70 79 20  ("BALANCE: copy 
29760 72 6f 6f 74 20 25 64 20 69 6e 74 6f 20 25 64 5c  root %d into %d\
29770 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  n", pPage->pgno,
29780 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b   pChild->pgno));
29790 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
297a0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
297b0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
297c0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 69 6e 74  acuum ){.    int
297d0 20 69 3b 0a 20 20 20 20 72 63 20 3d 20 70 74 72   i;.    rc = ptr
297e0 6d 61 70 50 75 74 28 70 42 74 2c 20 70 43 68 69  mapPut(pBt, pChi
297f0 6c 64 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50  ld->pgno, PTRMAP
29800 5f 42 54 52 45 45 2c 20 70 50 61 67 65 2d 3e 70  _BTREE, pPage->p
29810 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63  gno);.    if( rc
29820 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 64   ) goto balanced
29830 65 65 70 65 72 5f 6f 75 74 3b 0a 20 20 20 20 66  eeper_out;.    f
29840 6f 72 28 69 3d 30 3b 20 69 3c 70 43 68 69 6c 64  or(i=0; i<pChild
29850 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  ->nCell; i++){. 
29860 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
29870 50 75 74 4f 76 66 6c 28 70 43 68 69 6c 64 2c 20  PutOvfl(pChild, 
29880 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  i);.      if( rc
29890 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
298a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
298b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
298c0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 63 20    }.#endif.  rc 
298d0 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f  = balance_nonroo
298e0 74 28 70 43 68 69 6c 64 29 3b 0a 0a 62 61 6c 61  t(pChild);..bala
298f0 6e 63 65 64 65 65 70 65 72 5f 6f 75 74 3a 0a 20  ncedeeper_out:. 
29900 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 68   releasePage(pCh
29910 69 6c 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ild);.  return r
29920 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 69  c;.}../*.** Deci
29930 64 65 20 69 66 20 74 68 65 20 70 61 67 65 20 70  de if the page p
29940 50 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65  Page needs to be
29950 20 62 61 6c 61 6e 63 65 64 2e 20 20 49 66 20 62   balanced.  If b
29960 61 6c 61 6e 63 69 6e 67 20 69 73 0a 2a 2a 20 72  alancing is.** r
29970 65 71 75 69 72 65 64 2c 20 63 61 6c 6c 20 74 68  equired, call th
29980 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 62 61  e appropriate ba
29990 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65 2e  lancing routine.
299a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
299b0 61 6c 61 6e 63 65 28 4d 65 6d 50 61 67 65 20 2a  alance(MemPage *
299c0 70 50 61 67 65 2c 20 69 6e 74 20 69 6e 73 65 72  pPage, int inser
299d0 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
299e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
299f0 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d  pPage->pParent==
29a00 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  0 ){.    if( pPa
29a10 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20  ge->nOverflow>0 
29a20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61  ){.      rc = ba
29a30 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 70 50 61  lance_deeper(pPa
29a40 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ge);.    }.    i
29a50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
29a60 20 26 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   && pPage->nCell
29a70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
29a80 3d 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f  = balance_shallo
29a90 77 65 72 28 70 50 61 67 65 29 3b 0a 20 20 20 20  wer(pPage);.    
29aa0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  }.  }else{.    i
29ab0 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  f( pPage->nOverf
29ac0 6c 6f 77 3e 30 20 7c 7c 20 0a 20 20 20 20 20 20  low>0 || .      
29ad0 20 20 28 21 69 6e 73 65 72 74 20 26 26 20 70 50    (!insert && pP
29ae0 61 67 65 2d 3e 6e 46 72 65 65 3e 70 50 61 67 65  age->nFree>pPage
29af0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
29b00 65 2a 32 2f 33 29 20 29 7b 0a 20 20 20 20 20 20  e*2/3) ){.      
29b10 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e  rc = balance_non
29b20 72 6f 6f 74 28 70 50 61 67 65 29 3b 0a 20 20 20  root(pPage);.   
29b30 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
29b40 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
29b50 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
29b60 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 74 68 61   all cursors tha
29b70 74 20 70 6f 69 6e 74 20 74 6f 20 74 61 62 6c 65  t point to table
29b80 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 20 49 66   pgnoRoot..** If
29b90 20 61 6e 79 20 6f 66 20 74 68 6f 73 65 20 63 75   any of those cu
29ba0 72 73 6f 72 73 20 6f 74 68 65 72 20 74 68 61 6e  rsors other than
29bb0 20 70 45 78 63 6c 75 64 65 20 77 65 72 65 20 6f   pExclude were o
29bc0 70 65 6e 65 64 20 77 69 74 68 20 0a 2a 2a 20 77  pened with .** w
29bd0 72 46 6c 61 67 3d 3d 30 20 74 68 65 6e 20 74 68  rFlag==0 then th
29be0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
29bf0 6e 73 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  ns SQLITE_LOCKED
29c00 2e 20 20 49 66 20 61 6c 6c 0a 2a 2a 20 63 75 72  .  If all.** cur
29c10 73 6f 72 73 20 74 68 61 74 20 70 6f 69 6e 74 20  sors that point 
29c20 74 6f 20 70 67 6e 6f 52 6f 6f 74 20 77 65 72 65  to pgnoRoot were
29c30 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46   opened with wrF
29c40 6c 61 67 3d 3d 31 0a 2a 2a 20 74 68 65 6e 20 74  lag==1.** then t
29c50 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
29c60 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  rns SQLITE_OK..*
29c70 2a 0a 2a 2a 20 49 6e 20 61 64 64 69 74 69 6f 6e  *.** In addition
29c80 20 74 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f 72   to checking for
29c90 20 72 65 61 64 2d 6c 6f 63 6b 73 20 28 77 68 65   read-locks (whe
29ca0 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 0a  re a read-lock .
29cb0 2a 2a 20 6d 65 61 6e 73 20 61 20 63 75 72 73 6f  ** means a curso
29cc0 72 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72  r opened with wr
29cd0 46 6c 61 67 3d 3d 30 29 20 74 68 69 73 20 72 6f  Flag==0) this ro
29ce0 75 74 69 6e 65 20 61 6c 73 6f 20 6d 6f 76 65 73  utine also moves
29cf0 0a 2a 2a 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  .** all cursors 
29d00 6f 74 68 65 72 20 74 68 61 6e 20 70 45 78 63 6c  other than pExcl
29d10 75 64 65 20 73 6f 20 74 68 61 74 20 74 68 65 79  ude so that they
29d20 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f   are pointing to
29d30 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 43   the .** first C
29d40 65 6c 6c 20 6f 6e 20 72 6f 6f 74 20 70 61 67 65  ell on root page
29d50 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  .  This is neces
29d60 73 61 72 79 20 62 65 63 61 75 73 65 20 61 6e 20  sary because an 
29d70 69 6e 73 65 72 74 20 0a 2a 2a 20 6f 72 20 64 65  insert .** or de
29d80 6c 65 74 65 20 6d 69 67 68 74 20 63 68 61 6e 67  lete might chang
29d90 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
29da0 63 65 6c 6c 73 20 6f 6e 20 61 20 70 61 67 65 20  cells on a page 
29db0 6f 72 20 64 65 6c 65 74 65 0a 2a 2a 20 61 20 70  or delete.** a p
29dc0 61 67 65 20 65 6e 74 69 72 65 6c 79 20 61 6e 64  age entirely and
29dd0 20 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20   we do not want 
29de0 74 6f 20 6c 65 61 76 65 20 61 6e 79 20 63 75 72  to leave any cur
29df0 73 6f 72 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e  sors .** pointin
29e00 67 20 74 6f 20 6e 6f 6e 2d 65 78 69 73 74 61 6e  g to non-existan
29e10 74 20 70 61 67 65 73 20 6f 72 20 63 65 6c 6c 73  t pages or cells
29e20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
29e30 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 42  checkReadLocks(B
29e40 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
29e50 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c 20 42 74 43  no pgnoRoot, BtC
29e60 75 72 73 6f 72 20 2a 70 45 78 63 6c 75 64 65 29  ursor *pExclude)
29e70 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
29e80 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43  .  for(p=pBt->pC
29e90 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
29ea0 4e 65 78 74 29 7b 0a 20 20 20 20 75 33 32 20 66  Next){.    u32 f
29eb0 6c 61 67 73 20 3d 20 28 70 2d 3e 70 42 74 72 65  lags = (p->pBtre
29ec0 65 2d 3e 70 53 71 6c 69 74 65 20 3f 20 70 2d 3e  e->pSqlite ? p->
29ed0 70 42 74 72 65 65 2d 3e 70 53 71 6c 69 74 65 2d  pBtree->pSqlite-
29ee0 3e 66 6c 61 67 73 20 3a 20 30 29 3b 0a 20 20 20  >flags : 0);.   
29ef0 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74   if( p->pgnoRoot
29f00 21 3d 70 67 6e 6f 52 6f 6f 74 20 7c 7c 20 70 3d  !=pgnoRoot || p=
29f10 3d 70 45 78 63 6c 75 64 65 20 29 20 63 6f 6e 74  =pExclude ) cont
29f20 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 2d  inue;.    if( p-
29f30 3e 77 72 46 6c 61 67 3d 3d 30 20 26 26 20 66 6c  >wrFlag==0 && fl
29f40 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
29f50 6e 63 6f 6d 6d 69 74 74 65 64 20 29 20 63 6f 6e  ncommitted ) con
29f60 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
29f70 2d 3e 77 72 46 6c 61 67 3d 3d 30 20 29 20 72 65  ->wrFlag==0 ) re
29f80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  turn SQLITE_LOCK
29f90 45 44 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  ED;.    if( p->p
29fa0 50 61 67 65 2d 3e 70 67 6e 6f 21 3d 70 2d 3e 70  Page->pgno!=p->p
29fb0 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20  gnoRoot ){.     
29fc0 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 29 3b 0a   moveToRoot(p);.
29fd0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
29fe0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
29ff0 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20  ./*.** Insert a 
2a000 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20  new record into 
2a010 74 68 65 20 42 54 72 65 65 2e 20 20 54 68 65 20  the BTree.  The 
2a020 6b 65 79 20 69 73 20 67 69 76 65 6e 20 62 79 20  key is given by 
2a030 28 70 4b 65 79 2c 6e 4b 65 79 29 0a 2a 2a 20 61  (pKey,nKey).** a
2a040 6e 64 20 74 68 65 20 64 61 74 61 20 69 73 20 67  nd the data is g
2a050 69 76 65 6e 20 62 79 20 28 70 44 61 74 61 2c 6e  iven by (pData,n
2a060 44 61 74 61 29 2e 20 20 54 68 65 20 63 75 72 73  Data).  The curs
2a070 6f 72 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  or is used only 
2a080 74 6f 0a 2a 2a 20 64 65 66 69 6e 65 20 77 68 61  to.** define wha
2a090 74 20 74 61 62 6c 65 20 74 68 65 20 72 65 63 6f  t table the reco
2a0a0 72 64 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73  rd should be ins
2a0b0 65 72 74 65 64 20 69 6e 74 6f 2e 20 20 54 68 65  erted into.  The
2a0c0 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65   cursor.** is le
2a0d0 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
2a0e0 20 72 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e   random location
2a0f0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 49  ..**.** For an I
2a100 4e 54 4b 45 59 20 74 61 62 6c 65 2c 20 6f 6e 6c  NTKEY table, onl
2a110 79 20 74 68 65 20 6e 4b 65 79 20 76 61 6c 75 65  y the nKey value
2a120 20 6f 66 20 74 68 65 20 6b 65 79 20 69 73 20 75   of the key is u
2a130 73 65 64 2e 20 20 70 4b 65 79 20 69 73 0a 2a 2a  sed.  pKey is.**
2a140 20 69 67 6e 6f 72 65 64 2e 20 20 46 6f 72 20 61   ignored.  For a
2a150 20 5a 45 52 4f 44 41 54 41 20 74 61 62 6c 65 2c   ZERODATA table,
2a160 20 74 68 65 20 70 44 61 74 61 20 61 6e 64 20 6e   the pData and n
2a170 44 61 74 61 20 61 72 65 20 62 6f 74 68 20 69 67  Data are both ig
2a180 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  nored..*/.int sq
2a190 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74  lite3BtreeInsert
2a1a0 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
2a1b0 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ur,             
2a1c0 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74     /* Insert dat
2a1d0 61 20 69 6e 74 6f 20 74 68 65 20 74 61 62 6c 65  a into the table
2a1e0 20 6f 66 20 74 68 69 73 20 63 75 72 73 6f 72 20   of this cursor 
2a1f0 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
2a200 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c  *pKey, i64 nKey,
2a210 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 6f      /* The key o
2a220 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64  f the new record
2a230 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
2a240 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61   *pData, int nDa
2a250 74 61 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61  ta   /* The data
2a260 20 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f   of the new reco
2a270 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  rd */.){.  int r
2a280 63 3b 0a 20 20 69 6e 74 20 6c 6f 63 3b 0a 20 20  c;.  int loc;.  
2a290 69 6e 74 20 73 7a 4e 65 77 3b 0a 20 20 4d 65 6d  int szNew;.  Mem
2a2a0 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 42  Page *pPage;.  B
2a2b0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2a2c0 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74  Cur->pBtree->pBt
2a2d0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
2a2e0 72 20 2a 6f 6c 64 43 65 6c 6c 3b 0a 20 20 75 6e  r *oldCell;.  un
2a2f0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6e 65 77  signed char *new
2a300 43 65 6c 6c 20 3d 20 30 3b 0a 0a 20 20 69 66 28  Cell = 0;..  if(
2a310 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
2a320 69 6f 6e 21 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion!=TRANS_WRITE
2a330 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20   ){.    /* Must 
2a340 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74  start a transact
2a350 69 6f 6e 20 62 65 66 6f 72 65 20 64 6f 69 6e 67  ion before doing
2a360 20 61 6e 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20   an insert */.  
2a370 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 72 65    return pBt->re
2a380 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f  adOnly ? SQLITE_
2a390 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54  READONLY : SQLIT
2a3a0 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61  E_ERROR;.  }.  a
2a3b0 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61  ssert( !pBt->rea
2a3c0 64 4f 6e 6c 79 20 29 3b 0a 20 20 69 66 28 20 21  dOnly );.  if( !
2a3d0 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29 7b 0a  pCur->wrFlag ){.
2a3e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2a3f0 45 5f 50 45 52 4d 3b 20 20 20 2f 2a 20 43 75 72  E_PERM;   /* Cur
2a400 73 6f 72 20 6e 6f 74 20 6f 70 65 6e 20 66 6f 72  sor not open for
2a410 20 77 72 69 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a   writing */.  }.
2a420 20 20 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c    if( checkReadL
2a430 6f 63 6b 73 28 70 42 74 2c 20 70 43 75 72 2d 3e  ocks(pBt, pCur->
2a440 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 20  pgnoRoot, pCur) 
2a450 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2a460 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20  LITE_LOCKED; /* 
2a470 54 68 65 20 74 61 62 6c 65 20 70 43 75 72 20 70  The table pCur p
2a480 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 61 20 72  oints to has a r
2a490 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a  ead lock */.  }.
2a4a0 0a 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20 70  .  /* Save the p
2a4b0 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20  ositions of any 
2a4c0 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20 6f 70  other cursors op
2a4d0 65 6e 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65  en on this table
2a4e0 20 2a 2f 0a 20 20 72 65 73 74 6f 72 65 4f 72 43   */.  restoreOrC
2a4f0 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
2a500 6f 6e 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 69  on(pCur, 0);.  i
2a510 66 28 20 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f  f( .    SQLITE_O
2a520 4b 21 3d 28 72 63 20 3d 20 73 61 76 65 41 6c 6c  K!=(rc = saveAll
2a530 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43 75  Cursors(pBt, pCu
2a540 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75  r->pgnoRoot, pCu
2a550 72 29 29 20 7c 7c 0a 20 20 20 20 53 51 4c 49 54  r)) ||.    SQLIT
2a560 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
2a570 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 70  te3BtreeMoveto(p
2a580 43 75 72 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c  Cur, pKey, nKey,
2a590 20 26 6c 6f 63 29 29 0a 20 20 29 7b 0a 20 20 20   &loc)).  ){.   
2a5a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2a5b0 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
2a5c0 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74  >pPage;.  assert
2a5d0 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
2a5e0 7c 7c 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20  || nKey>=0 );.  
2a5f0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
2a600 65 61 66 20 7c 7c 20 21 70 50 61 67 65 2d 3e 6c  eaf || !pPage->l
2a610 65 61 66 44 61 74 61 20 29 3b 0a 20 20 54 52 41  eafData );.  TRA
2a620 43 45 28 28 22 49 4e 53 45 52 54 3a 20 74 61 62  CE(("INSERT: tab
2a630 6c 65 3d 25 64 20 6e 6b 65 79 3d 25 6c 6c 64 20  le=%d nkey=%lld 
2a640 6e 64 61 74 61 3d 25 64 20 70 61 67 65 3d 25 64  ndata=%d page=%d
2a650 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
2a660 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74    pCur->pgnoRoot
2a670 2c 20 6e 4b 65 79 2c 20 6e 44 61 74 61 2c 20 70  , nKey, nData, p
2a680 50 61 67 65 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20  Page->pgno,.    
2a690 20 20 20 20 20 20 6c 6f 63 3d 3d 30 20 3f 20 22        loc==0 ? "
2a6a0 6f 76 65 72 77 72 69 74 65 22 20 3a 20 22 6e 65  overwrite" : "ne
2a6b0 77 20 65 6e 74 72 79 22 29 29 3b 0a 20 20 61 73  w entry"));.  as
2a6c0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
2a6d0 6e 69 74 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  nit );.  rc = sq
2a6e0 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
2a6f0 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a  (pPage->aData);.
2a700 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2a710 6e 20 72 63 3b 0a 20 20 6e 65 77 43 65 6c 6c 20  n rc;.  newCell 
2a720 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
2a730 77 28 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  w( MX_CELL_SIZE(
2a740 70 42 74 29 20 29 3b 0a 20 20 69 66 28 20 6e 65  pBt) );.  if( ne
2a750 77 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72  wCell==0 ) retur
2a760 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
2a770 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 43 65 6c    rc = fillInCel
2a780 6c 28 70 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c  l(pPage, newCell
2a790 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 44  , pKey, nKey, pD
2a7a0 61 74 61 2c 20 6e 44 61 74 61 2c 20 26 73 7a 4e  ata, nData, &szN
2a7b0 65 77 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ew);.  if( rc ) 
2a7c0 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b  goto end_insert;
2a7d0 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77  .  assert( szNew
2a7e0 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  ==cellSizePtr(pP
2a7f0 61 67 65 2c 20 6e 65 77 43 65 6c 6c 29 20 29 3b  age, newCell) );
2a800 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77  .  assert( szNew
2a810 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  <=MX_CELL_SIZE(p
2a820 42 74 29 20 29 3b 0a 20 20 69 66 28 20 6c 6f 63  Bt) );.  if( loc
2a830 3d 3d 30 20 26 26 20 43 55 52 53 4f 52 5f 56 41  ==0 && CURSOR_VA
2a840 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
2a850 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 4f  e ){.    int szO
2a860 6c 64 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ld;.    assert( 
2a870 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20  pCur->idx>=0 && 
2a880 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d  pCur->idx<pPage-
2a890 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 6f 6c  >nCell );.    ol
2a8a0 64 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  dCell = findCell
2a8b0 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64  (pPage, pCur->id
2a8c0 78 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61  x);.    if( !pPa
2a8d0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2a8e0 20 20 6d 65 6d 63 70 79 28 6e 65 77 43 65 6c 6c    memcpy(newCell
2a8f0 2c 20 6f 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a 20  , oldCell, 4);. 
2a900 20 20 20 7d 0a 20 20 20 20 73 7a 4f 6c 64 20 3d     }.    szOld =
2a910 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
2a920 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20  ge, oldCell);.  
2a930 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c    rc = clearCell
2a940 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29  (pPage, oldCell)
2a950 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
2a960 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a  oto end_insert;.
2a970 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61      dropCell(pPa
2a980 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 73  ge, pCur->idx, s
2a990 7a 4f 6c 64 29 3b 0a 20 20 7d 65 6c 73 65 20 69  zOld);.  }else i
2a9a0 66 28 20 6c 6f 63 3c 30 20 26 26 20 70 50 61 67  f( loc<0 && pPag
2a9b0 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20  e->nCell>0 ){.  
2a9c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2a9d0 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20 70 43 75  >leaf );.    pCu
2a9e0 72 2d 3e 69 64 78 2b 2b 3b 0a 20 20 20 20 70 43  r->idx++;.    pC
2a9f0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
2aa00 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
2aa10 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2aa20 6c 65 61 66 20 29 3b 0a 20 20 7d 0a 20 20 72 63  leaf );.  }.  rc
2aa30 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50   = insertCell(pP
2aa40 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20  age, pCur->idx, 
2aa50 6e 65 77 43 65 6c 6c 2c 20 73 7a 4e 65 77 2c 20  newCell, szNew, 
2aa60 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  0, 0);.  if( rc!
2aa70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
2aa80 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20  o end_insert;.  
2aa90 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61  rc = balance(pPa
2aaa0 67 65 2c 20 31 29 3b 0a 20 20 2f 2a 20 73 71 6c  ge, 1);.  /* sql
2aab0 69 74 65 33 42 74 72 65 65 50 61 67 65 44 75 6d  ite3BtreePageDum
2aac0 70 28 70 43 75 72 2d 3e 70 42 74 2c 20 70 43 75  p(pCur->pBt, pCu
2aad0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b  r->pgnoRoot, 1);
2aae0 20 2a 2f 0a 20 20 2f 2a 20 66 66 6c 75 73 68 28   */.  /* fflush(
2aaf0 73 74 64 6f 75 74 29 3b 20 2a 2f 0a 20 20 69 66  stdout); */.  if
2ab00 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2ab10 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f  ){.    moveToRoo
2ab20 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 65 6e 64  t(pCur);.  }.end
2ab30 5f 69 6e 73 65 72 74 3a 0a 20 20 73 71 6c 69 74  _insert:.  sqlit
2ab40 65 46 72 65 65 28 6e 65 77 43 65 6c 6c 29 3b 0a  eFree(newCell);.
2ab50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2ab60 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
2ab70 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
2ab80 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
2ab90 6e 67 20 74 6f 2e 20 20 54 68 65 20 63 75 72 73  ng to.  The curs
2aba0 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f  or.** is left po
2abb0 69 6e 74 69 6e 67 20 61 74 20 61 20 72 61 6e 64  inting at a rand
2abc0 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a  om location..*/.
2abd0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2abe0 44 65 6c 65 74 65 28 42 74 43 75 72 73 6f 72 20  Delete(BtCursor 
2abf0 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67  *pCur){.  MemPag
2ac00 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
2ac10 3e 70 50 61 67 65 3b 0a 20 20 75 6e 73 69 67 6e  >pPage;.  unsign
2ac20 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a  ed char *pCell;.
2ac30 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e 6f    int rc;.  Pgno
2ac40 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 30 3b 0a   pgnoChild = 0;.
2ac50 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2ac60 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  = pCur->pBtree->
2ac70 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pBt;..  assert( 
2ac80 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
2ac90 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72  .  if( pBt->inTr
2aca0 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53  ansaction!=TRANS
2acb0 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a  _WRITE ){.    /*
2acc0 20 4d 75 73 74 20 73 74 61 72 74 20 61 20 74 72   Must start a tr
2acd0 61 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65  ansaction before
2ace0 20 64 6f 69 6e 67 20 61 20 64 65 6c 65 74 65 20   doing a delete 
2acf0 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42  */.    return pB
2ad00 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51  t->readOnly ? SQ
2ad10 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  LITE_READONLY : 
2ad20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
2ad30 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74  }.  assert( !pBt
2ad40 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20  ->readOnly );.  
2ad50 69 66 28 20 70 43 75 72 2d 3e 69 64 78 20 3e 3d  if( pCur->idx >=
2ad60 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b   pPage->nCell ){
2ad70 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2ad80 54 45 5f 45 52 52 4f 52 3b 20 20 2f 2a 20 54 68  TE_ERROR;  /* Th
2ad90 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
2ada0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 79 74  pointing to anyt
2adb0 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  hing */.  }.  if
2adc0 28 20 21 70 43 75 72 2d 3e 77 72 46 6c 61 67 20  ( !pCur->wrFlag 
2add0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2ade0 4c 49 54 45 5f 50 45 52 4d 3b 20 20 20 2f 2a 20  LITE_PERM;   /* 
2adf0 44 69 64 20 6e 6f 74 20 6f 70 65 6e 20 74 68 69  Did not open thi
2ae00 73 20 63 75 72 73 6f 72 20 66 6f 72 20 77 72 69  s cursor for wri
2ae10 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  ting */.  }.  if
2ae20 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73  ( checkReadLocks
2ae30 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  (pBt, pCur->pgno
2ae40 52 6f 6f 74 2c 20 70 43 75 72 29 20 29 7b 0a 20  Root, pCur) ){. 
2ae50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2ae60 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54 68 65 20  _LOCKED; /* The 
2ae70 74 61 62 6c 65 20 70 43 75 72 20 70 6f 69 6e 74  table pCur point
2ae80 73 20 74 6f 20 68 61 73 20 61 20 72 65 61 64 20  s to has a read 
2ae90 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f  lock */.  }..  /
2aea0 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 63 75  * Restore the cu
2aeb0 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
2aec0 69 74 69 6f 6e 20 28 61 20 6e 6f 2d 6f 70 20 69  ition (a no-op i
2aed0 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
2aee0 6e 6f 74 20 69 6e 20 0a 20 20 2a 2a 20 43 55 52  not in .  ** CUR
2aef0 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
2af00 73 74 61 74 65 29 20 61 6e 64 20 73 61 76 65 20  state) and save 
2af10 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66  the positions of
2af20 20 61 6e 79 20 6f 74 68 65 72 20 63 75 72 73 6f   any other curso
2af30 72 73 20 0a 20 20 2a 2a 20 6f 70 65 6e 20 6f 6e  rs .  ** open on
2af40 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e   the same table.
2af50 20 54 68 65 6e 20 63 61 6c 6c 20 73 71 6c 69 74   Then call sqlit
2af60 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 29 20  e3pager_write() 
2af70 6f 6e 20 74 68 65 20 70 61 67 65 0a 20 20 2a 2a  on the page.  **
2af80 20 74 68 61 74 20 74 68 65 20 65 6e 74 72 79 20   that the entry 
2af90 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 20  will be deleted 
2afa0 66 72 6f 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  from..  */.  if(
2afb0 20 0a 20 20 20 20 28 72 63 20 3d 20 72 65 73 74   .    (rc = rest
2afc0 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72  oreOrClearCursor
2afd0 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 2c 20 31  Position(pCur, 1
2afe0 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20 28 72 63  ))!=0 ||.    (rc
2aff0 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
2b000 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e  s(pBt, pCur->pgn
2b010 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29 21 3d 30  oRoot, pCur))!=0
2b020 20 7c 7c 0a 20 20 20 20 28 72 63 20 3d 20 73 71   ||.    (rc = sq
2b030 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
2b040 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 29 21  (pPage->aData))!
2b050 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  =0.  ){.    retu
2b060 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
2b070 20 4c 6f 63 61 74 65 20 74 68 65 20 63 65 6c 6c   Locate the cell
2b080 20 77 69 74 68 69 6e 20 69 74 27 73 20 70 61 67   within it's pag
2b090 65 20 61 6e 64 20 6c 65 61 76 65 20 70 43 65 6c  e and leave pCel
2b0a0 6c 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  l pointing to th
2b0b0 65 0a 20 20 2a 2a 20 64 61 74 61 2e 20 54 68 65  e.  ** data. The
2b0c0 20 63 6c 65 61 72 43 65 6c 6c 28 29 20 63 61 6c   clearCell() cal
2b0d0 6c 20 66 72 65 65 73 20 61 6e 79 20 6f 76 65 72  l frees any over
2b0e0 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63  flow pages assoc
2b0f0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20  iated with the. 
2b100 20 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 65   ** cell. The ce
2b110 6c 6c 20 69 74 73 65 6c 66 20 69 73 20 73 74 69  ll itself is sti
2b120 6c 6c 20 69 6e 74 61 63 74 2e 0a 20 20 2a 2f 0a  ll intact..  */.
2b130 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
2b140 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  ll(pPage, pCur->
2b150 69 64 78 29 3b 0a 20 20 69 66 28 20 21 70 50 61  idx);.  if( !pPa
2b160 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2b170 70 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74 34  pgnoChild = get4
2b180 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 7d  byte(pCell);.  }
2b190 0a 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c  .  rc = clearCel
2b1a0 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b  l(pPage, pCell);
2b1b0 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
2b1c0 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 21 70  rn rc;..  if( !p
2b1d0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2b1e0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    /*.    ** The 
2b1f0 65 6e 74 72 79 20 77 65 20 61 72 65 20 61 62 6f  entry we are abo
2b200 75 74 20 74 6f 20 64 65 6c 65 74 65 20 69 73 20  ut to delete is 
2b210 6e 6f 74 20 61 20 6c 65 61 66 20 73 6f 20 69 66  not a leaf so if
2b220 20 77 65 20 64 6f 20 6e 6f 74 0a 20 20 20 20 2a   we do not.    *
2b230 2a 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77  * do something w
2b240 65 20 77 69 6c 6c 20 6c 65 61 76 65 20 61 20 68  e will leave a h
2b250 6f 6c 65 20 6f 6e 20 61 6e 20 69 6e 74 65 72 6e  ole on an intern
2b260 61 6c 20 70 61 67 65 2e 0a 20 20 20 20 2a 2a 20  al page..    ** 
2b270 57 65 20 68 61 76 65 20 74 6f 20 66 69 6c 6c 20  We have to fill 
2b280 74 68 65 20 68 6f 6c 65 20 62 79 20 6d 6f 76 69  the hole by movi
2b290 6e 67 20 69 6e 20 61 20 63 65 6c 6c 20 66 72 6f  ng in a cell fro
2b2a0 6d 20 61 20 6c 65 61 66 2e 20 20 54 68 65 0a 20  m a leaf.  The. 
2b2b0 20 20 20 2a 2a 20 6e 65 78 74 20 43 65 6c 6c 20     ** next Cell 
2b2c0 61 66 74 65 72 20 74 68 65 20 6f 6e 65 20 74 6f  after the one to
2b2d0 20 62 65 20 64 65 6c 65 74 65 64 20 69 73 20 67   be deleted is g
2b2e0 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69  uaranteed to exi
2b2f0 73 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 6f  st and.    ** to
2b300 20 62 65 20 61 20 6c 65 61 66 20 73 6f 20 77 65   be a leaf so we
2b310 20 63 61 6e 20 75 73 65 20 69 74 2e 0a 20 20 20   can use it..   
2b320 20 2a 2f 0a 20 20 20 20 42 74 43 75 72 73 6f 72   */.    BtCursor
2b330 20 6c 65 61 66 43 75 72 3b 0a 20 20 20 20 75 6e   leafCur;.    un
2b340 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 4e 65  signed char *pNe
2b350 78 74 3b 0a 20 20 20 20 69 6e 74 20 73 7a 4e 65  xt;.    int szNe
2b360 78 74 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70  xt;  /* The comp
2b370 69 6c 65 72 20 77 61 72 6e 69 6e 67 20 69 73 20  iler warning is 
2b380 77 72 6f 6e 67 3a 20 73 7a 4e 65 78 74 20 69 73  wrong: szNext is
2b390 20 61 6c 77 61 79 73 20 0a 20 20 20 20 20 20 20   always .       
2b3a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 69            ** ini
2b3b0 74 69 61 6c 69 7a 65 64 20 62 65 66 6f 72 65 20  tialized before 
2b3c0 75 73 65 2e 20 20 41 64 64 69 6e 67 20 61 6e 20  use.  Adding an 
2b3d0 65 78 74 72 61 20 69 6e 69 74 69 61 6c 69 7a 61  extra initializa
2b3e0 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 20 20 20  tion.           
2b3f0 20 20 20 20 20 20 2a 2a 20 74 6f 20 73 69 6c 65        ** to sile
2b400 6e 63 65 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  nce the compiler
2b410 20 73 6c 6f 77 73 20 64 6f 77 6e 20 74 68 65 20   slows down the 
2b420 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  code. */.    int
2b430 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 75 6e   notUsed;.    un
2b440 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d  signed char *tem
2b450 70 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 61  pCell = 0;.    a
2b460 73 73 65 72 74 28 20 21 70 50 61 67 65 2d 3e 6c  ssert( !pPage->l
2b470 65 61 66 44 61 74 61 20 29 3b 0a 20 20 20 20 67  eafData );.    g
2b480 65 74 54 65 6d 70 43 75 72 73 6f 72 28 70 43 75  etTempCursor(pCu
2b490 72 2c 20 26 6c 65 61 66 43 75 72 29 3b 0a 20 20  r, &leafCur);.  
2b4a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2b4b0 72 65 65 4e 65 78 74 28 26 6c 65 61 66 43 75 72  reeNext(&leafCur
2b4c0 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20  , &notUsed);.   
2b4d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2b4e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
2b4f0 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc!=SQLITE_NOMEM
2b500 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2b510 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2b520 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20  BKPT; .      }. 
2b530 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
2b540 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b550 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2b560 70 61 67 65 72 5f 77 72 69 74 65 28 6c 65 61 66  pager_write(leaf
2b570 43 75 72 2e 70 50 61 67 65 2d 3e 61 44 61 74 61  Cur.pPage->aData
2b580 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2b590 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2b5a0 7b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  {.      TRACE(("
2b5b0 44 45 4c 45 54 45 3a 20 74 61 62 6c 65 3d 25 64  DELETE: table=%d
2b5c0 20 64 65 6c 65 74 65 20 69 6e 74 65 72 6e 61 6c   delete internal
2b5d0 20 66 72 6f 6d 20 25 64 20 72 65 70 6c 61 63 65   from %d replace
2b5e0 20 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e 22   from leaf %d\n"
2b5f0 2c 0a 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  ,.         pCur-
2b600 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67 65  >pgnoRoot, pPage
2b610 2d 3e 70 67 6e 6f 2c 20 6c 65 61 66 43 75 72 2e  ->pgno, leafCur.
2b620 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20  pPage->pgno));. 
2b630 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50       dropCell(pP
2b640 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20  age, pCur->idx, 
2b650 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
2b660 65 2c 20 70 43 65 6c 6c 29 29 3b 0a 20 20 20 20  e, pCell));.    
2b670 20 20 70 4e 65 78 74 20 3d 20 66 69 6e 64 43 65    pNext = findCe
2b680 6c 6c 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65  ll(leafCur.pPage
2b690 2c 20 6c 65 61 66 43 75 72 2e 69 64 78 29 3b 0a  , leafCur.idx);.
2b6a0 20 20 20 20 20 20 73 7a 4e 65 78 74 20 3d 20 63        szNext = c
2b6b0 65 6c 6c 53 69 7a 65 50 74 72 28 6c 65 61 66 43  ellSizePtr(leafC
2b6c0 75 72 2e 70 50 61 67 65 2c 20 70 4e 65 78 74 29  ur.pPage, pNext)
2b6d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2b6e0 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74  MX_CELL_SIZE(pBt
2b6f0 29 3e 3d 73 7a 4e 65 78 74 2b 34 20 29 3b 0a 20  )>=szNext+4 );. 
2b700 20 20 20 20 20 74 65 6d 70 43 65 6c 6c 20 3d 20       tempCell = 
2b710 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
2b720 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
2b730 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  t) );.      if( 
2b740 74 65 6d 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20  tempCell==0 ){. 
2b750 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2b760 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
2b770 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
2b780 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2b790 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 73 65  .      rc = inse
2b7a0 72 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  rtCell(pPage, pC
2b7b0 75 72 2d 3e 69 64 78 2c 20 70 4e 65 78 74 2d 34  ur->idx, pNext-4
2b7c0 2c 20 73 7a 4e 65 78 74 2b 34 2c 20 74 65 6d 70  , szNext+4, temp
2b7d0 43 65 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Cell, 0);.    }.
2b7e0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2b7f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
2b800 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72  ut4byte(findOver
2b810 66 6c 6f 77 43 65 6c 6c 28 70 50 61 67 65 2c 20  flowCell(pPage, 
2b820 70 43 75 72 2d 3e 69 64 78 29 2c 20 70 67 6e 6f  pCur->idx), pgno
2b830 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 72 63  Child);.      rc
2b840 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61 67 65   = balance(pPage
2b850 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
2b860 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2b870 4b 20 29 7b 0a 20 20 20 20 20 20 64 72 6f 70 43  K ){.      dropC
2b880 65 6c 6c 28 6c 65 61 66 43 75 72 2e 70 50 61 67  ell(leafCur.pPag
2b890 65 2c 20 6c 65 61 66 43 75 72 2e 69 64 78 2c 20  e, leafCur.idx, 
2b8a0 73 7a 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 72  szNext);.      r
2b8b0 63 20 3d 20 62 61 6c 61 6e 63 65 28 6c 65 61 66  c = balance(leaf
2b8c0 43 75 72 2e 70 50 61 67 65 2c 20 30 29 3b 0a 20  Cur.pPage, 0);. 
2b8d0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46     }.    sqliteF
2b8e0 72 65 65 28 74 65 6d 70 43 65 6c 6c 29 3b 0a 20  ree(tempCell);. 
2b8f0 20 20 20 72 65 6c 65 61 73 65 54 65 6d 70 43 75     releaseTempCu
2b900 72 73 6f 72 28 26 6c 65 61 66 43 75 72 29 3b 0a  rsor(&leafCur);.
2b910 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 52 41    }else{.    TRA
2b920 43 45 28 28 22 44 45 4c 45 54 45 3a 20 74 61 62  CE(("DELETE: tab
2b930 6c 65 3d 25 64 20 64 65 6c 65 74 65 20 66 72 6f  le=%d delete fro
2b940 6d 20 6c 65 61 66 20 25 64 5c 6e 22 2c 0a 20 20  m leaf %d\n",.  
2b950 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52       pCur->pgnoR
2b960 6f 6f 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  oot, pPage->pgno
2b970 29 29 3b 0a 20 20 20 20 64 72 6f 70 43 65 6c 6c  ));.    dropCell
2b980 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64  (pPage, pCur->id
2b990 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  x, cellSizePtr(p
2b9a0 50 61 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a 20  Page, pCell));. 
2b9b0 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28     rc = balance(
2b9c0 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 7d 0a 20  pPage, 0);.  }. 
2b9d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2b9e0 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f  OK ){.    moveTo
2b9f0 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a  Root(pCur);.  }.
2ba00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2ba10 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
2ba20 65 77 20 42 54 72 65 65 20 74 61 62 6c 65 2e 20  ew BTree table. 
2ba30 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 54   Write into *piT
2ba40 61 62 6c 65 20 74 68 65 20 70 61 67 65 0a 2a 2a  able the page.**
2ba50 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
2ba60 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65  root page of the
2ba70 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   new table..**.*
2ba80 2a 20 54 68 65 20 74 79 70 65 20 6f 66 20 74 79  * The type of ty
2ba90 70 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  pe is determined
2baa0 20 62 79 20 74 68 65 20 66 6c 61 67 73 20 70 61   by the flags pa
2bab0 72 61 6d 65 74 65 72 2e 20 20 4f 6e 6c 79 20 74  rameter.  Only t
2bac0 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  he.** following 
2bad0 76 61 6c 75 65 73 20 6f 66 20 66 6c 61 67 73 20  values of flags 
2bae0 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  are currently in
2baf0 20 75 73 65 2e 20 20 4f 74 68 65 72 20 76 61 6c   use.  Other val
2bb00 75 65 73 20 66 6f 72 0a 2a 2a 20 66 6c 61 67 73  ues for.** flags
2bb10 20 6d 69 67 68 74 20 6e 6f 74 20 77 6f 72 6b 3a   might not work:
2bb20 0a 2a 2a 0a 2a 2a 20 20 20 20 20 42 54 52 45 45  .**.**     BTREE
2bb30 5f 49 4e 54 4b 45 59 7c 42 54 52 45 45 5f 4c 45  _INTKEY|BTREE_LE
2bb40 41 46 44 41 54 41 20 20 20 20 20 55 73 65 64 20  AFDATA     Used 
2bb50 66 6f 72 20 53 51 4c 20 74 61 62 6c 65 73 20 77  for SQL tables w
2bb60 69 74 68 20 72 6f 77 69 64 20 6b 65 79 73 0a 2a  ith rowid keys.*
2bb70 2a 20 20 20 20 20 42 54 52 45 45 5f 5a 45 52 4f  *     BTREE_ZERO
2bb80 44 41 54 41 20 20 20 20 20 20 20 20 20 20 20 20  DATA            
2bb90 20 20 20 20 20 20 55 73 65 64 20 66 6f 72 20 53        Used for S
2bba0 51 4c 20 69 6e 64 69 63 65 73 0a 2a 2f 0a 69 6e  QL indices.*/.in
2bbb0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72  t sqlite3BtreeCr
2bbc0 65 61 74 65 54 61 62 6c 65 28 42 74 72 65 65 20  eateTable(Btree 
2bbd0 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c 65  *p, int *piTable
2bbe0 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
2bbf0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
2bc00 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67  p->pBt;.  MemPag
2bc10 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 50 67 6e 6f  e *pRoot;.  Pgno
2bc20 20 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 69 6e 74   pgnoRoot;.  int
2bc30 20 72 63 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e   rc;.  if( pBt->
2bc40 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d 54  inTransaction!=T
2bc50 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
2bc60 20 20 2f 2a 20 4d 75 73 74 20 73 74 61 72 74 20    /* Must start 
2bc70 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69  a transaction fi
2bc80 72 73 74 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  rst */.    retur
2bc90 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  n pBt->readOnly 
2bca0 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  ? SQLITE_READONL
2bcb0 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  Y : SQLITE_ERROR
2bcc0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2bcd0 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  !pBt->readOnly )
2bce0 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 69 6c  ;..  /* It is il
2bcf0 6c 65 67 61 6c 20 74 6f 20 63 72 65 61 74 65 20  legal to create 
2bd00 61 20 74 61 62 6c 65 20 69 66 20 61 6e 79 20 63  a table if any c
2bd10 75 72 73 6f 72 73 20 61 72 65 20 6f 70 65 6e 20  ursors are open 
2bd20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  on the.  ** data
2bd30 62 61 73 65 2e 20 54 68 69 73 20 69 73 20 62 65  base. This is be
2bd40 63 61 75 73 65 20 69 6e 20 61 75 74 6f 2d 76 61  cause in auto-va
2bd50 63 75 75 6d 20 6d 6f 64 65 20 74 68 65 20 62 61  cuum mode the ba
2bd60 63 6b 65 6e 64 20 6d 61 79 0a 20 20 2a 2a 20 6e  ckend may.  ** n
2bd70 65 65 64 20 74 6f 20 6d 6f 76 65 20 61 20 64 61  eed to move a da
2bd80 74 61 62 61 73 65 20 70 61 67 65 20 74 6f 20 6d  tabase page to m
2bd90 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65  ake room for the
2bda0 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 2e 0a   new root-page..
2bdb0 20 20 2a 2a 20 49 66 20 61 6e 20 6f 70 65 6e 20    ** If an open 
2bdc0 63 75 72 73 6f 72 20 77 61 73 20 75 73 69 6e 67  cursor was using
2bdd0 20 74 68 65 20 70 61 67 65 20 61 20 70 72 6f 62   the page a prob
2bde0 6c 65 6d 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e  lem would occur.
2bdf0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
2be00 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  >pCursor ){.    
2be10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
2be20 43 4b 45 44 3b 0a 20 20 7d 0a 0a 23 69 66 64 65  CKED;.  }..#ifde
2be30 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2be40 54 4f 56 41 43 55 55 4d 0a 20 20 72 63 20 3d 20  TOVACUUM.  rc = 
2be50 61 6c 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74  allocatePage(pBt
2be60 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52  , &pRoot, &pgnoR
2be70 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 69 66  oot, 1, 0);.  if
2be80 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2be90 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 70 42  ;.#else.  if( pB
2bea0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
2beb0 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4d 6f  .    Pgno pgnoMo
2bec0 76 65 3b 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65  ve;      /* Move
2bed0 20 61 20 70 61 67 65 20 68 65 72 65 20 74 6f 20   a page here to 
2bee0 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68  make room for th
2bef0 65 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 20  e root-page */. 
2bf00 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
2bf10 65 4d 6f 76 65 3b 20 2f 2a 20 54 68 65 20 70 61  eMove; /* The pa
2bf20 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 20 2a  ge to move to. *
2bf30 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  /..    /* Read t
2bf40 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 65 74 61  he value of meta
2bf50 5b 33 5d 20 66 72 6f 6d 20 74 68 65 20 64 61 74  [3] from the dat
2bf60 61 62 61 73 65 20 74 6f 20 64 65 74 65 72 6d 69  abase to determi
2bf70 6e 65 20 77 68 65 72 65 20 74 68 65 0a 20 20 20  ne where the.   
2bf80 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66   ** root page of
2bf90 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 73   the new table s
2bfa0 68 6f 75 6c 64 20 67 6f 2e 20 6d 65 74 61 5b 33  hould go. meta[3
2bfb0 5d 20 69 73 20 74 68 65 20 6c 61 72 67 65 73 74  ] is the largest
2bfc0 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a   root-page.    *
2bfd0 2a 20 63 72 65 61 74 65 64 20 73 6f 20 66 61 72  * created so far
2bfe0 2c 20 73 6f 20 74 68 65 20 6e 65 77 20 72 6f 6f  , so the new roo
2bff0 74 2d 70 61 67 65 20 69 73 20 28 6d 65 74 61 5b  t-page is (meta[
2c000 33 5d 2b 31 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  3]+1)..    */.  
2c010 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2c020 72 65 65 47 65 74 4d 65 74 61 28 70 2c 20 34 2c  reeGetMeta(p, 4,
2c030 20 26 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20   &pgnoRoot);.   
2c040 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2c050 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
2c060 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a      pgnoRoot++;.
2c070 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20  .    /* The new 
2c080 72 6f 6f 74 2d 70 61 67 65 20 6d 61 79 20 6e 6f  root-page may no
2c090 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f  t be allocated o
2c0a0 6e 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  n a pointer-map 
2c0b0 70 61 67 65 2c 20 6f 72 20 74 68 65 0a 20 20 20  page, or the.   
2c0c0 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45   ** PENDING_BYTE
2c0d0 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
2c0e0 20 20 69 66 28 20 70 67 6e 6f 52 6f 6f 74 3d 3d    if( pgnoRoot==
2c0f0 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
2c100 74 2c 20 70 67 6e 6f 52 6f 6f 74 29 20 7c 7c 0a  t, pgnoRoot) ||.
2c110 20 20 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74          pgnoRoot
2c120 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
2c130 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
2c140 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 20 20    pgnoRoot++;.  
2c150 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
2c160 70 67 6e 6f 52 6f 6f 74 3e 3d 33 20 29 3b 0a 0a  pgnoRoot>=3 );..
2c170 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20      /* Allocate 
2c180 61 20 70 61 67 65 2e 20 54 68 65 20 70 61 67 65  a page. The page
2c190 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20   that currently 
2c1a0 72 65 73 69 64 65 73 20 61 74 20 70 67 6e 6f 52  resides at pgnoR
2c1b0 6f 6f 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  oot will.    ** 
2c1c0 62 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20  be moved to the 
2c1d0 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 28  allocated page (
2c1e0 75 6e 6c 65 73 73 20 74 68 65 20 61 6c 6c 6f 63  unless the alloc
2c1f0 61 74 65 64 20 70 61 67 65 20 68 61 70 70 65 6e  ated page happen
2c200 73 0a 20 20 20 20 2a 2a 20 74 6f 20 72 65 73 69  s.    ** to resi
2c210 64 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74 29 2e  de at pgnoRoot).
2c220 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
2c230 20 61 6c 6c 6f 63 61 74 65 50 61 67 65 28 70 42   allocatePage(pB
2c240 74 2c 20 26 70 50 61 67 65 4d 6f 76 65 2c 20 26  t, &pPageMove, &
2c250 70 67 6e 6f 4d 6f 76 65 2c 20 70 67 6e 6f 52 6f  pgnoMove, pgnoRo
2c260 6f 74 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20  ot, 1);.    if( 
2c270 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2c280 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
2c290 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
2c2a0 20 70 67 6e 6f 4d 6f 76 65 21 3d 70 67 6e 6f 52   pgnoMove!=pgnoR
2c2b0 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20 75 38 20  oot ){.      u8 
2c2c0 65 54 79 70 65 3b 0a 20 20 20 20 20 20 50 67 6e  eType;.      Pgn
2c2d0 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20  o iPtrPage;..   
2c2e0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2c2f0 50 61 67 65 4d 6f 76 65 29 3b 0a 20 20 20 20 20  PageMove);.     
2c300 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70 42   rc = getPage(pB
2c310 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52  t, pgnoRoot, &pR
2c320 6f 6f 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  oot);.      if( 
2c330 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2c340 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2c350 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
2c360 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
2c370 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20  (pBt, pgnoRoot, 
2c380 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67  &eType, &iPtrPag
2c390 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
2c3a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 65  !=SQLITE_OK || e
2c3b0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
2c3c0 54 50 41 47 45 20 7c 7c 20 65 54 79 70 65 3d 3d  TPAGE || eType==
2c3d0 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
2c3e0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
2c3f0 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20  sePage(pRoot);. 
2c400 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2c410 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2c420 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 50  assert( eType!=P
2c430 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
2c440 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2c450 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 46 52  eType!=PTRMAP_FR
2c460 45 45 50 41 47 45 20 29 3b 0a 20 20 20 20 20 20  EEPAGE );.      
2c470 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
2c480 72 5f 77 72 69 74 65 28 70 52 6f 6f 74 2d 3e 61  r_write(pRoot->a
2c490 44 61 74 61 29 3b 0a 20 20 20 20 20 20 69 66 28  Data);.      if(
2c4a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2c4b0 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
2c4c0 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20  ePage(pRoot);.  
2c4d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2c4e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
2c4f0 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65  c = relocatePage
2c500 28 70 42 74 2c 20 70 52 6f 6f 74 2c 20 65 54 79  (pBt, pRoot, eTy
2c510 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 70 67  pe, iPtrPage, pg
2c520 6e 6f 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 72  noMove);.      r
2c530 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74  eleasePage(pRoot
2c540 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
2c550 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2c560 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2c570 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
2c580 63 20 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c  c = getPage(pBt,
2c590 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f   pgnoRoot, &pRoo
2c5a0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
2c5b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2c5c0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2c5d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2c5e0 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
2c5f0 72 5f 77 72 69 74 65 28 70 52 6f 6f 74 2d 3e 61  r_write(pRoot->a
2c600 44 61 74 61 29 3b 0a 20 20 20 20 20 20 69 66 28  Data);.      if(
2c610 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2c620 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
2c630 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20  ePage(pRoot);.  
2c640 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2c650 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
2c660 73 65 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 20  se{.      pRoot 
2c670 3d 20 70 50 61 67 65 4d 6f 76 65 3b 0a 20 20 20  = pPageMove;.   
2c680 20 7d 20 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61   } ..    /* Upda
2c690 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  te the pointer-m
2c6a0 61 70 20 61 6e 64 20 6d 65 74 61 2d 64 61 74 61  ap and meta-data
2c6b0 20 77 69 74 68 20 74 68 65 20 6e 65 77 20 72 6f   with the new ro
2c6c0 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20  ot-page number. 
2c6d0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d  */.    rc = ptrm
2c6e0 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 52  apPut(pBt, pgnoR
2c6f0 6f 6f 74 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54  oot, PTRMAP_ROOT
2c700 50 41 47 45 2c 20 30 29 3b 0a 20 20 20 20 69 66  PAGE, 0);.    if
2c710 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
2c720 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29  leasePage(pRoot)
2c730 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
2c740 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
2c750 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70  = sqlite3BtreeUp
2c760 64 61 74 65 4d 65 74 61 28 70 2c 20 34 2c 20 70  dateMeta(p, 4, p
2c770 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66  gnoRoot);.    if
2c780 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
2c790 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29  leasePage(pRoot)
2c7a0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
2c7b0 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73  c;.    }..  }els
2c7c0 65 7b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f  e{.    rc = allo
2c7d0 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 26 70  catePage(pBt, &p
2c7e0 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c  Root, &pgnoRoot,
2c7f0 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   1, 0);.    if( 
2c800 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2c810 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 61 73 73    }.#endif.  ass
2c820 65 72 74 28 20 73 71 6c 69 74 65 33 70 61 67 65  ert( sqlite3page
2c830 72 5f 69 73 77 72 69 74 65 61 62 6c 65 28 70 52  r_iswriteable(pR
2c840 6f 6f 74 2d 3e 61 44 61 74 61 29 20 29 3b 0a 20  oot->aData) );. 
2c850 20 7a 65 72 6f 50 61 67 65 28 70 52 6f 6f 74 2c   zeroPage(pRoot,
2c860 20 66 6c 61 67 73 20 7c 20 50 54 46 5f 4c 45 41   flags | PTF_LEA
2c870 46 29 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67  F);.  sqlite3pag
2c880 65 72 5f 75 6e 72 65 66 28 70 52 6f 6f 74 2d 3e  er_unref(pRoot->
2c890 61 44 61 74 61 29 3b 0a 20 20 2a 70 69 54 61 62  aData);.  *piTab
2c8a0 6c 65 20 3d 20 28 69 6e 74 29 70 67 6e 6f 52 6f  le = (int)pgnoRo
2c8b0 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ot;.  return SQL
2c8c0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
2c8d0 20 45 72 61 73 65 20 74 68 65 20 67 69 76 65 6e   Erase the given
2c8e0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 61   database page a
2c8f0 6e 64 20 61 6c 6c 20 69 74 73 20 63 68 69 6c 64  nd all its child
2c900 72 65 6e 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ren.  Return.** 
2c910 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20  the page to the 
2c920 66 72 65 65 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  freelist..*/.sta
2c930 74 69 63 20 69 6e 74 20 63 6c 65 61 72 44 61 74  tic int clearDat
2c940 61 62 61 73 65 50 61 67 65 28 0a 20 20 42 74 53  abasePage(.  BtS
2c950 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
2c960 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72        /* The BTr
2c970 65 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ee that contains
2c980 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
2c990 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
2c9a0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
2c9b0 6d 62 65 72 20 74 6f 20 63 6c 65 61 72 20 2a 2f  mber to clear */
2c9c0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  .  MemPage *pPar
2c9d0 65 6e 74 2c 20 20 20 20 20 2f 2a 20 50 61 72 65  ent,     /* Pare
2c9e0 6e 74 20 70 61 67 65 2e 20 20 4e 55 4c 4c 20 66  nt page.  NULL f
2c9f0 6f 72 20 74 68 65 20 72 6f 6f 74 20 2a 2f 0a 20  or the root */. 
2ca00 20 69 6e 74 20 66 72 65 65 50 61 67 65 46 6c 61   int freePageFla
2ca10 67 20 20 20 20 20 20 2f 2a 20 44 65 61 6c 6c 6f  g      /* Deallo
2ca20 63 61 74 65 20 70 61 67 65 20 69 66 20 74 72 75  cate page if tru
2ca30 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67  e */.){.  MemPag
2ca40 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20  e *pPage = 0;.  
2ca50 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e  int rc;.  unsign
2ca60 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a  ed char *pCell;.
2ca70 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20    int i;..  if( 
2ca80 70 67 6e 6f 3e 73 71 6c 69 74 65 33 70 61 67 65  pgno>sqlite3page
2ca90 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  r_pagecount(pBt-
2caa0 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  >pPager) ){.    
2cab0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
2cac0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
2cad0 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e  .  rc = getAndIn
2cae0 69 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f  itPage(pBt, pgno
2caf0 2c 20 26 70 50 61 67 65 2c 20 70 50 61 72 65 6e  , &pPage, pParen
2cb00 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  t);.  if( rc ) g
2cb10 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73  oto cleardatabas
2cb20 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 72 63 20  epage_out;.  rc 
2cb30 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77  = sqlite3pager_w
2cb40 72 69 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  rite(pPage->aDat
2cb50 61 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  a);.  if( rc ) g
2cb60 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73  oto cleardatabas
2cb70 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 66 6f 72  epage_out;.  for
2cb80 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e  (i=0; i<pPage->n
2cb90 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
2cba0 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
2cbb0 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20  (pPage, i);.    
2cbc0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
2cbd0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 63   ){.      rc = c
2cbe0 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65  learDatabasePage
2cbf0 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 70  (pBt, get4byte(p
2cc00 43 65 6c 6c 29 2c 20 70 50 61 67 65 2d 3e 70 50  Cell), pPage->pP
2cc10 61 72 65 6e 74 2c 20 31 29 3b 0a 20 20 20 20 20  arent, 1);.     
2cc20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63   if( rc ) goto c
2cc30 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65  leardatabasepage
2cc40 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
2cc50 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70  rc = clearCell(p
2cc60 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20  Page, pCell);.  
2cc70 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2cc80 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67  cleardatabasepag
2cc90 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28  e_out;.  }.  if(
2cca0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2ccb0 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44  .    rc = clearD
2ccc0 61 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c  atabasePage(pBt,
2ccd0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
2cce0 2d 3e 61 44 61 74 61 5b 38 5d 29 2c 20 70 50 61  ->aData[8]), pPa
2ccf0 67 65 2d 3e 70 50 61 72 65 6e 74 2c 20 31 29 3b  ge->pParent, 1);
2cd00 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
2cd10 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65  to cleardatabase
2cd20 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  page_out;.  }.  
2cd30 69 66 28 20 66 72 65 65 50 61 67 65 46 6c 61 67  if( freePageFlag
2cd40 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 72 65   ){.    rc = fre
2cd50 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
2cd60 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 65 72 6f 50  }else{.    zeroP
2cd70 61 67 65 28 70 50 61 67 65 2c 20 70 50 61 67 65  age(pPage, pPage
2cd80 2d 3e 61 44 61 74 61 5b 30 5d 20 7c 20 50 54 46  ->aData[0] | PTF
2cd90 5f 4c 45 41 46 29 3b 0a 20 20 7d 0a 0a 63 6c 65  _LEAF);.  }..cle
2cda0 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f  ardatabasepage_o
2cdb0 75 74 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  ut:.  releasePag
2cdc0 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74 75  e(pPage);.  retu
2cdd0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2cde0 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 66 6f 72  Delete all infor
2cdf0 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 20 73 69  mation from a si
2ce00 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68  ngle table in th
2ce10 65 20 64 61 74 61 62 61 73 65 2e 20 20 69 54 61  e database.  iTa
2ce20 62 6c 65 20 69 73 0a 2a 2a 20 74 68 65 20 70 61  ble is.** the pa
2ce30 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
2ce40 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62   root of the tab
2ce50 6c 65 2e 20 20 41 66 74 65 72 20 74 68 69 73 20  le.  After this 
2ce60 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2c  routine returns,
2ce70 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67  .** the root pag
2ce80 65 20 69 73 20 65 6d 70 74 79 2c 20 62 75 74 20  e is empty, but 
2ce90 73 74 69 6c 6c 20 65 78 69 73 74 73 2e 0a 2a 2a  still exists..**
2cea0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2ceb0 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20   will fail with 
2cec0 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66  SQLITE_LOCKED if
2ced0 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f   there are any o
2cee0 70 65 6e 0a 2a 2a 20 72 65 61 64 20 63 75 72 73  pen.** read curs
2cef0 6f 72 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ors on the table
2cf00 2e 20 20 4f 70 65 6e 20 77 72 69 74 65 20 63 75  .  Open write cu
2cf10 72 73 6f 72 73 20 61 72 65 20 6d 6f 76 65 64 20  rsors are moved 
2cf20 74 6f 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 6f  to the.** root o
2cf30 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a  f the table..*/.
2cf40 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2cf50 43 6c 65 61 72 54 61 62 6c 65 28 42 74 72 65 65  ClearTable(Btree
2cf60 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 29   *p, int iTable)
2cf70 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
2cf80 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20  Cursor *pCur;.  
2cf90 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
2cfa0 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  p->pBt;.  sqlite
2cfb0 33 20 2a 64 62 20 3d 20 70 2d 3e 70 53 71 6c 69  3 *db = p->pSqli
2cfc0 74 65 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  te;.  if( p->inT
2cfd0 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54  rans!=TRANS_WRIT
2cfe0 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  E ){.    return 
2cff0 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20  pBt->readOnly ? 
2d000 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
2d010 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  : SQLITE_ERROR;.
2d020 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69    }..  /* If thi
2d030 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  s connection is 
2d040 6e 6f 74 20 69 6e 20 72 65 61 64 2d 75 6e 63 6f  not in read-unco
2d050 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20 61 6e 64  mmitted mode and
2d060 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73 0a 20   currently has. 
2d070 20 2a 2a 20 61 20 72 65 61 64 2d 63 75 72 73 6f   ** a read-curso
2d080 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 74 61  r open on the ta
2d090 62 6c 65 20 62 65 69 6e 67 20 63 6c 65 61 72 65  ble being cleare
2d0a0 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  d, return SQLITE
2d0b0 5f 4c 4f 43 4b 45 44 2e 0a 20 20 2a 2f 0a 20 20  _LOCKED..  */.  
2d0c0 69 66 28 20 30 3d 3d 64 62 20 7c 7c 20 30 3d 3d  if( 0==db || 0==
2d0d0 28 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54  (db->flags&SQLIT
2d0e0 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65  E_ReadUncommitte
2d0f0 64 29 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 43  d) ){.    for(pC
2d100 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  ur=pBt->pCursor;
2d110 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72   pCur; pCur=pCur
2d120 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
2d130 69 66 28 20 70 43 75 72 2d 3e 70 42 74 72 65 65  if( pCur->pBtree
2d140 3d 3d 70 20 26 26 20 70 43 75 72 2d 3e 70 67 6e  ==p && pCur->pgn
2d150 6f 52 6f 6f 74 3d 3d 28 50 67 6e 6f 29 69 54 61  oRoot==(Pgno)iTa
2d160 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ble ){.        i
2d170 66 28 20 30 3d 3d 70 43 75 72 2d 3e 77 72 46 6c  f( 0==pCur->wrFl
2d180 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ag ){.          
2d190 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
2d1a0 43 4b 45 44 3b 0a 20 20 20 20 20 20 20 20 7d 0a  CKED;.        }.
2d1b0 20 20 20 20 20 20 20 20 6d 6f 76 65 54 6f 52 6f          moveToRo
2d1c0 6f 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  ot(pCur);.      
2d1d0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
2d1e0 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69 74  * Save the posit
2d1f0 69 6f 6e 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f  ion of all curso
2d200 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20  rs open on this 
2d210 74 61 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 53  table */.  if( S
2d220 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
2d230 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
2d240 42 74 2c 20 69 54 61 62 6c 65 2c 20 30 29 29 20  Bt, iTable, 0)) 
2d250 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
2d260 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
2d270 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67  clearDatabasePag
2d280 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 54 61  e(pBt, (Pgno)iTa
2d290 62 6c 65 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f  ble, 0, 0);.}../
2d2a0 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 69  *.** Erase all i
2d2b0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 61 20  nformation in a 
2d2c0 74 61 62 6c 65 20 61 6e 64 20 61 64 64 20 74 68  table and add th
2d2d0 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61  e root of the ta
2d2e0 62 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 66 72  ble to.** the fr
2d2f0 65 65 6c 69 73 74 2e 20 20 45 78 63 65 70 74 2c  eelist.  Except,
2d300 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65   the root of the
2d310 20 70 72 69 6e 63 69 70 6c 65 20 74 61 62 6c 65   principle table
2d320 20 28 74 68 65 20 6f 6e 65 20 6f 6e 0a 2a 2a 20   (the one on.** 
2d330 70 61 67 65 20 31 29 20 69 73 20 6e 65 76 65 72  page 1) is never
2d340 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
2d350 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  eelist..**.** Th
2d360 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
2d370 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45  fail with SQLITE
2d380 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68 65 72 65  _LOCKED if there
2d390 20 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a   are any open.**
2d3a0 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20   cursors on the 
2d3b0 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  table..**.** If 
2d3c0 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 65 6e  AUTOVACUUM is en
2d3d0 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20 70 61  abled and the pa
2d3e0 67 65 20 61 74 20 69 54 61 62 6c 65 20 69 73 20  ge at iTable is 
2d3f0 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20  not the last.** 
2d400 72 6f 6f 74 20 70 61 67 65 20 69 6e 20 74 68 65  root page in the
2d410 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2d420 74 68 65 6e 20 74 68 65 20 6c 61 73 74 20 72 6f  then the last ro
2d430 6f 74 20 70 61 67 65 20 0a 2a 2a 20 69 6e 20 74  ot page .** in t
2d440 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2d450 20 69 73 20 6d 6f 76 65 64 20 69 6e 74 6f 20 74   is moved into t
2d460 68 65 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c 79  he slot formerly
2d470 20 6f 63 63 75 70 69 65 64 20 62 79 0a 2a 2a 20   occupied by.** 
2d480 69 54 61 62 6c 65 20 61 6e 64 20 74 68 61 74 20  iTable and that 
2d490 6c 61 73 74 20 73 6c 6f 74 20 66 6f 72 6d 65 72  last slot former
2d4a0 6c 79 20 6f 63 63 75 70 69 65 64 20 62 79 20 74  ly occupied by t
2d4b0 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67  he last root pag
2d4c0 65 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f  e.** is added to
2d4d0 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e   the freelist in
2d4e0 73 74 65 61 64 20 6f 66 20 69 54 61 62 6c 65 2e  stead of iTable.
2d4f0 20 20 49 6e 20 74 68 69 73 20 73 61 79 2c 20 61    In this say, a
2d500 6c 6c 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 73  ll.** root pages
2d510 20 61 72 65 20 6b 65 70 74 20 61 74 20 74 68 65   are kept at the
2d520 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
2d530 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
2d540 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 6e 65 63   which.** is nec
2d550 65 73 73 61 72 79 20 66 6f 72 20 41 55 54 4f 56  essary for AUTOV
2d560 41 43 55 55 4d 20 74 6f 20 77 6f 72 6b 20 72 69  ACUUM to work ri
2d570 67 68 74 2e 20 20 2a 70 69 4d 6f 76 65 64 20 69  ght.  *piMoved i
2d580 73 20 73 65 74 20 74 6f 20 74 68 65 20 0a 2a 2a  s set to the .**
2d590 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 68 61   page number tha
2d5a0 74 20 75 73 65 64 20 74 6f 20 62 65 20 74 68 65  t used to be the
2d5b0 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65 20   last root page 
2d5c0 69 6e 20 74 68 65 20 66 69 6c 65 20 62 65 66 6f  in the file befo
2d5d0 72 65 0a 2a 2a 20 74 68 65 20 6d 6f 76 65 2e 20  re.** the move. 
2d5e0 20 49 66 20 6e 6f 20 70 61 67 65 20 67 65 74 73   If no page gets
2d5f0 20 6d 6f 76 65 64 2c 20 2a 70 69 4d 6f 76 65 64   moved, *piMoved
2d600 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a   is set to 0..**
2d610 20 54 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70   The last root p
2d620 61 67 65 20 69 73 20 72 65 63 6f 72 64 65 64 20  age is recorded 
2d630 69 6e 20 6d 65 74 61 5b 33 5d 20 61 6e 64 20 74  in meta[3] and t
2d640 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 6d  he value of.** m
2d650 65 74 61 5b 33 5d 20 69 73 20 75 70 64 61 74 65  eta[3] is update
2d660 64 20 62 79 20 74 68 69 73 20 70 72 6f 63 65 64  d by this proced
2d670 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ure..*/.int sqli
2d680 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c  te3BtreeDropTabl
2d690 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
2d6a0 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70 69 4d  iTable, int *piM
2d6b0 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b  oved){.  int rc;
2d6c0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2d6d0 65 20 3d 20 30 3b 0a 20 20 42 74 53 68 61 72 65  e = 0;.  BtShare
2d6e0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
2d6f0 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ..  if( p->inTra
2d700 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns!=TRANS_WRITE 
2d710 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42  ){.    return pB
2d720 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51  t->readOnly ? SQ
2d730 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  LITE_READONLY : 
2d740 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
2d750 7d 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 69 6c  }..  /* It is il
2d760 6c 65 67 61 6c 20 74 6f 20 64 72 6f 70 20 61 20  legal to drop a 
2d770 74 61 62 6c 65 20 69 66 20 61 6e 79 20 63 75 72  table if any cur
2d780 73 6f 72 73 20 61 72 65 20 6f 70 65 6e 20 6f 6e  sors are open on
2d790 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
2d7a0 73 65 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  se. This is beca
2d7b0 75 73 65 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  use in auto-vacu
2d7c0 75 6d 20 6d 6f 64 65 20 74 68 65 20 62 61 63 6b  um mode the back
2d7d0 65 6e 64 20 6d 61 79 0a 20 20 2a 2a 20 6e 65 65  end may.  ** nee
2d7e0 64 20 74 6f 20 6d 6f 76 65 20 61 6e 6f 74 68 65  d to move anothe
2d7f0 72 20 72 6f 6f 74 2d 70 61 67 65 20 74 6f 20 66  r root-page to f
2d800 69 6c 6c 20 61 20 67 61 70 20 6c 65 66 74 20 62  ill a gap left b
2d810 79 20 74 68 65 20 64 65 6c 65 74 65 64 0a 20 20  y the deleted.  
2d820 2a 2a 20 72 6f 6f 74 20 70 61 67 65 2e 20 49 66  ** root page. If
2d830 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20   an open cursor 
2d840 77 61 73 20 75 73 69 6e 67 20 74 68 69 73 20 70  was using this p
2d850 61 67 65 20 61 20 70 72 6f 62 6c 65 6d 20 77 6f  age a problem wo
2d860 75 6c 64 20 0a 20 20 2a 2a 20 6f 63 63 75 72 2e  uld .  ** occur.
2d870 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
2d880 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  >pCursor ){.    
2d890 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
2d8a0 43 4b 45 44 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  CKED;.  }..  rc 
2d8b0 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c 20 28  = getPage(pBt, (
2d8c0 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20 26 70 50  Pgno)iTable, &pP
2d8d0 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
2d8e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
2d8f0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
2d900 6c 65 61 72 54 61 62 6c 65 28 70 2c 20 69 54 61  learTable(p, iTa
2d910 62 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ble);.  if( rc )
2d920 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
2d930 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65  e(pPage);.    re
2d940 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
2d950 2a 70 69 4d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20  *piMoved = 0;.. 
2d960 20 69 66 28 20 69 54 61 62 6c 65 3e 31 20 29 7b   if( iTable>1 ){
2d970 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
2d980 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2d990 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
2d9a0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65 6c  (pPage);.    rel
2d9b0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
2d9c0 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70  .#else.    if( p
2d9d0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
2d9e0 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6d 61 78  {.      Pgno max
2d9f0 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20 20 20  RootPgno;.      
2da00 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2da10 65 47 65 74 4d 65 74 61 28 70 2c 20 34 2c 20 26  eGetMeta(p, 4, &
2da20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20  maxRootPgno);.  
2da30 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2da40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2da50 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
2da60 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ge);.        ret
2da70 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
2da80 0a 20 20 20 20 20 20 69 66 28 20 69 54 61 62 6c  .      if( iTabl
2da90 65 3d 3d 6d 61 78 52 6f 6f 74 50 67 6e 6f 20 29  e==maxRootPgno )
2daa0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
2dab0 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
2dac0 64 72 6f 70 70 65 64 20 69 73 20 74 68 65 20 74  dropped is the t
2dad0 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 6c 61  able with the la
2dae0 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a  rgest root-page.
2daf0 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65          ** numbe
2db00 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  r in the databas
2db10 65 2c 20 70 75 74 20 74 68 65 20 72 6f 6f 74 20  e, put the root 
2db20 70 61 67 65 20 6f 6e 20 74 68 65 20 66 72 65 65  page on the free
2db30 20 6c 69 73 74 2e 20 0a 20 20 20 20 20 20 20 20   list. .        
2db40 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
2db50 66 72 65 65 50 61 67 65 28 70 50 61 67 65 29 3b  freePage(pPage);
2db60 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
2db70 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
2db80 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2db90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2dba0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2dbb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2dbc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
2dbd0 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   The table being
2dbe0 20 64 72 6f 70 70 65 64 20 64 6f 65 73 20 6e 6f   dropped does no
2dbf0 74 20 68 61 76 65 20 74 68 65 20 6c 61 72 67 65  t have the large
2dc00 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20  st root-page.   
2dc10 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 69       ** number i
2dc20 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
2dc30 53 6f 20 6d 6f 76 65 20 74 68 65 20 70 61 67 65  So move the page
2dc40 20 74 68 61 74 20 64 6f 65 73 20 69 6e 74 6f 20   that does into 
2dc50 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
2dc60 67 61 70 20 6c 65 66 74 20 62 79 20 74 68 65 20  gap left by the 
2dc70 64 65 6c 65 74 65 64 20 72 6f 6f 74 2d 70 61 67  deleted root-pag
2dc80 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
2dc90 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
2dca0 4d 6f 76 65 3b 0a 20 20 20 20 20 20 20 20 72 65  Move;.        re
2dcb0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
2dcc0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 67  ;.        rc = g
2dcd0 65 74 50 61 67 65 28 70 42 74 2c 20 6d 61 78 52  etPage(pBt, maxR
2dce0 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f 76 65 29  ootPgno, &pMove)
2dcf0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2dd00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2dd10 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2dd20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
2dd30 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63        rc = reloc
2dd40 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4d 6f  atePage(pBt, pMo
2dd50 76 65 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50  ve, PTRMAP_ROOTP
2dd60 41 47 45 2c 20 30 2c 20 69 54 61 62 6c 65 29 3b  AGE, 0, iTable);
2dd70 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
2dd80 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20  Page(pMove);.   
2dd90 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2dda0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2ddb0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2ddc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ddd0 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70 42   rc = getPage(pB
2dde0 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c 20  t, maxRootPgno, 
2ddf0 26 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20  &pMove);.       
2de00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2de10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2de20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2de30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
2de40 3d 20 66 72 65 65 50 61 67 65 28 70 4d 6f 76 65  = freePage(pMove
2de50 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
2de60 73 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20  sePage(pMove);. 
2de70 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2de80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2de90 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2dea0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2deb0 20 20 20 2a 70 69 4d 6f 76 65 64 20 3d 20 6d 61     *piMoved = ma
2dec0 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20 20  xRootPgno;.     
2ded0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74   }..      /* Set
2dee0 20 74 68 65 20 6e 65 77 20 27 6d 61 78 2d 72 6f   the new 'max-ro
2def0 6f 74 2d 70 61 67 65 27 20 76 61 6c 75 65 20 69  ot-page' value i
2df00 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
2df10 65 61 64 65 72 2e 20 54 68 69 73 0a 20 20 20 20  eader. This.    
2df20 20 20 2a 2a 20 69 73 20 74 68 65 20 6f 6c 64 20    ** is the old 
2df30 76 61 6c 75 65 20 6c 65 73 73 20 6f 6e 65 2c 20  value less one, 
2df40 6c 65 73 73 20 6f 6e 65 20 6d 6f 72 65 20 69 66  less one more if
2df50 20 74 68 61 74 20 68 61 70 70 65 6e 73 20 74 6f   that happens to
2df60 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 61 20 72  .      ** be a r
2df70 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2c  oot-page number,
2df80 20 6c 65 73 73 20 6f 6e 65 20 61 67 61 69 6e 20   less one again 
2df90 69 66 20 74 68 61 74 20 69 73 20 74 68 65 0a 20  if that is the. 
2dfa0 20 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f       ** PENDING_
2dfb0 42 59 54 45 5f 50 41 47 45 2e 0a 20 20 20 20 20  BYTE_PAGE..     
2dfc0 20 2a 2f 0a 20 20 20 20 20 20 6d 61 78 52 6f 6f   */.      maxRoo
2dfd0 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 69  tPgno--;.      i
2dfe0 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d  f( maxRootPgno==
2dff0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
2e000 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
2e010 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b    maxRootPgno--;
2e020 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2e030 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d  f( maxRootPgno==
2e040 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
2e050 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 20  t, maxRootPgno) 
2e060 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 78 52 6f  ){.        maxRo
2e070 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20  otPgno--;.      
2e080 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
2e090 6d 61 78 52 6f 6f 74 50 67 6e 6f 21 3d 50 45 4e  maxRootPgno!=PEN
2e0a0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
2e0b0 42 74 29 20 29 3b 0a 0a 20 20 20 20 20 20 72 63  Bt) );..      rc
2e0c0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 55   = sqlite3BtreeU
2e0d0 70 64 61 74 65 4d 65 74 61 28 70 2c 20 34 2c 20  pdateMeta(p, 4, 
2e0e0 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20  maxRootPgno);.  
2e0f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
2e100 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50 61  c = freePage(pPa
2e110 67 65 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  ge);.      relea
2e120 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
2e130 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 65     }.#endif.  }e
2e140 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 73  lse{.    /* If s
2e150 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54  qlite3BtreeDropT
2e160 61 62 6c 65 20 77 61 73 20 63 61 6c 6c 65 64 20  able was called 
2e170 6f 6e 20 70 61 67 65 20 31 2e 20 2a 2f 0a 20 20  on page 1. */.  
2e180 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65    zeroPage(pPage
2e190 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46  , PTF_INTKEY|PTF
2e1a0 5f 4c 45 41 46 20 29 3b 0a 20 20 20 20 72 65 6c  _LEAF );.    rel
2e1b0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
2e1c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2e1d0 3b 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  ;  .}.../*.** Re
2e1e0 61 64 20 74 68 65 20 6d 65 74 61 2d 69 6e 66 6f  ad the meta-info
2e1f0 72 6d 61 74 69 6f 6e 20 6f 75 74 20 6f 66 20 61  rmation out of a
2e200 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2e210 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69 73 20 74   Meta[0].** is t
2e220 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65  he number of fre
2e230 65 20 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c  e pages currentl
2e240 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
2e250 65 2e 20 20 4d 65 74 61 5b 31 5d 0a 2a 2a 20 74  e.  Meta[1].** t
2e260 68 72 6f 75 67 68 20 6d 65 74 61 5b 31 35 5d 20  hrough meta[15] 
2e270 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  are available fo
2e280 72 20 75 73 65 20 62 79 20 68 69 67 68 65 72 20  r use by higher 
2e290 6c 61 79 65 72 73 2e 20 20 4d 65 74 61 5b 30 5d  layers.  Meta[0]
2e2a0 0a 2a 2a 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79  .** is read-only
2e2b0 2c 20 74 68 65 20 6f 74 68 65 72 73 20 61 72 65  , the others are
2e2c0 20 72 65 61 64 2f 77 72 69 74 65 2e 0a 2a 2a 20   read/write..** 
2e2d0 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20 6c  .** The schema l
2e2e0 61 79 65 72 20 6e 75 6d 62 65 72 73 20 6d 65 74  ayer numbers met
2e2f0 61 20 76 61 6c 75 65 73 20 64 69 66 66 65 72 65  a values differe
2e300 6e 74 6c 79 2e 20 20 41 74 20 74 68 65 20 73 63  ntly.  At the sc
2e310 68 65 6d 61 0a 2a 2a 20 6c 61 79 65 72 20 28 61  hema.** layer (a
2e320 6e 64 20 74 68 65 20 53 65 74 43 6f 6f 6b 69 65  nd the SetCookie
2e330 20 61 6e 64 20 52 65 61 64 43 6f 6f 6b 69 65 20   and ReadCookie 
2e340 6f 70 63 6f 64 65 73 29 20 74 68 65 20 6e 75 6d  opcodes) the num
2e350 62 65 72 20 6f 66 0a 2a 2a 20 66 72 65 65 20 70  ber of.** free p
2e360 61 67 65 73 20 69 73 20 6e 6f 74 20 76 69 73 69  ages is not visi
2e370 62 6c 65 2e 20 20 53 6f 20 43 6f 6f 6b 69 65 5b  ble.  So Cookie[
2e380 30 5d 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  0] is the same a
2e390 73 20 4d 65 74 61 5b 31 5d 2e 0a 2a 2f 0a 69 6e  s Meta[1]..*/.in
2e3a0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
2e3b0 74 4d 65 74 61 28 42 74 72 65 65 20 2a 70 2c 20  tMeta(Btree *p, 
2e3c0 69 6e 74 20 69 64 78 2c 20 75 33 32 20 2a 70 4d  int idx, u32 *pM
2e3d0 65 74 61 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  eta){.  int rc;.
2e3e0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2e3f0 2a 70 50 31 3b 0a 20 20 42 74 53 68 61 72 65 64  *pP1;.  BtShared
2e400 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
2e410 0a 20 20 2f 2a 20 52 65 61 64 69 6e 67 20 61 20  .  /* Reading a 
2e420 6d 65 74 61 2d 64 61 74 61 20 76 61 6c 75 65 20  meta-data value 
2e430 72 65 71 75 69 72 65 73 20 61 20 72 65 61 64 2d  requires a read-
2e440 6c 6f 63 6b 20 6f 6e 20 70 61 67 65 20 31 20 28  lock on page 1 (
2e450 61 6e 64 20 68 65 6e 63 65 0a 20 20 2a 2a 20 74  and hence.  ** t
2e460 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
2e470 20 74 61 62 6c 65 2e 20 57 65 20 67 72 61 62 20   table. We grab 
2e480 74 68 69 73 20 6c 6f 63 6b 20 72 65 67 61 72 64  this lock regard
2e490 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
2e4a0 6f 72 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20  or.  ** not the 
2e4b0 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
2e4c0 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73 20 73  mitted flag is s
2e4d0 65 74 20 28 74 68 65 20 74 61 62 6c 65 20 72 6f  et (the table ro
2e4e0 6f 74 65 64 20 61 74 20 70 61 67 65 0a 20 20 2a  oted at page.  *
2e4f0 2a 20 31 20 69 73 20 74 72 65 61 74 65 64 20 61  * 1 is treated a
2e500 73 20 61 20 73 70 65 63 69 61 6c 20 63 61 73 65  s a special case
2e510 20 62 79 20 71 75 65 72 79 54 61 62 6c 65 4c 6f   by queryTableLo
2e520 63 6b 28 29 20 61 6e 64 20 6c 6f 63 6b 54 61 62  ck() and lockTab
2e530 6c 65 28 29 29 2e 0a 20 20 2a 2f 0a 20 20 72 63  le())..  */.  rc
2e540 20 3d 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63   = queryTableLoc
2e550 6b 28 70 2c 20 31 2c 20 52 45 41 44 5f 4c 4f 43  k(p, 1, READ_LOC
2e560 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  K);.  if( rc!=SQ
2e570 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
2e580 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
2e590 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20   assert( idx>=0 
2e5a0 26 26 20 69 64 78 3c 3d 31 35 20 29 3b 0a 20 20  && idx<=15 );.  
2e5b0 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
2e5c0 72 5f 67 65 74 28 70 42 74 2d 3e 70 50 61 67 65  r_get(pBt->pPage
2e5d0 72 2c 20 31 2c 20 28 76 6f 69 64 2a 2a 29 26 70  r, 1, (void**)&p
2e5e0 50 31 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  P1);.  if( rc ) 
2e5f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4d  return rc;.  *pM
2e600 65 74 61 20 3d 20 67 65 74 34 62 79 74 65 28 26  eta = get4byte(&
2e610 70 50 31 5b 33 36 20 2b 20 69 64 78 2a 34 5d 29  pP1[36 + idx*4])
2e620 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72  ;.  sqlite3pager
2e630 5f 75 6e 72 65 66 28 70 50 31 29 3b 0a 0a 20 20  _unref(pP1);..  
2e640 2f 2a 20 49 66 20 61 75 74 6f 76 61 63 75 75 6d  /* If autovacuum
2e650 65 64 20 69 73 20 64 69 73 61 62 6c 65 64 20 69  ed is disabled i
2e660 6e 20 74 68 69 73 20 62 75 69 6c 64 20 62 75 74  n this build but
2e670 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74   we are trying t
2e680 6f 20 0a 20 20 2a 2a 20 61 63 63 65 73 73 20 61  o .  ** access a
2e690 6e 20 61 75 74 6f 76 61 63 75 75 6d 65 64 20 64  n autovacuumed d
2e6a0 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 6d 61  atabase, then ma
2e6b0 6b 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ke the database 
2e6c0 72 65 61 64 6f 6e 6c 79 2e 20 0a 20 20 2a 2f 0a  readonly. .  */.
2e6d0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
2e6e0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
2e6f0 69 66 28 20 69 64 78 3d 3d 34 20 26 26 20 2a 70  if( idx==4 && *p
2e700 4d 65 74 61 3e 30 20 29 20 70 42 74 2d 3e 72 65  Meta>0 ) pBt->re
2e710 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 23 65 6e 64  adOnly = 1;.#end
2e720 69 66 0a 0a 20 20 2f 2a 20 47 72 61 62 20 74 68  if..  /* Grab th
2e730 65 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70  e read-lock on p
2e740 61 67 65 20 31 2e 20 2a 2f 0a 20 20 72 63 20 3d  age 1. */.  rc =
2e750 20 6c 6f 63 6b 54 61 62 6c 65 28 70 2c 20 31 2c   lockTable(p, 1,
2e760 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 72   READ_LOCK);.  r
2e770 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2e780 2a 2a 20 57 72 69 74 65 20 6d 65 74 61 2d 69 6e  ** Write meta-in
2e790 66 6f 72 6d 61 74 69 6f 6e 20 62 61 63 6b 20 69  formation back i
2e7a0 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
2e7b0 2e 20 20 4d 65 74 61 5b 30 5d 20 69 73 0a 2a 2a  .  Meta[0] is.**
2e7c0 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 6d   read-only and m
2e7d0 61 79 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65  ay not be writte
2e7e0 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
2e7f0 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61  3BtreeUpdateMeta
2e800 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69  (Btree *p, int i
2e810 64 78 2c 20 75 33 32 20 69 4d 65 74 61 29 7b 0a  dx, u32 iMeta){.
2e820 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2e830 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75 6e 73 69  = p->pBt;.  unsi
2e840 67 6e 65 64 20 63 68 61 72 20 2a 70 50 31 3b 0a  gned char *pP1;.
2e850 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
2e860 72 74 28 20 69 64 78 3e 3d 31 20 26 26 20 69 64  rt( idx>=1 && id
2e870 78 3c 3d 31 35 20 29 3b 0a 20 20 69 66 28 20 70  x<=15 );.  if( p
2e880 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
2e890 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72 65  _WRITE ){.    re
2e8a0 74 75 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e  turn pBt->readOn
2e8b0 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44  ly ? SQLITE_READ
2e8c0 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52  ONLY : SQLITE_ER
2e8d0 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ROR;.  }.  asser
2e8e0 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d  t( pBt->pPage1!=
2e8f0 30 20 29 3b 0a 20 20 70 50 31 20 3d 20 70 42 74  0 );.  pP1 = pBt
2e900 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b  ->pPage1->aData;
2e910 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70  .  rc = sqlite3p
2e920 61 67 65 72 5f 77 72 69 74 65 28 70 50 31 29 3b  ager_write(pP1);
2e930 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
2e940 72 6e 20 72 63 3b 0a 20 20 70 75 74 34 62 79 74  rn rc;.  put4byt
2e950 65 28 26 70 50 31 5b 33 36 20 2b 20 69 64 78 2a  e(&pP1[36 + idx*
2e960 34 5d 2c 20 69 4d 65 74 61 29 3b 0a 20 20 72 65  4], iMeta);.  re
2e970 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2e980 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2e990 74 68 65 20 66 6c 61 67 20 62 79 74 65 20 61 74  the flag byte at
2e9a0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
2e9b0 66 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20  f the page that 
2e9c0 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73  the cursor.** is
2e9d0 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
2e9e0 69 6e 67 20 74 6f 2e 0a 2a 2f 0a 69 6e 74 20 73  ing to..*/.int s
2e9f0 71 6c 69 74 65 33 42 74 72 65 65 46 6c 61 67 73  qlite3BtreeFlags
2ea00 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
2ea10 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61  {.  /* TODO: Wha
2ea20 74 20 61 62 6f 75 74 20 43 55 52 53 4f 52 5f 52  t about CURSOR_R
2ea30 45 51 55 49 52 45 53 45 45 4b 20 73 74 61 74 65  EQUIRESEEK state
2ea40 3f 20 50 72 6f 62 61 62 6c 79 20 6e 65 65 64 20  ? Probably need 
2ea50 74 6f 20 63 61 6c 6c 0a 20 20 2a 2a 20 72 65 73  to call.  ** res
2ea60 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f  toreOrClearCurso
2ea70 72 50 6f 73 69 74 69 6f 6e 28 29 20 68 65 72 65  rPosition() here
2ea80 2e 0a 20 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ..  */.  MemPage
2ea90 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
2eaa0 70 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20  pPage;.  return 
2eab0 70 50 61 67 65 20 3f 20 70 50 61 67 65 2d 3e 61  pPage ? pPage->a
2eac0 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
2ead0 66 66 73 65 74 5d 20 3a 20 30 3b 0a 7d 0a 0a 23  ffset] : 0;.}..#
2eae0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2eaf0 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  UG./*.** Print a
2eb00 20 64 69 73 61 73 73 65 6d 62 6c 79 20 6f 66 20   disassembly of 
2eb10 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 6f  the given page o
2eb20 6e 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75  n standard outpu
2eb30 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
2eb40 0a 2a 2a 20 69 73 20 75 73 65 64 20 66 6f 72 20  .** is used for 
2eb50 64 65 62 75 67 67 69 6e 67 20 61 6e 64 20 74 65  debugging and te
2eb60 73 74 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73  sting only..*/.s
2eb70 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 50  tatic int btreeP
2eb80 61 67 65 44 75 6d 70 28 42 74 53 68 61 72 65 64  ageDump(BtShared
2eb90 20 2a 70 42 74 2c 20 69 6e 74 20 70 67 6e 6f 2c   *pBt, int pgno,
2eba0 20 69 6e 74 20 72 65 63 75 72 73 69 76 65 2c 20   int recursive, 
2ebb0 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
2ebc0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
2ebd0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
2ebe0 20 69 6e 74 20 69 2c 20 6a 2c 20 63 3b 0a 20 20   int i, j, c;.  
2ebf0 69 6e 74 20 6e 46 72 65 65 3b 0a 20 20 75 31 36  int nFree;.  u16
2ec00 20 69 64 78 3b 0a 20 20 69 6e 74 20 68 64 72 3b   idx;.  int hdr;
2ec10 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20  .  int nCell;.  
2ec20 69 6e 74 20 69 73 49 6e 69 74 3b 0a 20 20 75 6e  int isInit;.  un
2ec30 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
2ec40 61 3b 0a 20 20 63 68 61 72 20 72 61 6e 67 65 5b  a;.  char range[
2ec50 32 30 5d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  20];.  unsigned 
2ec60 63 68 61 72 20 70 61 79 6c 6f 61 64 5b 32 30 5d  char payload[20]
2ec70 3b 0a 0a 20 20 72 63 20 3d 20 67 65 74 50 61 67  ;..  rc = getPag
2ec80 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 70 67 6e  e(pBt, (Pgno)pgn
2ec90 6f 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 69 73  o, &pPage);.  is
2eca0 49 6e 69 74 20 3d 20 70 50 61 67 65 2d 3e 69 73  Init = pPage->is
2ecb0 49 6e 69 74 3b 0a 20 20 69 66 28 20 70 50 61 67  Init;.  if( pPag
2ecc0 65 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b 0a  e->isInit==0 ){.
2ecd0 20 20 20 20 69 6e 69 74 50 61 67 65 28 70 50 61      initPage(pPa
2ece0 67 65 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20  ge, pParent);.  
2ecf0 7d 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  }.  if( rc ){.  
2ed00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
2ed10 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
2ed20 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 64 61 74  hdrOffset;.  dat
2ed30 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
2ed40 3b 0a 20 20 63 20 3d 20 64 61 74 61 5b 68 64 72  ;.  c = data[hdr
2ed50 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ];.  pPage->intK
2ed60 65 79 20 3d 20 28 63 20 26 20 28 50 54 46 5f 49  ey = (c & (PTF_I
2ed70 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41  NTKEY|PTF_LEAFDA
2ed80 54 41 29 29 21 3d 30 3b 0a 20 20 70 50 61 67 65  TA))!=0;.  pPage
2ed90 2d 3e 7a 65 72 6f 44 61 74 61 20 3d 20 28 63 20  ->zeroData = (c 
2eda0 26 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 29 21  & PTF_ZERODATA)!
2edb0 3d 30 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61  =0;.  pPage->lea
2edc0 66 44 61 74 61 20 3d 20 28 63 20 26 20 50 54 46  fData = (c & PTF
2edd0 5f 4c 45 41 46 44 41 54 41 29 21 3d 30 3b 0a 20  _LEAFDATA)!=0;. 
2ede0 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28   pPage->leaf = (
2edf0 63 20 26 20 50 54 46 5f 4c 45 41 46 29 21 3d 30  c & PTF_LEAF)!=0
2ee00 3b 0a 20 20 70 50 61 67 65 2d 3e 68 61 73 44 61  ;.  pPage->hasDa
2ee10 74 61 20 3d 20 21 28 70 50 61 67 65 2d 3e 7a 65  ta = !(pPage->ze
2ee20 72 6f 44 61 74 61 20 7c 7c 20 28 21 70 50 61 67  roData || (!pPag
2ee30 65 2d 3e 6c 65 61 66 20 26 26 20 70 50 61 67 65  e->leaf && pPage
2ee40 2d 3e 6c 65 61 66 44 61 74 61 29 29 3b 0a 20 20  ->leafData));.  
2ee50 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65  nCell = get2byte
2ee60 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a  (&data[hdr+3]);.
2ee70 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
2ee80 69 6e 74 66 28 22 50 41 47 45 20 25 64 3a 20 20  intf("PAGE %d:  
2ee90 66 6c 61 67 73 3d 30 78 25 30 32 78 20 20 66 72  flags=0x%02x  fr
2eea0 61 67 3d 25 64 20 20 20 70 61 72 65 6e 74 3d 25  ag=%d   parent=%
2eeb0 64 5c 6e 22 2c 20 70 67 6e 6f 2c 0a 20 20 20 20  d\n", pgno,.    
2eec0 64 61 74 61 5b 68 64 72 5d 2c 20 64 61 74 61 5b  data[hdr], data[
2eed0 68 64 72 2b 37 5d 2c 20 0a 20 20 20 20 28 70 50  hdr+7], .    (pP
2eee0 61 67 65 2d 3e 69 73 49 6e 69 74 20 26 26 20 70  age->isInit && p
2eef0 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 29 20 3f  Page->pParent) ?
2ef00 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 2d   pPage->pParent-
2ef10 3e 70 67 6e 6f 20 3a 20 30 29 3b 0a 20 20 61 73  >pgno : 0);.  as
2ef20 73 65 72 74 28 20 68 64 72 20 3d 3d 20 28 70 67  sert( hdr == (pg
2ef30 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29  no==1 ? 100 : 0)
2ef40 20 29 3b 0a 20 20 69 64 78 20 3d 20 68 64 72 20   );.  idx = hdr 
2ef50 2b 20 31 32 20 2d 20 70 50 61 67 65 2d 3e 6c 65  + 12 - pPage->le
2ef60 61 66 2a 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  af*4;.  for(i=0;
2ef70 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
2ef80 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
2ef90 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  o;.    Pgno chil
2efa0 64 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  d;.    unsigned 
2efb0 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20 20  char *pCell;.   
2efc0 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20 69 6e 74   int sz;.    int
2efd0 20 61 64 64 72 3b 0a 0a 20 20 20 20 61 64 64 72   addr;..    addr
2efe0 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
2eff0 61 5b 69 64 78 20 2b 20 32 2a 69 5d 29 3b 0a 20  a[idx + 2*i]);. 
2f000 20 20 20 70 43 65 6c 6c 20 3d 20 26 64 61 74 61     pCell = &data
2f010 5b 61 64 64 72 5d 3b 0a 20 20 20 20 70 61 72 73  [addr];.    pars
2f020 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
2f030 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
2f040 20 20 20 73 7a 20 3d 20 69 6e 66 6f 2e 6e 53 69     sz = info.nSi
2f050 7a 65 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28  ze;.    sprintf(
2f060 72 61 6e 67 65 2c 22 25 64 2e 2e 25 64 22 2c 20  range,"%d..%d", 
2f070 61 64 64 72 2c 20 61 64 64 72 2b 73 7a 2d 31 29  addr, addr+sz-1)
2f080 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
2f090 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 63  >leaf ){.      c
2f0a0 68 69 6c 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65  hild = 0;.    }e
2f0b0 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 69 6c 64  lse{.      child
2f0c0 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c   = get4byte(pCel
2f0d0 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a  l);.    }.    sz
2f0e0 20 3d 20 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20   = info.nData;. 
2f0f0 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69     if( !pPage->i
2f100 6e 74 4b 65 79 20 29 20 73 7a 20 2b 3d 20 69 6e  ntKey ) sz += in
2f110 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 69 66 28  fo.nKey;.    if(
2f120 20 73 7a 3e 73 69 7a 65 6f 66 28 70 61 79 6c 6f   sz>sizeof(paylo
2f130 61 64 29 2d 31 20 29 20 73 7a 20 3d 20 73 69 7a  ad)-1 ) sz = siz
2f140 65 6f 66 28 70 61 79 6c 6f 61 64 29 2d 31 3b 0a  eof(payload)-1;.
2f150 20 20 20 20 6d 65 6d 63 70 79 28 70 61 79 6c 6f      memcpy(paylo
2f160 61 64 2c 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  ad, &pCell[info.
2f170 6e 48 65 61 64 65 72 5d 2c 20 73 7a 29 3b 0a 20  nHeader], sz);. 
2f180 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 7a     for(j=0; j<sz
2f190 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
2f1a0 28 20 70 61 79 6c 6f 61 64 5b 6a 5d 3c 30 78 32  ( payload[j]<0x2
2f1b0 30 20 7c 7c 20 70 61 79 6c 6f 61 64 5b 6a 5d 3e  0 || payload[j]>
2f1c0 30 78 37 66 20 29 20 70 61 79 6c 6f 61 64 5b 6a  0x7f ) payload[j
2f1d0 5d 20 3d 20 27 2e 27 3b 0a 20 20 20 20 7d 0a 20  ] = '.';.    }. 
2f1e0 20 20 20 70 61 79 6c 6f 61 64 5b 73 7a 5d 20 3d     payload[sz] =
2f1f0 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   0;.    sqlite3D
2f200 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20  ebugPrintf(.    
2f210 20 20 22 63 65 6c 6c 20 25 32 64 3a 20 69 3d 25    "cell %2d: i=%
2f220 2d 31 30 73 20 63 68 6c 64 3d 25 2d 34 64 20 6e  -10s chld=%-4d n
2f230 6b 3d 25 2d 34 6c 6c 64 20 6e 64 3d 25 2d 34 64  k=%-4lld nd=%-4d
2f240 20 70 61 79 6c 6f 61 64 3d 25 73 5c 6e 22 2c 0a   payload=%s\n",.
2f250 20 20 20 20 20 20 69 2c 20 72 61 6e 67 65 2c 20        i, range, 
2f260 63 68 69 6c 64 2c 20 69 6e 66 6f 2e 6e 4b 65 79  child, info.nKey
2f270 2c 20 69 6e 66 6f 2e 6e 44 61 74 61 2c 20 70 61  , info.nData, pa
2f280 79 6c 6f 61 64 0a 20 20 20 20 29 3b 0a 20 20 7d  yload.    );.  }
2f290 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
2f2a0 65 61 66 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  eaf ){.    sqlit
2f2b0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 72  e3DebugPrintf("r
2f2c0 69 67 68 74 5f 63 68 69 6c 64 3a 20 25 64 5c 6e  ight_child: %d\n
2f2d0 22 2c 20 67 65 74 34 62 79 74 65 28 26 64 61 74  ", get4byte(&dat
2f2e0 61 5b 68 64 72 2b 38 5d 29 29 3b 0a 20 20 7d 0a  a[hdr+8]));.  }.
2f2f0 20 20 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20 69    nFree = 0;.  i
2f300 20 3d 20 30 3b 0a 20 20 69 64 78 20 3d 20 67 65   = 0;.  idx = ge
2f310 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
2f320 2b 31 5d 29 3b 0a 20 20 77 68 69 6c 65 28 20 69  +1]);.  while( i
2f330 64 78 3e 30 20 26 26 20 69 64 78 3c 70 50 61 67  dx>0 && idx<pPag
2f340 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
2f350 7a 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a  ze ){.    int sz
2f360 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
2f370 61 5b 69 64 78 2b 32 5d 29 3b 0a 20 20 20 20 73  a[idx+2]);.    s
2f380 70 72 69 6e 74 66 28 72 61 6e 67 65 2c 22 25 64  printf(range,"%d
2f390 2e 2e 25 64 22 2c 20 69 64 78 2c 20 69 64 78 2b  ..%d", idx, idx+
2f3a0 73 7a 2d 31 29 3b 0a 20 20 20 20 6e 46 72 65 65  sz-1);.    nFree
2f3b0 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 73 71 6c 69   += sz;.    sqli
2f3c0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
2f3d0 66 72 65 65 62 6c 6f 63 6b 20 25 32 64 3a 20 69  freeblock %2d: i
2f3e0 3d 25 2d 31 30 73 20 73 69 7a 65 3d 25 2d 34 64  =%-10s size=%-4d
2f3f0 20 74 6f 74 61 6c 3d 25 64 5c 6e 22 2c 0a 20 20   total=%d\n",.  
2f400 20 20 20 20 20 69 2c 20 72 61 6e 67 65 2c 20 73       i, range, s
2f410 7a 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20 20 69  z, nFree);.    i
2f420 64 78 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  dx = get2byte(&d
2f430 61 74 61 5b 69 64 78 5d 29 3b 0a 20 20 20 20 69  ata[idx]);.    i
2f440 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 64  ++;.  }.  if( id
2f450 78 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  x!=0 ){.    sqli
2f460 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
2f470 45 52 52 4f 52 3a 20 6e 65 78 74 20 66 72 65 65  ERROR: next free
2f480 62 6c 6f 63 6b 20 69 6e 64 65 78 20 6f 75 74 20  block index out 
2f490 6f 66 20 72 61 6e 67 65 3a 20 25 64 5c 6e 22 2c  of range: %d\n",
2f4a0 20 69 64 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28   idx);.  }.  if(
2f4b0 20 72 65 63 75 72 73 69 76 65 20 26 26 20 21 70   recursive && !p
2f4c0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2f4d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
2f4e0 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
2f4f0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
2f500 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
2f510 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20  pPage, i);.     
2f520 20 62 74 72 65 65 50 61 67 65 44 75 6d 70 28 70   btreePageDump(p
2f530 42 74 2c 20 67 65 74 34 62 79 74 65 28 70 43 65  Bt, get4byte(pCe
2f540 6c 6c 29 2c 20 31 2c 20 70 50 61 67 65 29 3b 0a  ll), 1, pPage);.
2f550 20 20 20 20 20 20 69 64 78 20 3d 20 67 65 74 32        idx = get2
2f560 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20  byte(pCell);.   
2f570 20 7d 0a 20 20 20 20 62 74 72 65 65 50 61 67 65   }.    btreePage
2f580 44 75 6d 70 28 70 42 74 2c 20 67 65 74 34 62 79  Dump(pBt, get4by
2f590 74 65 28 26 64 61 74 61 5b 68 64 72 2b 38 5d 29  te(&data[hdr+8])
2f5a0 2c 20 31 2c 20 70 50 61 67 65 29 3b 0a 20 20 7d  , 1, pPage);.  }
2f5b0 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  .  pPage->isInit
2f5c0 20 3d 20 69 73 49 6e 69 74 3b 0a 20 20 73 71 6c   = isInit;.  sql
2f5d0 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28  ite3pager_unref(
2f5e0 64 61 74 61 29 3b 0a 20 20 66 66 6c 75 73 68 28  data);.  fflush(
2f5f0 73 74 64 6f 75 74 29 3b 0a 20 20 72 65 74 75 72  stdout);.  retur
2f600 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69  n SQLITE_OK;.}.i
2f610 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  nt sqlite3BtreeP
2f620 61 67 65 44 75 6d 70 28 42 74 72 65 65 20 2a 70  ageDump(Btree *p
2f630 2c 20 69 6e 74 20 70 67 6e 6f 2c 20 69 6e 74 20  , int pgno, int 
2f640 72 65 63 75 72 73 69 76 65 29 7b 0a 20 20 72 65  recursive){.  re
2f650 74 75 72 6e 20 62 74 72 65 65 50 61 67 65 44 75  turn btreePageDu
2f660 6d 70 28 70 2d 3e 70 42 74 2c 20 70 67 6e 6f 2c  mp(p->pBt, pgno,
2f670 20 72 65 63 75 72 73 69 76 65 2c 20 30 29 3b 0a   recursive, 0);.
2f680 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65  }.#endif..#if de
2f690 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
2f6a0 54 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  T) && defined(SQ
2f6b0 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a  LITE_DEBUG)./*.*
2f6c0 2a 20 46 69 6c 6c 20 61 52 65 73 75 6c 74 5b 5d  * Fill aResult[]
2f6d0 20 77 69 74 68 20 69 6e 66 6f 72 6d 61 74 69 6f   with informatio
2f6e0 6e 20 61 62 6f 75 74 20 74 68 65 20 65 6e 74 72  n about the entr
2f6f0 79 20 61 6e 64 20 70 61 67 65 20 74 68 61 74 20  y and page that 
2f700 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 69 73  the.** cursor is
2f710 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2a   pointing to..**
2f720 20 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 30   .**   aResult[0
2f730 5d 20 3d 20 20 54 68 65 20 70 61 67 65 20 6e 75  ] =  The page nu
2f740 6d 62 65 72 0a 2a 2a 20 20 20 61 52 65 73 75 6c  mber.**   aResul
2f750 74 5b 31 5d 20 3d 20 20 54 68 65 20 65 6e 74 72  t[1] =  The entr
2f760 79 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 61 52  y number.**   aR
2f770 65 73 75 6c 74 5b 32 5d 20 3d 20 20 54 6f 74 61  esult[2] =  Tota
2f780 6c 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  l number of entr
2f790 69 65 73 20 6f 6e 20 74 68 69 73 20 70 61 67 65  ies on this page
2f7a0 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 33 5d  .**   aResult[3]
2f7b0 20 3d 20 20 43 65 6c 6c 20 73 69 7a 65 20 28 6c   =  Cell size (l
2f7c0 6f 63 61 6c 20 70 61 79 6c 6f 61 64 20 2b 20 68  ocal payload + h
2f7d0 65 61 64 65 72 29 0a 2a 2a 20 20 20 61 52 65 73  eader).**   aRes
2f7e0 75 6c 74 5b 34 5d 20 3d 20 20 4e 75 6d 62 65 72  ult[4] =  Number
2f7f0 20 6f 66 20 66 72 65 65 20 62 79 74 65 73 20 6f   of free bytes o
2f800 6e 20 74 68 69 73 20 70 61 67 65 0a 2a 2a 20 20  n this page.**  
2f810 20 61 52 65 73 75 6c 74 5b 35 5d 20 3d 20 20 4e   aResult[5] =  N
2f820 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62 6c  umber of free bl
2f830 6f 63 6b 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ocks on the page
2f840 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 36 5d  .**   aResult[6]
2f850 20 3d 20 20 54 6f 74 61 6c 20 70 61 79 6c 6f 61   =  Total payloa
2f860 64 20 73 69 7a 65 20 28 6c 6f 63 61 6c 20 2b 20  d size (local + 
2f870 6f 76 65 72 66 6c 6f 77 29 0a 2a 2a 20 20 20 61  overflow).**   a
2f880 52 65 73 75 6c 74 5b 37 5d 20 3d 20 20 48 65 61  Result[7] =  Hea
2f890 64 65 72 20 73 69 7a 65 20 69 6e 20 62 79 74 65  der size in byte
2f8a0 73 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 38  s.**   aResult[8
2f8b0 5d 20 3d 20 20 4c 6f 63 61 6c 20 70 61 79 6c 6f  ] =  Local paylo
2f8c0 61 64 20 73 69 7a 65 0a 2a 2a 20 20 20 61 52 65  ad size.**   aRe
2f8d0 73 75 6c 74 5b 39 5d 20 3d 20 20 50 61 72 65 6e  sult[9] =  Paren
2f8e0 74 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 2a 2a  t page number.**
2f8f0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2f900 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
2f910 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69  ting and debuggi
2f920 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20  ng only..*/.int 
2f930 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
2f940 6f 72 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20  orInfo(BtCursor 
2f950 2a 70 43 75 72 2c 20 69 6e 74 20 2a 61 52 65 73  *pCur, int *aRes
2f960 75 6c 74 2c 20 69 6e 74 20 75 70 43 6e 74 29 7b  ult, int upCnt){
2f970 0a 20 20 69 6e 74 20 63 6e 74 2c 20 69 64 78 3b  .  int cnt, idx;
2f980 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2f990 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
2f9a0 0a 20 20 42 74 43 75 72 73 6f 72 20 74 6d 70 43  .  BtCursor tmpC
2f9b0 75 72 3b 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20  ur;..  int rc = 
2f9c0 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75  restoreOrClearCu
2f9d0 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
2f9e0 72 2c 20 31 29 3b 0a 20 20 69 66 28 20 72 63 21  r, 1);.  if( rc!
2f9f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2fa00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
2fa10 0a 0a 20 20 70 61 67 65 49 6e 74 65 67 72 69 74  ..  pageIntegrit
2fa20 79 28 70 50 61 67 65 29 3b 0a 20 20 61 73 73 65  y(pPage);.  asse
2fa30 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
2fa40 74 20 29 3b 0a 20 20 67 65 74 54 65 6d 70 43 75  t );.  getTempCu
2fa50 72 73 6f 72 28 70 43 75 72 2c 20 26 74 6d 70 43  rsor(pCur, &tmpC
2fa60 75 72 29 3b 0a 20 20 77 68 69 6c 65 28 20 75 70  ur);.  while( up
2fa70 43 6e 74 2d 2d 20 29 7b 0a 20 20 20 20 6d 6f 76  Cnt-- ){.    mov
2fa80 65 54 6f 50 61 72 65 6e 74 28 26 74 6d 70 43 75  eToParent(&tmpCu
2fa90 72 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 20  r);.  }.  pPage 
2faa0 3d 20 74 6d 70 43 75 72 2e 70 50 61 67 65 3b 0a  = tmpCur.pPage;.
2fab0 20 20 70 61 67 65 49 6e 74 65 67 72 69 74 79 28    pageIntegrity(
2fac0 70 50 61 67 65 29 3b 0a 20 20 61 52 65 73 75 6c  pPage);.  aResul
2fad0 74 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 70 61  t[0] = sqlite3pa
2fae0 67 65 72 5f 70 61 67 65 6e 75 6d 62 65 72 28 70  ger_pagenumber(p
2faf0 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20  Page->aData);.  
2fb00 61 73 73 65 72 74 28 20 61 52 65 73 75 6c 74 5b  assert( aResult[
2fb10 30 5d 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20  0]==pPage->pgno 
2fb20 29 3b 0a 20 20 61 52 65 73 75 6c 74 5b 31 5d 20  );.  aResult[1] 
2fb30 3d 20 74 6d 70 43 75 72 2e 69 64 78 3b 0a 20 20  = tmpCur.idx;.  
2fb40 61 52 65 73 75 6c 74 5b 32 5d 20 3d 20 70 50 61  aResult[2] = pPa
2fb50 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 66 28  ge->nCell;.  if(
2fb60 20 74 6d 70 43 75 72 2e 69 64 78 3e 3d 30 20 26   tmpCur.idx>=0 &
2fb70 26 20 74 6d 70 43 75 72 2e 69 64 78 3c 70 50 61  & tmpCur.idx<pPa
2fb80 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
2fb90 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 26 74 6d   getCellInfo(&tm
2fba0 70 43 75 72 29 3b 0a 20 20 20 20 61 52 65 73 75  pCur);.    aResu
2fbb0 6c 74 5b 33 5d 20 3d 20 74 6d 70 43 75 72 2e 69  lt[3] = tmpCur.i
2fbc0 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 20 20 61  nfo.nSize;.    a
2fbd0 52 65 73 75 6c 74 5b 36 5d 20 3d 20 74 6d 70 43  Result[6] = tmpC
2fbe0 75 72 2e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20  ur.info.nData;. 
2fbf0 20 20 20 61 52 65 73 75 6c 74 5b 37 5d 20 3d 20     aResult[7] = 
2fc00 74 6d 70 43 75 72 2e 69 6e 66 6f 2e 6e 48 65 61  tmpCur.info.nHea
2fc10 64 65 72 3b 0a 20 20 20 20 61 52 65 73 75 6c 74  der;.    aResult
2fc20 5b 38 5d 20 3d 20 74 6d 70 43 75 72 2e 69 6e 66  [8] = tmpCur.inf
2fc30 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73  o.nLocal;.  }els
2fc40 65 7b 0a 20 20 20 20 61 52 65 73 75 6c 74 5b 33  e{.    aResult[3
2fc50 5d 20 3d 20 30 3b 0a 20 20 20 20 61 52 65 73 75  ] = 0;.    aResu
2fc60 6c 74 5b 36 5d 20 3d 20 30 3b 0a 20 20 20 20 61  lt[6] = 0;.    a
2fc70 52 65 73 75 6c 74 5b 37 5d 20 3d 20 30 3b 0a 20  Result[7] = 0;. 
2fc80 20 20 20 61 52 65 73 75 6c 74 5b 38 5d 20 3d 20     aResult[8] = 
2fc90 30 3b 0a 20 20 7d 0a 20 20 61 52 65 73 75 6c 74  0;.  }.  aResult
2fca0 5b 34 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 46 72  [4] = pPage->nFr
2fcb0 65 65 3b 0a 20 20 63 6e 74 20 3d 20 30 3b 0a 20  ee;.  cnt = 0;. 
2fcc0 20 69 64 78 20 3d 20 67 65 74 32 62 79 74 65 28   idx = get2byte(
2fcd0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
2fce0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 31  age->hdrOffset+1
2fcf0 5d 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78  ]);.  while( idx
2fd00 3e 30 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d  >0 && idx<pPage-
2fd10 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
2fd20 20 29 7b 0a 20 20 20 20 63 6e 74 2b 2b 3b 0a 20   ){.    cnt++;. 
2fd30 20 20 20 69 64 78 20 3d 20 67 65 74 32 62 79 74     idx = get2byt
2fd40 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
2fd50 69 64 78 5d 29 3b 0a 20 20 7d 0a 20 20 61 52 65  idx]);.  }.  aRe
2fd60 73 75 6c 74 5b 35 5d 20 3d 20 63 6e 74 3b 0a 20  sult[5] = cnt;. 
2fd70 20 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61 72   if( pPage->pPar
2fd80 65 6e 74 3d 3d 30 20 7c 7c 20 69 73 52 6f 6f 74  ent==0 || isRoot
2fd90 50 61 67 65 28 70 50 61 67 65 29 20 29 7b 0a 20  Page(pPage) ){. 
2fda0 20 20 20 61 52 65 73 75 6c 74 5b 39 5d 20 3d 20     aResult[9] = 
2fdb0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
2fdc0 61 52 65 73 75 6c 74 5b 39 5d 20 3d 20 70 50 61  aResult[9] = pPa
2fdd0 67 65 2d 3e 70 50 61 72 65 6e 74 2d 3e 70 67 6e  ge->pParent->pgn
2fde0 6f 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  o;.  }.  release
2fdf0 54 65 6d 70 43 75 72 73 6f 72 28 26 74 6d 70 43  TempCursor(&tmpC
2fe00 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ur);.  return SQ
2fe10 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
2fe20 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
2fe30 74 68 65 20 70 61 67 65 72 20 61 73 73 6f 63 69  the pager associ
2fe40 61 74 65 64 20 77 69 74 68 20 61 20 42 54 72 65  ated with a BTre
2fe50 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
2fe60 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20   is used for.** 
2fe70 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75  testing and debu
2fe80 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 50  gging only..*/.P
2fe90 61 67 65 72 20 2a 73 71 6c 69 74 65 33 42 74 72  ager *sqlite3Btr
2fea0 65 65 50 61 67 65 72 28 42 74 72 65 65 20 2a 70  eePager(Btree *p
2feb0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70  ){.  return p->p
2fec0 42 74 2d 3e 70 50 61 67 65 72 3b 0a 7d 0a 0a 2f  Bt->pPager;.}../
2fed0 2a 0a 2a 2a 20 54 68 69 73 20 73 74 72 75 63 74  *.** This struct
2fee0 75 72 65 20 69 73 20 70 61 73 73 65 64 20 61 72  ure is passed ar
2fef0 6f 75 6e 64 20 74 68 72 6f 75 67 68 20 61 6c 6c  ound through all
2ff00 20 74 68 65 20 73 61 6e 69 74 79 20 63 68 65 63   the sanity chec
2ff10 6b 69 6e 67 20 72 6f 75 74 69 6e 65 73 0a 2a 2a  king routines.**
2ff20 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65   in order to kee
2ff30 70 20 74 72 61 63 6b 20 6f 66 20 73 6f 6d 65 20  p track of some 
2ff40 67 6c 6f 62 61 6c 20 73 74 61 74 65 20 69 6e 66  global state inf
2ff50 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70  ormation..*/.typ
2ff60 65 64 65 66 20 73 74 72 75 63 74 20 49 6e 74 65  edef struct Inte
2ff70 67 72 69 74 79 43 6b 20 49 6e 74 65 67 72 69 74  grityCk Integrit
2ff80 79 43 6b 3b 0a 73 74 72 75 63 74 20 49 6e 74 65  yCk;.struct Inte
2ff90 67 72 69 74 79 43 6b 20 7b 0a 20 20 42 74 53 68  grityCk {.  BtSh
2ffa0 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 2f 2a  ared *pBt;    /*
2ffb0 20 54 68 65 20 74 72 65 65 20 62 65 69 6e 67 20   The tree being 
2ffc0 63 68 65 63 6b 65 64 20 6f 75 74 20 2a 2f 0a 20  checked out */. 
2ffd0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20   Pager *pPager; 
2ffe0 2f 2a 20 54 68 65 20 61 73 73 6f 63 69 61 74 65  /* The associate
2fff0 64 20 70 61 67 65 72 2e 20 20 41 6c 73 6f 20 61  d pager.  Also a
30000 63 63 65 73 73 69 62 6c 65 20 62 79 20 70 42 74  ccessible by pBt
30010 2d 3e 70 50 61 67 65 72 20 2a 2f 0a 20 20 69 6e  ->pPager */.  in
30020 74 20 6e 50 61 67 65 3b 20 20 20 20 20 2f 2a 20  t nPage;     /* 
30030 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
30040 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
30050 2a 2f 0a 20 20 69 6e 74 20 2a 61 6e 52 65 66 3b  */.  int *anRef;
30060 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
30070 20 74 69 6d 65 73 20 65 61 63 68 20 70 61 67 65   times each page
30080 20 69 73 20 72 65 66 65 72 65 6e 63 65 64 20 2a   is referenced *
30090 2f 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  /.  char *zErrMs
300a0 67 3b 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 6d  g; /* An error m
300b0 65 73 73 61 67 65 2e 20 20 4e 55 4c 4c 20 6f 66  essage.  NULL of
300c0 20 6e 6f 20 65 72 72 6f 72 73 20 73 65 65 6e 2e   no errors seen.
300d0 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66 20   */.};..#ifndef 
300e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45  SQLITE_OMIT_INTE
300f0 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a  GRITY_CHECK./*.*
30100 2a 20 41 70 70 65 6e 64 20 61 20 6d 65 73 73 61  * Append a messa
30110 67 65 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20  ge to the error 
30120 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67 2e 0a  message string..
30130 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
30140 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 0a 20  heckAppendMsg(. 
30150 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43   IntegrityCk *pC
30160 68 65 63 6b 2c 0a 20 20 63 68 61 72 20 2a 7a 4d  heck,.  char *zM
30170 73 67 31 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  sg1,.  const cha
30180 72 20 2a 7a 46 6f 72 6d 61 74 2c 0a 20 20 2e 2e  r *zFormat,.  ..
30190 2e 0a 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
301a0 70 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 32  p;.  char *zMsg2
301b0 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ;.  va_start(ap,
301c0 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 4d 73   zFormat);.  zMs
301d0 67 32 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72  g2 = sqlite3VMPr
301e0 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70  intf(zFormat, ap
301f0 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  );.  va_end(ap);
30200 0a 20 20 69 66 28 20 7a 4d 73 67 31 3d 3d 30 20  .  if( zMsg1==0 
30210 29 20 7a 4d 73 67 31 20 3d 20 22 22 3b 0a 20 20  ) zMsg1 = "";.  
30220 69 66 28 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72  if( pCheck->zErr
30230 4d 73 67 20 29 7b 0a 20 20 20 20 63 68 61 72 20  Msg ){.    char 
30240 2a 7a 4f 6c 64 20 3d 20 70 43 68 65 63 6b 2d 3e  *zOld = pCheck->
30250 7a 45 72 72 4d 73 67 3b 0a 20 20 20 20 70 43 68  zErrMsg;.    pCh
30260 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30  eck->zErrMsg = 0
30270 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74  ;.    sqlite3Set
30280 53 74 72 69 6e 67 28 26 70 43 68 65 63 6b 2d 3e  String(&pCheck->
30290 7a 45 72 72 4d 73 67 2c 20 7a 4f 6c 64 2c 20 22  zErrMsg, zOld, "
302a0 5c 6e 22 2c 20 7a 4d 73 67 31 2c 20 7a 4d 73 67  \n", zMsg1, zMsg
302b0 32 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  2, (char*)0);.  
302c0 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4f 6c    sqliteFree(zOl
302d0 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  d);.  }else{.   
302e0 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
302f0 67 28 26 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d  g(&pCheck->zErrM
30300 73 67 2c 20 7a 4d 73 67 31 2c 20 7a 4d 73 67 32  sg, zMsg1, zMsg2
30310 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 7d  , (char*)0);.  }
30320 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d  .  sqliteFree(zM
30330 73 67 32 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  sg2);.}.#endif /
30340 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  * SQLITE_OMIT_IN
30350 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f  TEGRITY_CHECK */
30360 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
30370 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f  _OMIT_INTEGRITY_
30380 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 41 64 64 20  CHECK./*.** Add 
30390 31 20 74 6f 20 74 68 65 20 72 65 66 65 72 65 6e  1 to the referen
303a0 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 70 61 67  ce count for pag
303b0 65 20 69 50 61 67 65 2e 20 20 49 66 20 74 68 69  e iPage.  If thi
303c0 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 0a  s is the second.
303d0 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ** reference to 
303e0 74 68 65 20 70 61 67 65 2c 20 61 64 64 20 61 6e  the page, add an
303f0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
30400 6f 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73  o pCheck->zErrMs
30410 67 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69  g..** Return 1 i
30420 66 20 74 68 65 72 65 20 61 72 65 20 32 20 6f 72  f there are 2 or
30430 65 20 6d 6f 72 65 20 72 65 66 65 72 65 6e 63 65  e more reference
30440 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 61 6e  s to the page an
30450 64 20 30 20 69 66 0a 2a 2a 20 69 66 20 74 68 69  d 0 if.** if thi
30460 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 72  s is the first r
30470 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
30480 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f  page..**.** Also
30490 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   check that the 
304a0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 69  page number is i
304b0 6e 20 62 6f 75 6e 64 73 2e 0a 2a 2f 0a 73 74 61  n bounds..*/.sta
304c0 74 69 63 20 69 6e 74 20 63 68 65 63 6b 52 65 66  tic int checkRef
304d0 28 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43  (IntegrityCk *pC
304e0 68 65 63 6b 2c 20 69 6e 74 20 69 50 61 67 65 2c  heck, int iPage,
304f0 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74 29   char *zContext)
30500 7b 0a 20 20 69 66 28 20 69 50 61 67 65 3d 3d 30  {.  if( iPage==0
30510 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
30520 66 28 20 69 50 61 67 65 3e 70 43 68 65 63 6b 2d  f( iPage>pCheck-
30530 3e 6e 50 61 67 65 20 7c 7c 20 69 50 61 67 65 3c  >nPage || iPage<
30540 30 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70  0 ){.    checkAp
30550 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
30560 7a 43 6f 6e 74 65 78 74 2c 20 22 69 6e 76 61 6c  zContext, "inval
30570 69 64 20 70 61 67 65 20 6e 75 6d 62 65 72 20 25  id page number %
30580 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20  d", iPage);.    
30590 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
305a0 69 66 28 20 70 43 68 65 63 6b 2d 3e 61 6e 52 65  if( pCheck->anRe
305b0 66 5b 69 50 61 67 65 5d 3d 3d 31 20 29 7b 0a 20  f[iPage]==1 ){. 
305c0 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
305d0 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65  g(pCheck, zConte
305e0 78 74 2c 20 22 32 6e 64 20 72 65 66 65 72 65 6e  xt, "2nd referen
305f0 63 65 20 74 6f 20 70 61 67 65 20 25 64 22 2c 20  ce to page %d", 
30600 69 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75  iPage);.    retu
30610 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
30620 72 6e 20 20 28 70 43 68 65 63 6b 2d 3e 61 6e 52  rn  (pCheck->anR
30630 65 66 5b 69 50 61 67 65 5d 2b 2b 29 3e 31 3b 0a  ef[iPage]++)>1;.
30640 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
30650 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
30660 4d 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68  M./*.** Check th
30670 61 74 20 74 68 65 20 65 6e 74 72 79 20 69 6e 20  at the entry in 
30680 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
30690 66 6f 72 20 70 61 67 65 20 69 43 68 69 6c 64 20  for page iChild 
306a0 6d 61 70 73 20 74 6f 20 0a 2a 2a 20 70 61 67 65  maps to .** page
306b0 20 69 50 61 72 65 6e 74 2c 20 70 6f 69 6e 74 65   iParent, pointe
306c0 72 20 74 79 70 65 20 70 74 72 54 79 70 65 2e 20  r type ptrType. 
306d0 49 66 20 6e 6f 74 2c 20 61 70 70 65 6e 64 20 61  If not, append a
306e0 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  n error message.
306f0 2a 2a 20 74 6f 20 70 43 68 65 63 6b 2e 0a 2a 2f  ** to pCheck..*/
30700 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65  .static void che
30710 63 6b 50 74 72 6d 61 70 28 0a 20 20 49 6e 74 65  ckPtrmap(.  Inte
30720 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c  grityCk *pCheck,
30730 20 20 20 2f 2a 20 49 6e 74 65 67 72 69 74 79 20     /* Integrity 
30740 63 68 65 63 6b 20 63 6f 6e 74 65 78 74 20 2a 2f  check context */
30750 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20  .  Pgno iChild, 
30760 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 69            /* Chi
30770 6c 64 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ld page number *
30780 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20 20  /.  u8 eType,   
30790 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
307a0 70 65 63 74 65 64 20 70 6f 69 6e 74 65 72 20 6d  pected pointer m
307b0 61 70 20 74 79 70 65 20 2a 2f 0a 20 20 50 67 6e  ap type */.  Pgn
307c0 6f 20 69 50 61 72 65 6e 74 2c 20 20 20 20 20 20  o iParent,      
307d0 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65 64 20      /* Expected 
307e0 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 72 65  pointer map pare
307f0 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  nt page number *
30800 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65  /.  char *zConte
30810 78 74 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  xt         /* Co
30820 6e 74 65 78 74 20 64 65 73 63 72 69 70 74 69 6f  ntext descriptio
30830 6e 20 28 75 73 65 64 20 66 6f 72 20 65 72 72 6f  n (used for erro
30840 72 20 6d 73 67 29 20 2a 2f 0a 29 7b 0a 20 20 69  r msg) */.){.  i
30850 6e 74 20 72 63 3b 0a 20 20 75 38 20 65 50 74 72  nt rc;.  u8 ePtr
30860 6d 61 70 54 79 70 65 3b 0a 20 20 50 67 6e 6f 20  mapType;.  Pgno 
30870 69 50 74 72 6d 61 70 50 61 72 65 6e 74 3b 0a 0a  iPtrmapParent;..
30880 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
30890 28 70 43 68 65 63 6b 2d 3e 70 42 74 2c 20 69 43  (pCheck->pBt, iC
308a0 68 69 6c 64 2c 20 26 65 50 74 72 6d 61 70 54 79  hild, &ePtrmapTy
308b0 70 65 2c 20 26 69 50 74 72 6d 61 70 50 61 72 65  pe, &iPtrmapPare
308c0 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  nt);.  if( rc!=S
308d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
308e0 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
308f0 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c  Check, zContext,
30900 20 22 46 61 69 6c 65 64 20 74 6f 20 72 65 61 64   "Failed to read
30910 20 70 74 72 6d 61 70 20 6b 65 79 3d 25 64 22 2c   ptrmap key=%d",
30920 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 72 65   iChild);.    re
30930 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  turn;.  }..  if(
30940 20 65 50 74 72 6d 61 70 54 79 70 65 21 3d 65 54   ePtrmapType!=eT
30950 79 70 65 20 7c 7c 20 69 50 74 72 6d 61 70 50 61  ype || iPtrmapPa
30960 72 65 6e 74 21 3d 69 50 61 72 65 6e 74 20 29 7b  rent!=iParent ){
30970 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64  .    checkAppend
30980 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
30990 74 65 78 74 2c 20 0a 20 20 20 20 20 20 22 42 61  text, .      "Ba
309a0 64 20 70 74 72 20 6d 61 70 20 65 6e 74 72 79 20  d ptr map entry 
309b0 6b 65 79 3d 25 64 20 65 78 70 65 63 74 65 64 3d  key=%d expected=
309c0 28 25 64 2c 25 64 29 20 67 6f 74 3d 28 25 64 2c  (%d,%d) got=(%d,
309d0 25 64 29 22 2c 20 0a 20 20 20 20 20 20 69 43 68  %d)", .      iCh
309e0 69 6c 64 2c 20 65 54 79 70 65 2c 20 69 50 61 72  ild, eType, iPar
309f0 65 6e 74 2c 20 65 50 74 72 6d 61 70 54 79 70 65  ent, ePtrmapType
30a00 2c 20 69 50 74 72 6d 61 70 50 61 72 65 6e 74 29  , iPtrmapParent)
30a10 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
30a20 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65 20  /*.** Check the 
30a30 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65  integrity of the
30a40 20 66 72 65 65 6c 69 73 74 20 6f 72 20 6f 66 20   freelist or of 
30a50 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
30a60 20 6c 69 73 74 2e 0a 2a 2a 20 56 65 72 69 66 79   list..** Verify
30a70 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72   that the number
30a80 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65   of pages on the
30a90 20 6c 69 73 74 20 69 73 20 4e 2e 0a 2a 2f 0a 73   list is N..*/.s
30aa0 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b  tatic void check
30ab0 4c 69 73 74 28 0a 20 20 49 6e 74 65 67 72 69 74  List(.  Integrit
30ac0 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20 2f 2a  yCk *pCheck,  /*
30ad0 20 49 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b   Integrity check
30ae0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
30af0 20 69 6e 74 20 69 73 46 72 65 65 4c 69 73 74 2c   int isFreeList,
30b00 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
30b10 6f 72 20 61 20 66 72 65 65 6c 69 73 74 2e 20 20  or a freelist.  
30b20 46 61 6c 73 65 20 66 6f 72 20 6f 76 65 72 66 6c  False for overfl
30b30 6f 77 20 70 61 67 65 20 6c 69 73 74 20 2a 2f 0a  ow page list */.
30b40 20 20 69 6e 74 20 69 50 61 67 65 2c 20 20 20 20    int iPage,    
30b50 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
30b60 6e 75 6d 62 65 72 20 66 6f 72 20 66 69 72 73 74  number for first
30b70 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73   page in the lis
30b80 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20  t */.  int N,   
30b90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30ba0 45 78 70 65 63 74 65 64 20 6e 75 6d 62 65 72 20  Expected number 
30bb0 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
30bc0 6c 69 73 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  list */.  char *
30bd0 7a 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20  zContext        
30be0 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72 20 65  /* Context for e
30bf0 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 2a 2f  rror messages */
30c00 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  .){.  int i;.  i
30c10 6e 74 20 65 78 70 65 63 74 65 64 20 3d 20 4e 3b  nt expected = N;
30c20 0a 20 20 69 6e 74 20 69 46 69 72 73 74 20 3d 20  .  int iFirst = 
30c30 69 50 61 67 65 3b 0a 20 20 77 68 69 6c 65 28 20  iPage;.  while( 
30c40 4e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 75  N-- > 0 ){.    u
30c50 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 4f  nsigned char *pO
30c60 76 66 6c 3b 0a 20 20 20 20 69 66 28 20 69 50 61  vfl;.    if( iPa
30c70 67 65 3c 31 20 29 7b 0a 20 20 20 20 20 20 63 68  ge<1 ){.      ch
30c80 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
30c90 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20  eck, zContext,. 
30ca0 20 20 20 20 20 20 20 20 22 25 64 20 6f 66 20 25          "%d of %
30cb0 64 20 70 61 67 65 73 20 6d 69 73 73 69 6e 67 20  d pages missing 
30cc0 66 72 6f 6d 20 6f 76 65 72 66 6c 6f 77 20 6c 69  from overflow li
30cd0 73 74 20 73 74 61 72 74 69 6e 67 20 61 74 20 25  st starting at %
30ce0 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 2b  d",.          N+
30cf0 31 2c 20 65 78 70 65 63 74 65 64 2c 20 69 46 69  1, expected, iFi
30d00 72 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  rst);.      brea
30d10 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
30d20 20 63 68 65 63 6b 52 65 66 28 70 43 68 65 63 6b   checkRef(pCheck
30d30 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78  , iPage, zContex
30d40 74 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  t) ) break;.    
30d50 69 66 28 20 73 71 6c 69 74 65 33 70 61 67 65 72  if( sqlite3pager
30d60 5f 67 65 74 28 70 43 68 65 63 6b 2d 3e 70 50 61  _get(pCheck->pPa
30d70 67 65 72 2c 20 28 50 67 6e 6f 29 69 50 61 67 65  ger, (Pgno)iPage
30d80 2c 20 28 76 6f 69 64 2a 2a 29 26 70 4f 76 66 6c  , (void**)&pOvfl
30d90 29 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b  ) ){.      check
30da0 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
30db0 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 66 61 69  , zContext, "fai
30dc0 6c 65 64 20 74 6f 20 67 65 74 20 70 61 67 65 20  led to get page 
30dd0 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20  %d", iPage);.   
30de0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
30df0 20 20 20 20 69 66 28 20 69 73 46 72 65 65 4c 69      if( isFreeLi
30e00 73 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  st ){.      int 
30e10 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 4f  n = get4byte(&pO
30e20 76 66 6c 5b 34 5d 29 3b 0a 23 69 66 6e 64 65 66  vfl[4]);.#ifndef
30e30 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
30e40 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66  OVACUUM.      if
30e50 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61  ( pCheck->pBt->a
30e60 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
30e70 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70       checkPtrmap
30e80 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c 20  (pCheck, iPage, 
30e90 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c  PTRMAP_FREEPAGE,
30ea0 20 30 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20   0, zContext);. 
30eb0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
30ec0 20 20 20 20 69 66 28 20 6e 3e 70 43 68 65 63 6b      if( n>pCheck
30ed0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
30ee0 65 2f 34 2d 38 20 29 7b 0a 20 20 20 20 20 20 20  e/4-8 ){.       
30ef0 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
30f00 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
30f10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 22 66 72  ,.           "fr
30f20 65 65 6c 69 73 74 20 6c 65 61 66 20 63 6f 75 6e  eelist leaf coun
30f30 74 20 74 6f 6f 20 62 69 67 20 6f 6e 20 70 61 67  t too big on pag
30f40 65 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20  e %d", iPage);. 
30f50 20 20 20 20 20 20 20 4e 2d 2d 3b 0a 20 20 20 20         N--;.    
30f60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
30f70 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69   for(i=0; i<n; i
30f80 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50  ++){.          P
30f90 67 6e 6f 20 69 46 72 65 65 50 61 67 65 20 3d 20  gno iFreePage = 
30fa0 67 65 74 34 62 79 74 65 28 26 70 4f 76 66 6c 5b  get4byte(&pOvfl[
30fb0 38 2b 69 2a 34 5d 29 3b 0a 23 69 66 6e 64 65 66  8+i*4]);.#ifndef
30fc0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
30fd0 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 20 20  OVACUUM.        
30fe0 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 70 42    if( pCheck->pB
30ff0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
31000 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 65  .            che
31010 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c  ckPtrmap(pCheck,
31020 20 69 46 72 65 65 50 61 67 65 2c 20 50 54 52 4d   iFreePage, PTRM
31030 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20  AP_FREEPAGE, 0, 
31040 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  zContext);.     
31050 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
31060 20 20 20 20 20 20 20 20 63 68 65 63 6b 52 65 66          checkRef
31070 28 70 43 68 65 63 6b 2c 20 69 46 72 65 65 50 61  (pCheck, iFreePa
31080 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20  ge, zContext);. 
31090 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
310a0 20 4e 20 2d 3d 20 6e 3b 0a 20 20 20 20 20 20 7d   N -= n;.      }
310b0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
310c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
310d0 41 43 55 55 4d 0a 20 20 20 20 65 6c 73 65 7b 0a  ACUUM.    else{.
310e0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
310f0 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72   database suppor
31100 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61  ts auto-vacuum a
31110 6e 64 20 69 50 61 67 65 20 69 73 20 6e 6f 74 20  nd iPage is not 
31120 74 68 65 20 6c 61 73 74 0a 20 20 20 20 20 20 2a  the last.      *
31130 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 6f  * page in this o
31140 76 65 72 66 6c 6f 77 20 6c 69 73 74 2c 20 63 68  verflow list, ch
31150 65 63 6b 20 74 68 61 74 20 74 68 65 20 70 6f 69  eck that the poi
31160 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 66  nter-map entry f
31170 6f 72 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  or.      ** the 
31180 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 67 65 20 6d  following page m
31190 61 74 63 68 65 73 20 69 50 61 67 65 2e 0a 20 20  atches iPage..  
311a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
311b0 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61 75   pCheck->pBt->au
311c0 74 6f 56 61 63 75 75 6d 20 26 26 20 4e 3e 30 20  toVacuum && N>0 
311d0 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d 20 67  ){.        i = g
311e0 65 74 34 62 79 74 65 28 70 4f 76 66 6c 29 3b 0a  et4byte(pOvfl);.
311f0 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74 72          checkPtr
31200 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 2c 20 50  map(pCheck, i, P
31210 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c  TRMAP_OVERFLOW2,
31220 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74   iPage, zContext
31230 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
31240 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 50 61 67  .#endif.    iPag
31250 65 20 3d 20 67 65 74 34 62 79 74 65 28 70 4f 76  e = get4byte(pOv
31260 66 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  fl);.    sqlite3
31270 70 61 67 65 72 5f 75 6e 72 65 66 28 70 4f 76 66  pager_unref(pOvf
31280 6c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  l);.  }.}.#endif
31290 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
312a0 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20  INTEGRITY_CHECK 
312b0 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
312c0 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54  TE_OMIT_INTEGRIT
312d0 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 44 6f  Y_CHECK./*.** Do
312e0 20 76 61 72 69 6f 75 73 20 73 61 6e 69 74 79 20   various sanity 
312f0 63 68 65 63 6b 73 20 6f 6e 20 61 20 73 69 6e 67  checks on a sing
31300 6c 65 20 70 61 67 65 20 6f 66 20 61 20 74 72 65  le page of a tre
31310 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68  e.  Return.** th
31320 65 20 74 72 65 65 20 64 65 70 74 68 2e 20 20 52  e tree depth.  R
31330 6f 6f 74 20 70 61 67 65 73 20 72 65 74 75 72 6e  oot pages return
31340 20 30 2e 20 20 50 61 72 65 6e 74 73 20 6f 66 20   0.  Parents of 
31350 72 6f 6f 74 20 70 61 67 65 73 0a 2a 2a 20 72 65  root pages.** re
31360 74 75 72 6e 20 31 2c 20 61 6e 64 20 73 6f 20 66  turn 1, and so f
31370 6f 72 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65  orth..** .** The
31380 73 65 20 63 68 65 63 6b 73 20 61 72 65 20 64 6f  se checks are do
31390 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 31  ne:.**.**      1
313a0 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 61  .  Make sure tha
313b0 74 20 63 65 6c 6c 73 20 61 6e 64 20 66 72 65 65  t cells and free
313c0 62 6c 6f 63 6b 73 20 64 6f 20 6e 6f 74 20 6f 76  blocks do not ov
313d0 65 72 6c 61 70 0a 2a 2a 20 20 20 20 20 20 20 20  erlap.**        
313e0 20 20 62 75 74 20 63 6f 6d 62 69 6e 65 20 74 6f    but combine to
313f0 20 63 6f 6d 70 6c 65 74 65 6c 79 20 63 6f 76 65   completely cove
31400 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 20  r the page..**  
31410 4e 4f 20 20 32 2e 20 20 4d 61 6b 65 20 73 75 72  NO  2.  Make sur
31420 65 20 63 65 6c 6c 20 6b 65 79 73 20 61 72 65 20  e cell keys are 
31430 69 6e 20 6f 72 64 65 72 2e 0a 2a 2a 20 20 4e 4f  in order..**  NO
31440 20 20 33 2e 20 20 4d 61 6b 65 20 73 75 72 65 20    3.  Make sure 
31450 6e 6f 20 6b 65 79 20 69 73 20 6c 65 73 73 20 74  no key is less t
31460 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
31470 7a 4c 6f 77 65 72 42 6f 75 6e 64 2e 0a 2a 2a 20  zLowerBound..** 
31480 20 4e 4f 20 20 34 2e 20 20 4d 61 6b 65 20 73 75   NO  4.  Make su
31490 72 65 20 6e 6f 20 6b 65 79 20 69 73 20 67 72 65  re no key is gre
314a0 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
314b0 61 6c 20 74 6f 20 7a 55 70 70 65 72 42 6f 75 6e  al to zUpperBoun
314c0 64 2e 0a 2a 2a 20 20 20 20 20 20 35 2e 20 20 43  d..**      5.  C
314d0 68 65 63 6b 20 74 68 65 20 69 6e 74 65 67 72 69  heck the integri
314e0 74 79 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70  ty of overflow p
314f0 61 67 65 73 2e 0a 2a 2a 20 20 20 20 20 20 36 2e  ages..**      6.
31500 20 20 52 65 63 75 72 73 69 76 65 6c 79 20 63 61    Recursively ca
31510 6c 6c 20 63 68 65 63 6b 54 72 65 65 50 61 67 65  ll checkTreePage
31520 20 6f 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e   on all children
31530 2e 0a 2a 2a 20 20 20 20 20 20 37 2e 20 20 56 65  ..**      7.  Ve
31540 72 69 66 79 20 74 68 61 74 20 74 68 65 20 64 65  rify that the de
31550 70 74 68 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64  pth of all child
31560 72 65 6e 20 69 73 20 74 68 65 20 73 61 6d 65 2e  ren is the same.
31570 0a 2a 2a 20 20 20 20 20 20 38 2e 20 20 4d 61 6b  .**      8.  Mak
31580 65 20 73 75 72 65 20 74 68 69 73 20 70 61 67 65  e sure this page
31590 20 69 73 20 61 74 20 6c 65 61 73 74 20 33 33 25   is at least 33%
315a0 20 66 75 6c 6c 20 6f 72 20 65 6c 73 65 20 69 74   full or else it
315b0 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   is.**          
315c0 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  the root of the 
315d0 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tree..*/.static 
315e0 69 6e 74 20 63 68 65 63 6b 54 72 65 65 50 61 67  int checkTreePag
315f0 65 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b  e(.  IntegrityCk
31600 20 2a 70 43 68 65 63 6b 2c 20 20 2f 2a 20 43 6f   *pCheck,  /* Co
31610 6e 74 65 78 74 20 66 6f 72 20 74 68 65 20 73 61  ntext for the sa
31620 6e 69 74 79 20 63 68 65 63 6b 20 2a 2f 0a 20 20  nity check */.  
31630 69 6e 74 20 69 50 61 67 65 2c 20 20 20 20 20 20  int iPage,      
31640 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
31650 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  mber of the page
31660 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 4d   to check */.  M
31670 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c  emPage *pParent,
31680 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 70       /* Parent p
31690 61 67 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  age */.  char *z
316a0 50 61 72 65 6e 74 43 6f 6e 74 65 78 74 20 20 2f  ParentContext  /
316b0 2a 20 50 61 72 65 6e 74 20 63 6f 6e 74 65 78 74  * Parent context
316c0 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65   */.){.  MemPage
316d0 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74 20 69   *pPage;.  int i
316e0 2c 20 72 63 2c 20 64 65 70 74 68 2c 20 64 32 2c  , rc, depth, d2,
316f0 20 70 67 6e 6f 2c 20 63 6e 74 3b 0a 20 20 69 6e   pgno, cnt;.  in
31700 74 20 68 64 72 2c 20 63 65 6c 6c 53 74 61 72 74  t hdr, cellStart
31710 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20  ;.  int nCell;. 
31720 20 75 38 20 2a 64 61 74 61 3b 0a 20 20 42 74 53   u8 *data;.  BtS
31730 68 61 72 65 64 20 2a 70 42 74 3b 0a 20 20 69 6e  hared *pBt;.  in
31740 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  t usableSize;.  
31750 63 68 61 72 20 7a 43 6f 6e 74 65 78 74 5b 31 30  char zContext[10
31760 30 5d 3b 0a 20 20 63 68 61 72 20 2a 68 69 74 3b  0];.  char *hit;
31770 0a 0a 20 20 73 70 72 69 6e 74 66 28 7a 43 6f 6e  ..  sprintf(zCon
31780 74 65 78 74 2c 20 22 50 61 67 65 20 25 64 3a 20  text, "Page %d: 
31790 22 2c 20 69 50 61 67 65 29 3b 0a 0a 20 20 2f 2a  ", iPage);..  /*
317a0 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
317b0 70 61 67 65 20 65 78 69 73 74 73 0a 20 20 2a 2f  page exists.  */
317c0 0a 20 20 70 42 74 20 3d 20 70 43 68 65 63 6b 2d  .  pBt = pCheck-
317d0 3e 70 42 74 3b 0a 20 20 75 73 61 62 6c 65 53 69  >pBt;.  usableSi
317e0 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
317f0 53 69 7a 65 3b 0a 20 20 69 66 28 20 69 50 61 67  Size;.  if( iPag
31800 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  e==0 ) return 0;
31810 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65 66 28  .  if( checkRef(
31820 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c 20 7a  pCheck, iPage, z
31830 50 61 72 65 6e 74 43 6f 6e 74 65 78 74 29 20 29  ParentContext) )
31840 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
31850 20 28 72 63 20 3d 20 67 65 74 50 61 67 65 28 70   (rc = getPage(p
31860 42 74 2c 20 28 50 67 6e 6f 29 69 50 61 67 65 2c  Bt, (Pgno)iPage,
31870 20 26 70 50 61 67 65 29 29 21 3d 30 20 29 7b 0a   &pPage))!=0 ){.
31880 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
31890 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74  sg(pCheck, zCont
318a0 65 78 74 2c 0a 20 20 20 20 20 20 20 22 75 6e 61  ext,.       "una
318b0 62 6c 65 20 74 6f 20 67 65 74 20 74 68 65 20 70  ble to get the p
318c0 61 67 65 2e 20 65 72 72 6f 72 20 63 6f 64 65 3d  age. error code=
318d0 25 64 22 2c 20 72 63 29 3b 0a 20 20 20 20 72 65  %d", rc);.    re
318e0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
318f0 28 20 28 72 63 20 3d 20 69 6e 69 74 50 61 67 65  ( (rc = initPage
31900 28 70 50 61 67 65 2c 20 70 50 61 72 65 6e 74 29  (pPage, pParent)
31910 29 21 3d 30 20 29 7b 0a 20 20 20 20 63 68 65 63  )!=0 ){.    chec
31920 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
31930 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 69 6e  k, zContext, "in
31940 69 74 50 61 67 65 28 29 20 72 65 74 75 72 6e 73  itPage() returns
31950 20 65 72 72 6f 72 20 63 6f 64 65 20 25 64 22 2c   error code %d",
31960 20 72 63 29 3b 0a 20 20 20 20 72 65 6c 65 61 73   rc);.    releas
31970 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
31980 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
31990 0a 20 20 2f 2a 20 43 68 65 63 6b 20 6f 75 74 20  .  /* Check out 
319a0 61 6c 6c 20 74 68 65 20 63 65 6c 6c 73 2e 0a 20  all the cells.. 
319b0 20 2a 2f 0a 20 20 64 65 70 74 68 20 3d 20 30 3b   */.  depth = 0;
319c0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50  .  for(i=0; i<pP
319d0 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29  age->nCell; i++)
319e0 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b  {.    u8 *pCell;
319f0 0a 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20  .    int sz;.   
31a00 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
31a10 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 70 61  .    /* Check pa
31a20 79 6c 6f 61 64 20 6f 76 65 72 66 6c 6f 77 20 70  yload overflow p
31a30 61 67 65 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ages.    */.    
31a40 73 70 72 69 6e 74 66 28 7a 43 6f 6e 74 65 78 74  sprintf(zContext
31a50 2c 20 22 4f 6e 20 74 72 65 65 20 70 61 67 65 20  , "On tree page 
31a60 25 64 20 63 65 6c 6c 20 25 64 3a 20 22 2c 20 69  %d cell %d: ", i
31a70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 70 43  Page, i);.    pC
31a80 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
31a90 50 61 67 65 2c 69 29 3b 0a 20 20 20 20 70 61 72  Page,i);.    par
31aa0 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
31ab0 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
31ac0 20 20 20 20 73 7a 20 3d 20 69 6e 66 6f 2e 6e 44      sz = info.nD
31ad0 61 74 61 3b 0a 20 20 20 20 69 66 28 20 21 70 50  ata;.    if( !pP
31ae0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 20 73 7a  age->intKey ) sz
31af0 20 2b 3d 20 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20   += info.nKey;. 
31b00 20 20 20 69 66 28 20 73 7a 3e 69 6e 66 6f 2e 6e     if( sz>info.n
31b10 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 69  Local ){.      i
31b20 6e 74 20 6e 50 61 67 65 20 3d 20 28 73 7a 20 2d  nt nPage = (sz -
31b30 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 75   info.nLocal + u
31b40 73 61 62 6c 65 53 69 7a 65 20 2d 20 35 29 2f 28  sableSize - 5)/(
31b50 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b  usableSize - 4);
31b60 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  .      Pgno pgno
31b70 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  Ovfl = get4byte(
31b80 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
31b90 72 66 6c 6f 77 5d 29 3b 0a 23 69 66 6e 64 65 66  rflow]);.#ifndef
31ba0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
31bb0 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66  OVACUUM.      if
31bc0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
31bd0 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65  m ){.        che
31be0 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c  ckPtrmap(pCheck,
31bf0 20 70 67 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d 41   pgnoOvfl, PTRMA
31c00 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 69 50 61  P_OVERFLOW1, iPa
31c10 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20  ge, zContext);. 
31c20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
31c30 20 20 20 20 63 68 65 63 6b 4c 69 73 74 28 70 43      checkList(pC
31c40 68 65 63 6b 2c 20 30 2c 20 70 67 6e 6f 4f 76 66  heck, 0, pgnoOvf
31c50 6c 2c 20 6e 50 61 67 65 2c 20 7a 43 6f 6e 74 65  l, nPage, zConte
31c60 78 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  xt);.    }..    
31c70 2f 2a 20 43 68 65 63 6b 20 73 61 6e 69 74 79 20  /* Check sanity 
31c80 6f 66 20 6c 65 66 74 20 63 68 69 6c 64 20 70 61  of left child pa
31c90 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ge..    */.    i
31ca0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
31cb0 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d 20  ){.      pgno = 
31cc0 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b  get4byte(pCell);
31cd0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
31ce0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
31cf0 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61        if( pBt->a
31d00 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
31d10 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70       checkPtrmap
31d20 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 50  (pCheck, pgno, P
31d30 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 69 50 61  TRMAP_BTREE, iPa
31d40 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20  ge, zContext);. 
31d50 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
31d60 20 20 20 20 64 32 20 3d 20 63 68 65 63 6b 54 72      d2 = checkTr
31d70 65 65 50 61 67 65 28 70 43 68 65 63 6b 2c 70 67  eePage(pCheck,pg
31d80 6e 6f 2c 70 50 61 67 65 2c 7a 43 6f 6e 74 65 78  no,pPage,zContex
31d90 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3e  t);.      if( i>
31da0 30 20 26 26 20 64 32 21 3d 64 65 70 74 68 20 29  0 && d2!=depth )
31db0 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 41  {.        checkA
31dc0 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
31dd0 20 7a 43 6f 6e 74 65 78 74 2c 20 22 43 68 69 6c   zContext, "Chil
31de0 64 20 70 61 67 65 20 64 65 70 74 68 20 64 69 66  d page depth dif
31df0 66 65 72 73 22 29 3b 0a 20 20 20 20 20 20 7d 0a  fers");.      }.
31e00 20 20 20 20 20 20 64 65 70 74 68 20 3d 20 64 32        depth = d2
31e10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
31e20 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
31e30 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74  {.    pgno = get
31e40 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
31e50 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
31e60 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 73 70  fset+8]);.    sp
31e70 72 69 6e 74 66 28 7a 43 6f 6e 74 65 78 74 2c 20  rintf(zContext, 
31e80 22 4f 6e 20 70 61 67 65 20 25 64 20 61 74 20 72  "On page %d at r
31e90 69 67 68 74 20 63 68 69 6c 64 3a 20 22 2c 20 69  ight child: ", i
31ea0 50 61 67 65 29 3b 0a 23 69 66 6e 64 65 66 20 53  Page);.#ifndef S
31eb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
31ec0 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
31ed0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
31ee0 0a 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d  .      checkPtrm
31ef0 61 70 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f 2c  ap(pCheck, pgno,
31f00 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 69   PTRMAP_BTREE, i
31f10 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Page, 0);.    }.
31f20 23 65 6e 64 69 66 0a 20 20 20 20 63 68 65 63 6b  #endif.    check
31f30 54 72 65 65 50 61 67 65 28 70 43 68 65 63 6b 2c  TreePage(pCheck,
31f40 20 70 67 6e 6f 2c 20 70 50 61 67 65 2c 20 7a 43   pgno, pPage, zC
31f50 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a 20 0a 20  ontext);.  }. . 
31f60 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 63 6f   /* Check for co
31f70 6d 70 6c 65 74 65 20 63 6f 76 65 72 61 67 65 20  mplete coverage 
31f80 6f 66 20 74 68 65 20 70 61 67 65 0a 20 20 2a 2f  of the page.  */
31f90 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
31fa0 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20  >aData;.  hdr = 
31fb0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
31fc0 3b 0a 20 20 68 69 74 20 3d 20 73 71 6c 69 74 65  ;.  hit = sqlite
31fd0 4d 61 6c 6c 6f 63 28 20 75 73 61 62 6c 65 53 69  Malloc( usableSi
31fe0 7a 65 20 29 3b 0a 20 20 69 66 28 20 68 69 74 20  ze );.  if( hit 
31ff0 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 68 69  ){.    memset(hi
32000 74 2c 20 31 2c 20 67 65 74 32 62 79 74 65 28 26  t, 1, get2byte(&
32010 64 61 74 61 5b 68 64 72 2b 35 5d 29 29 3b 0a 20  data[hdr+5]));. 
32020 20 20 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62     nCell = get2b
32030 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
32040 29 3b 0a 20 20 20 20 63 65 6c 6c 53 74 61 72 74  );.    cellStart
32050 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a   = hdr + 12 - 4*
32060 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20  pPage->leaf;.   
32070 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
32080 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
32090 6e 74 20 70 63 20 3d 20 67 65 74 32 62 79 74 65  nt pc = get2byte
320a0 28 26 64 61 74 61 5b 63 65 6c 6c 53 74 61 72 74  (&data[cellStart
320b0 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20 69 6e  +i*2]);.      in
320c0 74 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a  t size = cellSiz
320d0 65 50 74 72 28 70 50 61 67 65 2c 20 26 64 61 74  ePtr(pPage, &dat
320e0 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 69 6e  a[pc]);.      in
320f0 74 20 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 28  t j;.      if( (
32100 70 63 2b 73 69 7a 65 2d 31 29 3e 3d 75 73 61 62  pc+size-1)>=usab
32110 6c 65 53 69 7a 65 20 7c 7c 20 70 63 3c 30 20 29  leSize || pc<0 )
32120 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 41  {.        checkA
32130 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
32140 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   0, .           
32150 20 22 43 6f 72 72 75 70 74 69 6f 6e 20 64 65 74   "Corruption det
32160 65 63 74 65 64 20 69 6e 20 63 65 6c 6c 20 25 64  ected in cell %d
32170 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 69 2c 69   on page %d",i,i
32180 50 61 67 65 2c 30 29 3b 0a 20 20 20 20 20 20 7d  Page,0);.      }
32190 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f  else{.        fo
321a0 72 28 6a 3d 70 63 2b 73 69 7a 65 2d 31 3b 20 6a  r(j=pc+size-1; j
321b0 3e 3d 70 63 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a  >=pc; j--) hit[j
321c0 5d 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ]++;.      }.   
321d0 20 7d 0a 20 20 20 20 66 6f 72 28 63 6e 74 3d 30   }.    for(cnt=0
321e0 2c 20 69 3d 67 65 74 32 62 79 74 65 28 26 64 61  , i=get2byte(&da
321f0 74 61 5b 68 64 72 2b 31 5d 29 3b 20 69 3e 30 20  ta[hdr+1]); i>0 
32200 26 26 20 69 3c 75 73 61 62 6c 65 53 69 7a 65 20  && i<usableSize 
32210 26 26 20 63 6e 74 3c 31 30 30 30 30 3b 20 0a 20  && cnt<10000; . 
32220 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 29            cnt++)
32230 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65  {.      int size
32240 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
32250 61 5b 69 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69  a[i+2]);.      i
32260 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 66 28 20  nt j;.      if( 
32270 28 69 2b 73 69 7a 65 2d 31 29 3e 3d 75 73 61 62  (i+size-1)>=usab
32280 6c 65 53 69 7a 65 20 7c 7c 20 69 3c 30 20 29 7b  leSize || i<0 ){
32290 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 41 70  .        checkAp
322a0 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
322b0 30 2c 20 20 0a 20 20 20 20 20 20 20 20 20 20 20  0,  .           
322c0 20 22 43 6f 72 72 75 70 74 69 6f 6e 20 64 65 74   "Corruption det
322d0 65 63 74 65 64 20 69 6e 20 63 65 6c 6c 20 25 64  ected in cell %d
322e0 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 69 2c 69   on page %d",i,i
322f0 50 61 67 65 2c 30 29 3b 0a 20 20 20 20 20 20 7d  Page,0);.      }
32300 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f  else{.        fo
32310 72 28 6a 3d 69 2b 73 69 7a 65 2d 31 3b 20 6a 3e  r(j=i+size-1; j>
32320 3d 69 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b  =i; j--) hit[j]+
32330 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
32340 20 69 20 3d 20 67 65 74 32 62 79 74 65 28 26 64   i = get2byte(&d
32350 61 74 61 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  ata[i]);.    }. 
32360 20 20 20 66 6f 72 28 69 3d 63 6e 74 3d 30 3b 20     for(i=cnt=0; 
32370 69 3c 75 73 61 62 6c 65 53 69 7a 65 3b 20 69 2b  i<usableSize; i+
32380 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 68 69  +){.      if( hi
32390 74 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  t[i]==0 ){.     
323a0 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20     cnt++;.      
323b0 7d 65 6c 73 65 20 69 66 28 20 68 69 74 5b 69 5d  }else if( hit[i]
323c0 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  >1 ){.        ch
323d0 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
323e0 65 63 6b 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  eck, 0,.        
323f0 20 20 22 4d 75 6c 74 69 70 6c 65 20 75 73 65 73    "Multiple uses
32400 20 66 6f 72 20 62 79 74 65 20 25 64 20 6f 66 20   for byte %d of 
32410 70 61 67 65 20 25 64 22 2c 20 69 2c 20 69 50 61  page %d", i, iPa
32420 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ge);.        bre
32430 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
32440 7d 0a 20 20 20 20 69 66 28 20 63 6e 74 21 3d 64  }.    if( cnt!=d
32450 61 74 61 5b 68 64 72 2b 37 5d 20 29 7b 0a 20 20  ata[hdr+7] ){.  
32460 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
32470 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 20 0a 20  sg(pCheck, 0, . 
32480 20 20 20 20 20 20 20 20 20 22 46 72 61 67 6d 65           "Fragme
32490 6e 74 65 64 20 73 70 61 63 65 20 69 73 20 25 64  nted space is %d
324a0 20 62 79 74 65 20 72 65 70 6f 72 74 65 64 20 61   byte reported a
324b0 73 20 25 64 20 6f 6e 20 70 61 67 65 20 25 64 22  s %d on page %d"
324c0 2c 0a 20 20 20 20 20 20 20 20 20 20 63 6e 74 2c  ,.          cnt,
324d0 20 64 61 74 61 5b 68 64 72 2b 37 5d 2c 20 69 50   data[hdr+7], iP
324e0 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  age);.    }.  }.
324f0 20 20 73 71 6c 69 74 65 46 72 65 65 28 68 69 74    sqliteFree(hit
32500 29 3b 0a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  );..  releasePag
32510 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74 75  e(pPage);.  retu
32520 72 6e 20 64 65 70 74 68 2b 31 3b 0a 7d 0a 23 65  rn depth+1;.}.#e
32530 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
32540 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48  MIT_INTEGRITY_CH
32550 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ECK */..#ifndef 
32560 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45  SQLITE_OMIT_INTE
32570 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a  GRITY_CHECK./*.*
32580 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
32590 6f 65 73 20 61 20 63 6f 6d 70 6c 65 74 65 20 63  oes a complete c
325a0 68 65 63 6b 20 6f 66 20 74 68 65 20 67 69 76 65  heck of the give
325b0 6e 20 42 54 72 65 65 20 66 69 6c 65 2e 20 20 61  n BTree file.  a
325c0 52 6f 6f 74 5b 5d 20 69 73 0a 2a 2a 20 61 6e 20  Root[] is.** an 
325d0 61 72 72 61 79 20 6f 66 20 70 61 67 65 73 20 6e  array of pages n
325e0 75 6d 62 65 72 73 20 77 65 72 65 20 65 61 63 68  umbers were each
325f0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
32600 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
32610 0a 2a 2a 20 61 20 74 61 62 6c 65 2e 20 20 6e 52  .** a table.  nR
32620 6f 6f 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65  oot is the numbe
32630 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
32640 61 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  aRoot..**.** If 
32650 65 76 65 72 79 74 68 69 6e 67 20 63 68 65 63 6b  everything check
32660 73 20 6f 75 74 2c 20 74 68 69 73 20 72 6f 75 74  s out, this rout
32670 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  ine returns NULL
32680 2e 20 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20  .  If something 
32690 69 73 0a 2a 2a 20 61 6d 69 73 73 2c 20 61 6e 20  is.** amiss, an 
326a0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
326b0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d 65   written into me
326c0 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
326d0 6f 6d 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 61  om malloc().** a
326e0 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  nd a pointer to 
326f0 74 68 61 74 20 65 72 72 6f 72 20 6d 65 73 73 61  that error messa
32700 67 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ge is returned. 
32710 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
32720 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70  ction.** is resp
32730 6f 6e 73 69 62 6c 65 20 66 6f 72 20 66 72 65 65  onsible for free
32740 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20 6d 65  ing the error me
32750 73 73 61 67 65 20 77 68 65 6e 20 69 74 20 69 73  ssage when it is
32760 20 64 6f 6e 65 2e 0a 2a 2f 0a 63 68 61 72 20 2a   done..*/.char *
32770 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74 65  sqlite3BtreeInte
32780 67 72 69 74 79 43 68 65 63 6b 28 42 74 72 65 65  grityCheck(Btree
32790 20 2a 70 2c 20 69 6e 74 20 2a 61 52 6f 6f 74 2c   *p, int *aRoot,
327a0 20 69 6e 74 20 6e 52 6f 6f 74 29 7b 0a 20 20 69   int nRoot){.  i
327b0 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 52 65 66  nt i;.  int nRef
327c0 3b 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20  ;.  IntegrityCk 
327d0 73 43 68 65 63 6b 3b 0a 20 20 42 74 53 68 61 72  sCheck;.  BtShar
327e0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
327f0 3b 0a 0a 20 20 6e 52 65 66 20 3d 20 73 71 6c 69  ;..  nRef = sqli
32800 74 65 33 70 61 67 65 72 5f 72 65 66 63 6f 75 6e  te3pager_refcoun
32810 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  t(pBt->pPager);.
32820 20 20 69 66 28 20 6c 6f 63 6b 42 74 72 65 65 57    if( lockBtreeW
32830 69 74 68 52 65 74 72 79 28 70 29 21 3d 53 51 4c  ithRetry(p)!=SQL
32840 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
32850 74 75 72 6e 20 73 71 6c 69 74 65 53 74 72 44 75  turn sqliteStrDu
32860 70 28 22 55 6e 61 62 6c 65 20 74 6f 20 61 63 71  p("Unable to acq
32870 75 69 72 65 20 61 20 72 65 61 64 20 6c 6f 63 6b  uire a read lock
32880 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
32890 22 29 3b 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b  ");.  }.  sCheck
328a0 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 73 43  .pBt = pBt;.  sC
328b0 68 65 63 6b 2e 70 50 61 67 65 72 20 3d 20 70 42  heck.pPager = pB
328c0 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 73 43 68  t->pPager;.  sCh
328d0 65 63 6b 2e 6e 50 61 67 65 20 3d 20 73 71 6c 69  eck.nPage = sqli
328e0 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75  te3pager_pagecou
328f0 6e 74 28 73 43 68 65 63 6b 2e 70 50 61 67 65 72  nt(sCheck.pPager
32900 29 3b 0a 20 20 69 66 28 20 73 43 68 65 63 6b 2e  );.  if( sCheck.
32910 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nPage==0 ){.    
32920 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
32930 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 72 65  sed(pBt);.    re
32940 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 43  turn 0;.  }.  sC
32950 68 65 63 6b 2e 61 6e 52 65 66 20 3d 20 73 71 6c  heck.anRef = sql
32960 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 28 73  iteMallocRaw( (s
32970 43 68 65 63 6b 2e 6e 50 61 67 65 2b 31 29 2a 73  Check.nPage+1)*s
32980 69 7a 65 6f 66 28 73 43 68 65 63 6b 2e 61 6e 52  izeof(sCheck.anR
32990 65 66 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20  ef[0]) );.  if( 
329a0 21 73 43 68 65 63 6b 2e 61 6e 52 65 66 20 29 7b  !sCheck.anRef ){
329b0 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  .    unlockBtree
329c0 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
329d0 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
329e0 33 4d 50 72 69 6e 74 66 28 22 55 6e 61 62 6c 65  3MPrintf("Unable
329f0 20 74 6f 20 6d 61 6c 6c 6f 63 20 25 64 20 62 79   to malloc %d by
32a00 74 65 73 22 2c 20 0a 20 20 20 20 20 20 20 20 28  tes", .        (
32a10 73 43 68 65 63 6b 2e 6e 50 61 67 65 2b 31 29 2a  sCheck.nPage+1)*
32a20 73 69 7a 65 6f 66 28 73 43 68 65 63 6b 2e 61 6e  sizeof(sCheck.an
32a30 52 65 66 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20  Ref[0]));.  }.  
32a40 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 73 43 68 65  for(i=0; i<=sChe
32a50 63 6b 2e 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 20  ck.nPage; i++){ 
32a60 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 20  sCheck.anRef[i] 
32a70 3d 20 30 3b 20 7d 0a 20 20 69 20 3d 20 50 45 4e  = 0; }.  i = PEN
32a80 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
32a90 42 74 29 3b 0a 20 20 69 66 28 20 69 3c 3d 73 43  Bt);.  if( i<=sC
32aa0 68 65 63 6b 2e 6e 50 61 67 65 20 29 7b 0a 20 20  heck.nPage ){.  
32ab0 20 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69    sCheck.anRef[i
32ac0 5d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 43 68  ] = 1;.  }.  sCh
32ad0 65 63 6b 2e 7a 45 72 72 4d 73 67 20 3d 20 30 3b  eck.zErrMsg = 0;
32ae0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65  ..  /* Check the
32af0 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68   integrity of th
32b00 65 20 66 72 65 65 6c 69 73 74 0a 20 20 2a 2f 0a  e freelist.  */.
32b10 20 20 63 68 65 63 6b 4c 69 73 74 28 26 73 43 68    checkList(&sCh
32b20 65 63 6b 2c 20 31 2c 20 67 65 74 34 62 79 74 65  eck, 1, get4byte
32b30 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
32b40 44 61 74 61 5b 33 32 5d 29 2c 0a 20 20 20 20 20  Data[32]),.     
32b50 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28         get4byte(
32b60 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
32b70 61 74 61 5b 33 36 5d 29 2c 20 22 4d 61 69 6e 20  ata[36]), "Main 
32b80 66 72 65 65 6c 69 73 74 3a 20 22 29 3b 0a 0a 20  freelist: ");.. 
32b90 20 2f 2a 20 43 68 65 63 6b 20 61 6c 6c 20 74 68   /* Check all th
32ba0 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  e tables..  */. 
32bb0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 6f 6f   for(i=0; i<nRoo
32bc0 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  t; i++){.    if(
32bd0 20 61 52 6f 6f 74 5b 69 5d 3d 3d 30 20 29 20 63   aRoot[i]==0 ) c
32be0 6f 6e 74 69 6e 75 65 3b 0a 23 69 66 6e 64 65 66  ontinue;.#ifndef
32bf0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
32c00 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
32c10 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
32c20 26 26 20 61 52 6f 6f 74 5b 69 5d 3e 31 20 29 7b  && aRoot[i]>1 ){
32c30 0a 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d  .      checkPtrm
32c40 61 70 28 26 73 43 68 65 63 6b 2c 20 61 52 6f 6f  ap(&sCheck, aRoo
32c50 74 5b 69 5d 2c 20 50 54 52 4d 41 50 5f 52 4f 4f  t[i], PTRMAP_ROO
32c60 54 50 41 47 45 2c 20 30 2c 20 30 29 3b 0a 20 20  TPAGE, 0, 0);.  
32c70 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
32c80 68 65 63 6b 54 72 65 65 50 61 67 65 28 26 73 43  heckTreePage(&sC
32c90 68 65 63 6b 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20  heck, aRoot[i], 
32ca0 30 2c 20 22 4c 69 73 74 20 6f 66 20 74 72 65 65  0, "List of tree
32cb0 20 72 6f 6f 74 73 3a 20 22 29 3b 0a 20 20 7d 0a   roots: ");.  }.
32cc0 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
32cd0 65 76 65 72 79 20 70 61 67 65 20 69 6e 20 74 68  every page in th
32ce0 65 20 66 69 6c 65 20 69 73 20 72 65 66 65 72 65  e file is refere
32cf0 6e 63 65 64 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  nced.  */.  for(
32d00 69 3d 31 3b 20 69 3c 3d 73 43 68 65 63 6b 2e 6e  i=1; i<=sCheck.n
32d10 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 23 69 66 64  Page; i++){.#ifd
32d20 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
32d30 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
32d40 28 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69  ( sCheck.anRef[i
32d50 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68  ]==0 ){.      ch
32d60 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43  eckAppendMsg(&sC
32d70 68 65 63 6b 2c 20 30 2c 20 22 50 61 67 65 20 25  heck, 0, "Page %
32d80 64 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 22  d is never used"
32d90 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 23 65 6c 73  , i);.    }.#els
32da0 65 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  e.    /* If the 
32db0 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74  database support
32dc0 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 6d  s auto-vacuum, m
32dd0 61 6b 65 20 73 75 72 65 20 6e 6f 20 74 61 62 6c  ake sure no tabl
32de0 65 73 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a  es contain.    *
32df0 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  * references to 
32e00 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
32e10 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
32e20 28 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69  ( sCheck.anRef[i
32e30 5d 3d 3d 30 20 26 26 20 0a 20 20 20 20 20 20 20  ]==0 && .       
32e40 28 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70  (PTRMAP_PAGENO(p
32e50 42 74 2c 20 69 29 21 3d 69 20 7c 7c 20 21 70 42  Bt, i)!=i || !pB
32e60 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 20 29  t->autoVacuum) )
32e70 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70  {.      checkApp
32e80 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20  endMsg(&sCheck, 
32e90 30 2c 20 22 50 61 67 65 20 25 64 20 69 73 20 6e  0, "Page %d is n
32ea0 65 76 65 72 20 75 73 65 64 22 2c 20 69 29 3b 0a  ever used", i);.
32eb0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 43      }.    if( sC
32ec0 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 21 3d 30  heck.anRef[i]!=0
32ed0 20 26 26 20 0a 20 20 20 20 20 20 20 28 50 54 52   && .       (PTR
32ee0 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
32ef0 69 29 3d 3d 69 20 26 26 20 70 42 74 2d 3e 61 75  i)==i && pBt->au
32f00 74 6f 56 61 63 75 75 6d 29 20 29 7b 0a 20 20 20  toVacuum) ){.   
32f10 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
32f20 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 22 50  g(&sCheck, 0, "P
32f30 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
32f40 25 64 20 69 73 20 72 65 66 65 72 65 6e 63 65 64  %d is referenced
32f50 22 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  ", i);.    }.#en
32f60 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  dif.  }..  /* Ma
32f70 6b 65 20 73 75 72 65 20 74 68 69 73 20 61 6e 61  ke sure this ana
32f80 6c 79 73 69 73 20 64 69 64 20 6e 6f 74 20 6c 65  lysis did not le
32f90 61 76 65 20 61 6e 79 20 75 6e 72 65 66 28 29 20  ave any unref() 
32fa0 70 61 67 65 73 0a 20 20 2a 2f 0a 20 20 75 6e 6c  pages.  */.  unl
32fb0 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
32fc0 28 70 42 74 29 3b 0a 20 20 69 66 28 20 6e 52 65  (pBt);.  if( nRe
32fd0 66 20 21 3d 20 73 71 6c 69 74 65 33 70 61 67 65  f != sqlite3page
32fe0 72 5f 72 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e  r_refcount(pBt->
32ff0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 63  pPager) ){.    c
33000 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73  heckAppendMsg(&s
33010 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20  Check, 0, .     
33020 20 22 4f 75 74 73 74 61 6e 64 69 6e 67 20 70 61   "Outstanding pa
33030 67 65 20 63 6f 75 6e 74 20 67 6f 65 73 20 66 72  ge count goes fr
33040 6f 6d 20 25 64 20 74 6f 20 25 64 20 64 75 72 69  om %d to %d duri
33050 6e 67 20 74 68 69 73 20 61 6e 61 6c 79 73 69 73  ng this analysis
33060 22 2c 0a 20 20 20 20 20 20 6e 52 65 66 2c 20 73  ",.      nRef, s
33070 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65 66 63  qlite3pager_refc
33080 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
33090 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20  ).    );.  }..  
330a0 2f 2a 20 43 6c 65 61 6e 20 20 75 70 20 61 6e 64  /* Clean  up and
330b0 20 72 65 70 6f 72 74 20 65 72 72 6f 72 73 2e 0a   report errors..
330c0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 46 72 65    */.  sqliteFre
330d0 65 28 73 43 68 65 63 6b 2e 61 6e 52 65 66 29 3b  e(sCheck.anRef);
330e0 0a 20 20 72 65 74 75 72 6e 20 73 43 68 65 63 6b  .  return sCheck
330f0 2e 7a 45 72 72 4d 73 67 3b 0a 7d 0a 23 65 6e 64  .zErrMsg;.}.#end
33100 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
33110 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
33120 4b 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K */../*.** Retu
33130 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  rn the full path
33140 6e 61 6d 65 20 6f 66 20 74 68 65 20 75 6e 64 65  name of the unde
33150 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
33160 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  file..*/.const c
33170 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65  har *sqlite3Btre
33180 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 42 74 72  eGetFilename(Btr
33190 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  ee *p){.  assert
331a0 28 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  ( p->pBt->pPager
331b0 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
331c0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 66 69 6c  sqlite3pager_fil
331d0 65 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50  ename(p->pBt->pP
331e0 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ager);.}../*.** 
331f0 52 65 74 75 72 6e 20 74 68 65 20 70 61 74 68 6e  Return the pathn
33200 61 6d 65 20 6f 66 20 74 68 65 20 64 69 72 65 63  ame of the direc
33210 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69  tory that contai
33220 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
33230 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  file..*/.const c
33240 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65  har *sqlite3Btre
33250 65 47 65 74 44 69 72 6e 61 6d 65 28 42 74 72 65  eGetDirname(Btre
33260 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  e *p){.  assert(
33270 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 21   p->pBt->pPager!
33280 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  =0 );.  return s
33290 71 6c 69 74 65 33 70 61 67 65 72 5f 64 69 72 6e  qlite3pager_dirn
332a0 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67  ame(p->pBt->pPag
332b0 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  er);.}../*.** Re
332c0 74 75 72 6e 20 74 68 65 20 70 61 74 68 6e 61 6d  turn the pathnam
332d0 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
332e0 20 66 69 6c 65 20 66 6f 72 20 74 68 69 73 20 64   file for this d
332f0 61 74 61 62 61 73 65 2e 20 54 68 65 20 72 65 74  atabase. The ret
33300 75 72 6e 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  urn.** value of 
33310 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
33320 74 68 65 20 73 61 6d 65 20 72 65 67 61 72 64 6c  the same regardl
33330 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 74  ess of whether t
33340 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
33350 2a 2a 20 68 61 73 20 62 65 65 6e 20 63 72 65 61  ** has been crea
33360 74 65 64 20 6f 72 20 6e 6f 74 2e 0a 2a 2f 0a 63  ted or not..*/.c
33370 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
33380 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61  e3BtreeGetJourna
33390 6c 6e 61 6d 65 28 42 74 72 65 65 20 2a 70 29 7b  lname(Btree *p){
333a0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 42  .  assert( p->pB
333b0 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t->pPager!=0 );.
333c0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
333d0 70 61 67 65 72 5f 6a 6f 75 72 6e 61 6c 6e 61 6d  pager_journalnam
333e0 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  e(p->pBt->pPager
333f0 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
33400 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d  LITE_OMIT_VACUUM
33410 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20  ./*.** Copy the 
33420 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74  complete content
33430 20 6f 66 20 70 42 74 46 72 6f 6d 20 69 6e 74 6f   of pBtFrom into
33440 20 70 42 74 54 6f 2e 20 20 41 20 74 72 61 6e 73   pBtTo.  A trans
33450 61 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 62  action.** must b
33460 65 20 61 63 74 69 76 65 20 66 6f 72 20 62 6f 74  e active for bot
33470 68 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  h files..**.** T
33480 68 65 20 73 69 7a 65 20 6f 66 20 66 69 6c 65 20  he size of file 
33490 70 42 74 46 72 6f 6d 20 6d 61 79 20 62 65 20 72  pBtFrom may be r
334a0 65 64 75 63 65 64 20 62 79 20 74 68 69 73 20 6f  educed by this o
334b0 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20 49 66 20  peration..** If 
334c0 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72  anything goes wr
334d0 6f 6e 67 2c 20 74 68 65 20 74 72 61 6e 73 61 63  ong, the transac
334e0 74 69 6f 6e 20 6f 6e 20 70 42 74 46 72 6f 6d 20  tion on pBtFrom 
334f0 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  is rolled back..
33500 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
33510 72 65 65 43 6f 70 79 46 69 6c 65 28 42 74 72 65  reeCopyFile(Btre
33520 65 20 2a 70 54 6f 2c 20 42 74 72 65 65 20 2a 70  e *pTo, Btree *p
33530 46 72 6f 6d 29 7b 0a 20 20 69 6e 74 20 72 63 20  From){.  int rc 
33540 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
33550 67 6e 6f 20 69 2c 20 6e 50 61 67 65 2c 20 6e 54  gno i, nPage, nT
33560 6f 50 61 67 65 2c 20 69 53 6b 69 70 3b 0a 0a 20  oPage, iSkip;.. 
33570 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 54 6f   BtShared *pBtTo
33580 20 3d 20 70 54 6f 2d 3e 70 42 74 3b 0a 20 20 42   = pTo->pBt;.  B
33590 74 53 68 61 72 65 64 20 2a 70 42 74 46 72 6f 6d  tShared *pBtFrom
335a0 20 3d 20 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 0a   = pFrom->pBt;..
335b0 20 20 69 66 28 20 70 54 6f 2d 3e 69 6e 54 72 61    if( pTo->inTra
335c0 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns!=TRANS_WRITE 
335d0 7c 7c 20 70 46 72 6f 6d 2d 3e 69 6e 54 72 61 6e  || pFrom->inTran
335e0 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s!=TRANS_WRITE )
335f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
33600 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
33610 20 69 66 28 20 70 42 74 54 6f 2d 3e 70 43 75 72   if( pBtTo->pCur
33620 73 6f 72 20 29 20 72 65 74 75 72 6e 20 53 51 4c  sor ) return SQL
33630 49 54 45 5f 42 55 53 59 3b 0a 20 20 6e 54 6f 50  ITE_BUSY;.  nToP
33640 61 67 65 20 3d 20 73 71 6c 69 74 65 33 70 61 67  age = sqlite3pag
33650 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 42 74  er_pagecount(pBt
33660 54 6f 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 6e  To->pPager);.  n
33670 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 70 61  Page = sqlite3pa
33680 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 42  ger_pagecount(pB
33690 74 46 72 6f 6d 2d 3e 70 50 61 67 65 72 29 3b 0a  tFrom->pPager);.
336a0 20 20 69 53 6b 69 70 20 3d 20 50 45 4e 44 49 4e    iSkip = PENDIN
336b0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 54  G_BYTE_PAGE(pBtT
336c0 6f 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 72  o);.  for(i=1; r
336d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
336e0 69 3c 3d 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  i<=nPage; i++){.
336f0 20 20 20 20 76 6f 69 64 20 2a 70 50 61 67 65 3b      void *pPage;
33700 0a 20 20 20 20 69 66 28 20 69 3d 3d 69 53 6b 69  .    if( i==iSki
33710 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  p ) continue;.  
33720 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
33730 67 65 72 5f 67 65 74 28 70 42 74 46 72 6f 6d 2d  ger_get(pBtFrom-
33740 3e 70 50 61 67 65 72 2c 20 69 2c 20 26 70 50 61  >pPager, i, &pPa
33750 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
33760 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 72 63 20  ) break;.    rc 
33770 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f  = sqlite3pager_o
33780 76 65 72 77 72 69 74 65 28 70 42 74 54 6f 2d 3e  verwrite(pBtTo->
33790 70 50 61 67 65 72 2c 20 69 2c 20 70 50 61 67 65  pPager, i, pPage
337a0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
337b0 62 72 65 61 6b 3b 0a 20 20 20 20 73 71 6c 69 74  break;.    sqlit
337c0 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70 50  e3pager_unref(pP
337d0 61 67 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  age);.  }.  for(
337e0 69 3d 6e 50 61 67 65 2b 31 3b 20 72 63 3d 3d 53  i=nPage+1; rc==S
337f0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 3d 6e  QLITE_OK && i<=n
33800 54 6f 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  ToPage; i++){.  
33810 20 20 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20    void *pPage;. 
33820 20 20 20 69 66 28 20 69 3d 3d 69 53 6b 69 70 20     if( i==iSkip 
33830 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
33840 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
33850 72 5f 67 65 74 28 70 42 74 54 6f 2d 3e 70 50 61  r_get(pBtTo->pPa
33860 67 65 72 2c 20 69 2c 20 26 70 50 61 67 65 29 3b  ger, i, &pPage);
33870 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72  .    if( rc ) br
33880 65 61 6b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  eak;.    rc = sq
33890 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
338a0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 73 71 6c  (pPage);.    sql
338b0 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28  ite3pager_unref(
338c0 70 50 61 67 65 29 3b 0a 20 20 20 20 73 71 6c 69  pPage);.    sqli
338d0 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 77 72  te3pager_dont_wr
338e0 69 74 65 28 70 42 74 54 6f 2d 3e 70 50 61 67 65  ite(pBtTo->pPage
338f0 72 2c 20 69 29 3b 0a 20 20 7d 0a 20 20 69 66 28  r, i);.  }.  if(
33900 20 21 72 63 20 26 26 20 6e 50 61 67 65 3c 6e 54   !rc && nPage<nT
33910 6f 50 61 67 65 20 29 7b 0a 20 20 20 20 72 63 20  oPage ){.    rc 
33920 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 74  = sqlite3pager_t
33930 72 75 6e 63 61 74 65 28 70 42 74 54 6f 2d 3e 70  runcate(pBtTo->p
33940 50 61 67 65 72 2c 20 6e 50 61 67 65 29 3b 0a 20  Pager, nPage);. 
33950 20 7d 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20   }.  if( rc ){. 
33960 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52     sqlite3BtreeR
33970 6f 6c 6c 62 61 63 6b 28 70 54 6f 29 3b 0a 20 20  ollback(pTo);.  
33980 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20  }.  return rc;  
33990 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
339a0 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 20  ITE_OMIT_VACUUM 
339b0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
339c0 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 61 20 74   non-zero if a t
339d0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
339e0 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tive..*/.int sql
339f0 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
33a00 6e 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ns(Btree *p){.  
33a10 72 65 74 75 72 6e 20 28 70 20 26 26 20 28 70 2d  return (p && (p-
33a20 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
33a30 57 52 49 54 45 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  WRITE));.}../*.*
33a40 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  * Return non-zer
33a50 6f 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74  o if a statement
33a60 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
33a70 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73  active..*/.int s
33a80 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 53  qlite3BtreeIsInS
33a90 74 6d 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  tmt(Btree *p){. 
33aa0 20 72 65 74 75 72 6e 20 28 70 2d 3e 70 42 74 20   return (p->pBt 
33ab0 26 26 20 70 2d 3e 70 42 74 2d 3e 69 6e 53 74 6d  && p->pBt->inStm
33ac0 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  t);.}../*.** Ret
33ad0 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  urn non-zero if 
33ae0 61 20 72 65 61 64 20 28 6f 72 20 77 72 69 74 65  a read (or write
33af0 29 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  ) transaction is
33b00 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20   active..*/.int 
33b10 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
33b20 52 65 61 64 54 72 61 6e 73 28 42 74 72 65 65 20  ReadTrans(Btree 
33b30 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70  *p){.  return (p
33b40 20 26 26 20 28 70 2d 3e 69 6e 54 72 61 6e 73 21   && (p->inTrans!
33b50 3d 54 52 41 4e 53 5f 4e 4f 4e 45 29 29 3b 0a 7d  =TRANS_NONE));.}
33b60 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c  ../*.** This cal
33b70 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  l is a no-op if 
33b80 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  no write-transac
33b90 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c  tion is currentl
33ba0 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e  y active on pBt.
33bb0 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
33bc0 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62  , sync the datab
33bd0 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65  ase file for the
33be0 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73   btree pBt. zMas
33bf0 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a  ter points to.**
33c00 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d   the name of a m
33c10 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
33c20 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  le that should b
33c30 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
33c40 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c  he.** individual
33c50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f   journal file, o
33c60 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63  r is NULL, indic
33c70 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20  ating no master 
33c80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a  journal file .**
33c90 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73   (single databas
33ca0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a  e transaction)..
33cb0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
33cc0 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d  is called, the m
33cd0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68  aster journal sh
33ce0 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76  ould already hav
33cf0 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65  e been.** create
33d00 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  d, populated wit
33d10 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70  h this journal p
33d20 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65  ointer and synce
33d30 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  d to disk..**.**
33d40 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f   Once this is ro
33d50 75 74 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e  utine has return
33d60 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69  ed, the only thi
33d70 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f 20 63  ng required to c
33d80 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69  ommit.** the wri
33d90 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66  te-transaction f
33da0 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65  or this database
33db0 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65   file is to dele
33dc0 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  te the journal..
33dd0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
33de0 72 65 65 53 79 6e 63 28 42 74 72 65 65 20 2a 70  reeSync(Btree *p
33df0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
33e00 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
33e10 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
33e20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
33e30 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
33e40 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
33e50 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 50   = p->pBt;.    P
33e60 67 6e 6f 20 6e 54 72 75 6e 63 20 3d 20 30 3b 0a  gno nTrunc = 0;.
33e70 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
33e80 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
33e90 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
33ea0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
33eb0 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43  rc = autoVacuumC
33ec0 6f 6d 6d 69 74 28 70 42 74 2c 20 26 6e 54 72 75  ommit(pBt, &nTru
33ed0 6e 63 29 3b 20 0a 20 20 20 20 20 20 69 66 28 20  nc); .      if( 
33ee0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
33ef0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
33f00 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
33f10 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20  }.#endif.    rc 
33f20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  = sqlite3pager_s
33f30 79 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ync(pBt->pPager,
33f40 20 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e 63   zMaster, nTrunc
33f50 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
33f60 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
33f70 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
33f80 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
33f90 61 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79  a blob of memory
33fa0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
33fb0 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 73 68 61  .** a single sha
33fc0 72 65 64 2d 62 74 72 65 65 2e 20 54 68 65 20 6d  red-btree. The m
33fd0 65 6d 6f 72 79 20 69 73 20 75 73 65 64 20 62 79  emory is used by
33fe0 20 63 6c 69 65 6e 74 20 63 6f 64 65 20 66 6f 72   client code for
33ff0 20 69 74 27 73 20 6f 77 6e 0a 2a 2a 20 70 75 72   it's own.** pur
34000 70 6f 73 65 73 20 28 66 6f 72 20 65 78 61 6d 70  poses (for examp
34010 6c 65 2c 20 74 6f 20 73 74 6f 72 65 20 61 20 68  le, to store a h
34020 69 67 68 2d 6c 65 76 65 6c 20 73 63 68 65 6d 61  igh-level schema
34030 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
34040 20 0a 2a 2a 20 74 68 65 20 73 68 61 72 65 64 2d   .** the shared-
34050 62 74 72 65 65 29 2e 20 54 68 65 20 62 74 72 65  btree). The btre
34060 65 20 6c 61 79 65 72 20 6d 61 6e 61 67 65 73 20  e layer manages 
34070 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 69  reference counti
34080 6e 67 20 69 73 73 75 65 73 2e 0a 2a 2a 0a 2a 2a  ng issues..**.**
34090 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
340a0 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 6f  this is called o
340b0 6e 20 61 20 73 68 61 72 65 64 2d 62 74 72 65 65  n a shared-btree
340c0 2c 20 6e 42 79 74 65 73 20 62 79 74 65 73 20 6f  , nBytes bytes o
340d0 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 72 65 20  f memory.** are 
340e0 61 6c 6c 6f 63 61 74 65 64 2c 20 7a 65 72 6f 65  allocated, zeroe
340f0 64 2c 20 61 6e 64 20 72 65 74 75 72 6e 65 64 20  d, and returned 
34100 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 46  to the caller. F
34110 6f 72 20 65 61 63 68 20 73 75 62 73 65 71 75 65  or each subseque
34120 6e 74 20 0a 2a 2a 20 63 61 6c 6c 20 74 68 65 20  nt .** call the 
34130 6e 42 79 74 65 73 20 70 61 72 61 6d 65 74 65 72  nBytes parameter
34140 20 69 73 20 69 67 6e 6f 72 65 64 20 61 6e 64 20   is ignored and 
34150 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
34160 20 73 61 6d 65 20 62 6c 6f 62 0a 2a 2a 20 6f 66   same blob.** of
34170 20 6d 65 6d 6f 72 79 20 72 65 74 75 72 6e 65 64   memory returned
34180 2e 20 0a 2a 2a 0a 2a 2a 20 4a 75 73 74 20 62 65  . .**.** Just be
34190 66 6f 72 65 20 74 68 65 20 73 68 61 72 65 64 2d  fore the shared-
341a0 62 74 72 65 65 20 69 73 20 63 6c 6f 73 65 64 2c  btree is closed,
341b0 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 70 61   the function pa
341c0 73 73 65 64 20 61 73 20 74 68 65 20 0a 2a 2a 20  ssed as the .** 
341d0 78 46 72 65 65 20 61 72 67 75 6d 65 6e 74 20 77  xFree argument w
341e0 68 65 6e 20 74 68 65 20 6d 65 6d 6f 72 79 20 61  hen the memory a
341f0 6c 6c 6f 63 61 74 69 6f 6e 20 77 61 73 20 6d 61  llocation was ma
34200 64 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e  de is invoked on
34210 20 74 68 65 20 0a 2a 2a 20 62 6c 6f 62 20 6f 66   the .** blob of
34220 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72   allocated memor
34230 79 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  y. This function
34240 20 73 68 6f 75 6c 64 20 6e 6f 74 20 63 61 6c 6c   should not call
34250 20 73 71 6c 69 74 65 46 72 65 65 28 29 0a 2a 2a   sqliteFree().**
34260 20 6f 6e 20 74 68 65 20 6d 65 6d 6f 72 79 2c 20   on the memory, 
34270 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 20  the btree layer 
34280 64 6f 65 73 20 74 68 61 74 2e 0a 2a 2f 0a 76 6f  does that..*/.vo
34290 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  id *sqlite3Btree
342a0 53 63 68 65 6d 61 28 42 74 72 65 65 20 2a 70 2c  Schema(Btree *p,
342b0 20 69 6e 74 20 6e 42 79 74 65 73 2c 20 76 6f 69   int nBytes, voi
342c0 64 28 2a 78 46 72 65 65 29 28 76 6f 69 64 20 2a  d(*xFree)(void *
342d0 29 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  )){.  BtShared *
342e0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
342f0 69 66 28 20 21 70 42 74 2d 3e 70 53 63 68 65 6d  if( !pBt->pSchem
34300 61 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 53  a ){.    pBt->pS
34310 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 4d 61  chema = sqliteMa
34320 6c 6c 6f 63 28 6e 42 79 74 65 73 29 3b 0a 20 20  lloc(nBytes);.  
34330 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65    pBt->xFreeSche
34340 6d 61 20 3d 20 78 46 72 65 65 3b 0a 20 20 7d 0a  ma = xFree;.  }.
34350 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 70 53    return pBt->pS
34360 63 68 65 6d 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  chema;.}../*.** 
34370 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61  Return true if a
34380 6e 6f 74 68 65 72 20 75 73 65 72 20 6f 66 20 74  nother user of t
34390 68 65 20 73 61 6d 65 20 73 68 61 72 65 64 20 62  he same shared b
343a0 74 72 65 65 20 61 73 20 74 68 65 20 61 72 67 75  tree as the argu
343b0 6d 65 6e 74 0a 2a 2a 20 68 61 6e 64 6c 65 20 68  ment.** handle h
343c0 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76  olds an exclusiv
343d0 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 73 71  e lock on the sq
343e0 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
343f0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
34400 33 42 74 72 65 65 53 63 68 65 6d 61 4c 6f 63 6b  3BtreeSchemaLock
34410 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ed(Btree *p){.  
34420 72 65 74 75 72 6e 20 28 71 75 65 72 79 54 61 62  return (queryTab
34430 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52  leLock(p, MASTER
34440 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b  _ROOT, READ_LOCK
34450 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d  )!=SQLITE_OK);.}
34460 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
34470 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
34480 43 48 45 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e  CHE./*.** Obtain
34490 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74   a lock on the t
344a0 61 62 6c 65 20 77 68 6f 73 65 20 72 6f 6f 74 20  able whose root 
344b0 70 61 67 65 20 69 73 20 69 54 61 62 2e 20 20 54  page is iTab.  T
344c0 68 65 0a 2a 2a 20 6c 6f 63 6b 20 69 73 20 61 20  he.** lock is a 
344d0 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 69 73  write lock if is
344e0 57 72 69 74 65 6c 6f 63 6b 20 69 73 20 74 72 75  Writelock is tru
344f0 65 20 6f 72 20 61 20 72 65 61 64 20 6c 6f 63 6b  e or a read lock
34500 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 66 61 6c  .** if it is fal
34510 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
34520 65 33 42 74 72 65 65 4c 6f 63 6b 54 61 62 6c 65  e3BtreeLockTable
34530 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69  (Btree *p, int i
34540 54 61 62 2c 20 75 38 20 69 73 57 72 69 74 65 4c  Tab, u8 isWriteL
34550 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ock){.  int rc =
34560 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38   SQLITE_OK;.  u8
34570 20 6c 6f 63 6b 54 79 70 65 20 3d 20 28 69 73 57   lockType = (isW
34580 72 69 74 65 4c 6f 63 6b 3f 57 52 49 54 45 5f 4c  riteLock?WRITE_L
34590 4f 43 4b 3a 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a  OCK:READ_LOCK);.
345a0 20 20 72 63 20 3d 20 71 75 65 72 79 54 61 62 6c    rc = queryTabl
345b0 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 2c 20 6c  eLock(p, iTab, l
345c0 6f 63 6b 54 79 70 65 29 3b 0a 20 20 69 66 28 20  ockType);.  if( 
345d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
345e0 0a 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 54 61  .    rc = lockTa
345f0 62 6c 65 28 70 2c 20 69 54 61 62 2c 20 6c 6f 63  ble(p, iTab, loc
34600 6b 54 79 70 65 29 3b 0a 20 20 7d 0a 20 20 72 65  kType);.  }.  re
34610 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
34620 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
34630 6c 6f 77 69 6e 67 20 64 65 62 75 67 67 69 6e 67  lowing debugging
34640 20 69 6e 74 65 72 66 61 63 65 20 68 61 73 20 74   interface has t
34650 6f 20 62 65 20 69 6e 20 74 68 69 73 20 66 69 6c  o be in this fil
34660 65 20 28 72 61 74 68 65 72 0a 2a 2a 20 74 68 61  e (rather.** tha
34670 6e 20 69 6e 2c 20 66 6f 72 20 65 78 61 6d 70 6c  n in, for exampl
34680 65 2c 20 74 65 73 74 31 2e 63 29 20 73 6f 20 74  e, test1.c) so t
34690 68 61 74 20 69 74 20 63 61 6e 20 67 65 74 20 61  hat it can get a
346a0 63 63 65 73 73 20 74 6f 0a 2a 2a 20 74 68 65 20  ccess to.** the 
346b0 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 42 74  definition of Bt
346c0 53 68 61 72 65 64 2e 0a 2a 2f 0a 23 69 66 20 64  Shared..*/.#if d
346d0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
346e0 42 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28  BUG) && defined(
346f0 54 43 4c 53 48 29 0a 23 69 6e 63 6c 75 64 65 20  TCLSH).#include 
34700 3c 74 63 6c 2e 68 3e 0a 69 6e 74 20 73 71 6c 69  <tcl.h>.int sqli
34710 74 65 33 5f 73 68 61 72 65 64 5f 63 61 63 68 65  te3_shared_cache
34720 5f 72 65 70 6f 72 74 28 0a 20 20 76 6f 69 64 20  _report(.  void 
34730 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
34740 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
34750 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
34760 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
34770 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64   objv[].){.#ifnd
34780 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
34790 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 63 6f  HARED_CACHE.  co
347a0 6e 73 74 20 54 68 72 65 61 64 44 61 74 61 20 2a  nst ThreadData *
347b0 70 54 64 20 3d 20 73 71 6c 69 74 65 33 54 68 72  pTd = sqlite3Thr
347c0 65 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79 28  eadDataReadOnly(
347d0 29 3b 0a 20 20 69 66 28 20 70 54 64 2d 3e 75 73  );.  if( pTd->us
347e0 65 53 68 61 72 65 64 44 61 74 61 20 29 7b 0a 20  eSharedData ){. 
347f0 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
34800 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  ;.    Tcl_Obj *p
34810 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  Ret = Tcl_NewObj
34820 28 29 3b 0a 20 20 20 20 66 6f 72 28 70 42 74 3d  ();.    for(pBt=
34830 70 54 64 2d 3e 70 42 74 72 65 65 3b 20 70 42 74  pTd->pBtree; pBt
34840 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74  ; pBt=pBt->pNext
34850 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
34860 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c  har *zFile = sql
34870 69 74 65 33 70 61 67 65 72 5f 66 69 6c 65 6e 61  ite3pager_filena
34880 6d 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  me(pBt->pPager);
34890 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  .      Tcl_ListO
348a0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
348b0 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63  interp, pRet, Tc
348c0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
348d0 46 69 6c 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20  File, -1));.    
348e0 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
348f0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
34900 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  p, pRet, Tcl_New
34910 49 6e 74 4f 62 6a 28 70 42 74 2d 3e 6e 52 65 66  IntObj(pBt->nRef
34920 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  ));.    }.    Tc
34930 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
34940 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20 20  nterp, pRet);.  
34950 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
34960 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  n TCL_OK;.}.#end
34970 69 66 0a                                         if.