/ Hex Artifact Content
Login

Artifact 434a3584766e85ca3b23d37adb9c457d83f5cf19:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 24 49 64 3a 20 62 74 72 65 65 2e  *.** $Id: btree.
0180: 63 2c 76 20 31 2e 33 34 34 20 32 30 30 37 2f 30  c,v 1.344 2007/0
0190: 33 2f 32 39 20 30 34 3a 34 33 3a 32 36 20 64 72  3/29 04:43:26 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 2d 31 29 20 7c 20  .. | Key(N-1) | 
03d0: 50 74 72 28 4e 29 20 7c 0a 2a 2a 20 20 20 2d 2d  Ptr(N) |.**   --
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 29 20  ys.** on Ptr(N) 
0500: 61 6e 64 20 69 74 73 20 73 75 62 70 61 67 65 73  and its subpages
0510: 20 68 61 76 65 20 76 61 6c 75 65 73 20 67 72 65   have values gre
0520: 61 74 65 72 20 74 68 61 6e 20 4b 65 79 28 4e 2d  ater than Key(N-
0530: 31 29 2e 20 20 41 6e 64 0a 2a 2a 20 73 6f 20 66  1).  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: 29 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 6f 74  ) pointer and ot
07f0: 68 65 72 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  her.** informati
0800: 6f 6e 20 73 75 63 68 20 61 73 20 74 68 65 20 73  on such as the s
0810: 69 7a 65 20 6f 66 20 6b 65 79 20 61 6e 64 20 64  ize of key and d
0820: 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 46 4f 52 4d 41  ata..**.** FORMA
0830: 54 20 44 45 54 41 49 4c 53 0a 2a 2a 0a 2a 2a 20  T DETAILS.**.** 
0840: 54 68 65 20 66 69 6c 65 20 69 73 20 64 69 76 69  The file is divi
0850: 64 65 64 20 69 6e 74 6f 20 70 61 67 65 73 2e 20  ded into pages. 
0860: 20 54 68 65 20 66 69 72 73 74 20 70 61 67 65 20   The first page 
0870: 69 73 20 63 61 6c 6c 65 64 20 70 61 67 65 20 31  is called page 1
0880: 2c 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e 64 20  ,.** the second 
0890: 69 73 20 70 61 67 65 20 32 2c 20 61 6e 64 20 73  is page 2, and s
08a0: 6f 20 66 6f 72 74 68 2e 20 20 41 20 70 61 67 65  o forth.  A page
08b0: 20 6e 75 6d 62 65 72 20 6f 66 20 7a 65 72 6f 20   number of zero 
08c0: 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 22 6e 6f  indicates.** "no
08d0: 20 73 75 63 68 20 70 61 67 65 22 2e 20 20 54 68   such page".  Th
08e0: 65 20 70 61 67 65 20 73 69 7a 65 20 63 61 6e 20  e page size can 
08f0: 62 65 20 61 6e 79 74 68 69 6e 67 20 62 65 74 77  be anything betw
0900: 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33  een 512 and 6553
0910: 36 2e 0a 2a 2a 20 45 61 63 68 20 70 61 67 65 20  6..** Each page 
0920: 63 61 6e 20 62 65 20 65 69 74 68 65 72 20 61 20  can be either a 
0930: 62 74 72 65 65 20 70 61 67 65 2c 20 61 20 66 72  btree page, a fr
0940: 65 65 6c 69 73 74 20 70 61 67 65 20 6f 72 20 61  eelist page or a
0950: 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61  n overflow.** pa
0960: 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ge..**.** The fi
0970: 72 73 74 20 70 61 67 65 20 69 73 20 61 6c 77 61  rst page is alwa
0980: 79 73 20 61 20 62 74 72 65 65 20 70 61 67 65 2e  ys a btree page.
0990: 20 20 54 68 65 20 66 69 72 73 74 20 31 30 30 20    The first 100 
09a0: 62 79 74 65 73 20 6f 66 20 74 68 65 20 66 69 72  bytes of the fir
09b0: 73 74 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74 61  st.** page conta
09c0: 69 6e 20 61 20 73 70 65 63 69 61 6c 20 68 65 61  in a special hea
09d0: 64 65 72 20 28 74 68 65 20 22 66 69 6c 65 20 68  der (the "file h
09e0: 65 61 64 65 72 22 29 20 74 68 61 74 20 64 65 73  eader") that des
09f0: 63 72 69 62 65 73 20 74 68 65 20 66 69 6c 65 2e  cribes the file.
0a00: 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 6f  .** The format o
0a10: 66 20 74 68 65 20 66 69 6c 65 20 68 65 61 64 65  f the file heade
0a20: 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  r is as follows:
0a30: 0a 2a 2a 0a 2a 2a 20 20 20 4f 46 46 53 45 54 20  .**.**   OFFSET 
0a40: 20 20 53 49 5a 45 20 20 20 20 44 45 53 43 52 49    SIZE    DESCRI
0a50: 50 54 49 4f 4e 0a 2a 2a 20 20 20 20 20 20 30 20  PTION.**      0 
0a60: 20 20 20 20 20 31 36 20 20 20 20 20 48 65 61 64       16     Head
0a70: 65 72 20 73 74 72 69 6e 67 3a 20 22 53 51 4c 69  er string: "SQLi
0a80: 74 65 20 66 6f 72 6d 61 74 20 33 5c 30 30 30 22  te format 3\000"
0a90: 0a 2a 2a 20 20 20 20 20 31 36 20 20 20 20 20 20  .**     16      
0aa0: 20 32 20 20 20 20 20 50 61 67 65 20 73 69 7a 65   2     Page size
0ab0: 20 69 6e 20 62 79 74 65 73 2e 20 20 0a 2a 2a 20   in bytes.  .** 
0ac0: 20 20 20 20 31 38 20 20 20 20 20 20 20 31 20 20      18       1  
0ad0: 20 20 20 46 69 6c 65 20 66 6f 72 6d 61 74 20 77     File format w
0ae0: 72 69 74 65 20 76 65 72 73 69 6f 6e 0a 2a 2a 20  rite version.** 
0af0: 20 20 20 20 31 39 20 20 20 20 20 20 20 31 20 20      19       1  
0b00: 20 20 20 46 69 6c 65 20 66 6f 72 6d 61 74 20 72     File format r
0b10: 65 61 64 20 76 65 72 73 69 6f 6e 0a 2a 2a 20 20  ead version.**  
0b20: 20 20 20 32 30 20 20 20 20 20 20 20 31 20 20 20     20       1   
0b30: 20 20 42 79 74 65 73 20 6f 66 20 75 6e 75 73 65    Bytes of unuse
0b40: 64 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65  d space at the e
0b50: 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67 65 0a  nd of each page.
0b60: 2a 2a 20 20 20 20 20 32 31 20 20 20 20 20 20 20  **     21       
0b70: 31 20 20 20 20 20 4d 61 78 20 65 6d 62 65 64 64  1     Max embedd
0b80: 65 64 20 70 61 79 6c 6f 61 64 20 66 72 61 63 74  ed payload fract
0b90: 69 6f 6e 0a 2a 2a 20 20 20 20 20 32 32 20 20 20  ion.**     22   
0ba0: 20 20 20 20 31 20 20 20 20 20 4d 69 6e 20 65 6d      1     Min em
0bb0: 62 65 64 64 65 64 20 70 61 79 6c 6f 61 64 20 66  bedded payload f
0bc0: 72 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 32  raction.**     2
0bd0: 33 20 20 20 20 20 20 20 31 20 20 20 20 20 4d 69  3       1     Mi
0be0: 6e 20 6c 65 61 66 20 70 61 79 6c 6f 61 64 20 66  n leaf payload f
0bf0: 72 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 32  raction.**     2
0c00: 34 20 20 20 20 20 20 20 34 20 20 20 20 20 46 69  4       4     Fi
0c10: 6c 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  le change counte
0c20: 72 0a 2a 2a 20 20 20 20 20 32 38 20 20 20 20 20  r.**     28     
0c30: 20 20 34 20 20 20 20 20 52 65 73 65 72 76 65 64    4     Reserved
0c40: 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 0a   for future use.
0c50: 2a 2a 20 20 20 20 20 33 32 20 20 20 20 20 20 20  **     32       
0c60: 34 20 20 20 20 20 46 69 72 73 74 20 66 72 65 65  4     First free
0c70: 6c 69 73 74 20 70 61 67 65 0a 2a 2a 20 20 20 20  list page.**    
0c80: 20 33 36 20 20 20 20 20 20 20 34 20 20 20 20 20   36       4     
0c90: 4e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 6c 69  Number of freeli
0ca0: 73 74 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  st pages in the 
0cb0: 66 69 6c 65 0a 2a 2a 20 20 20 20 20 34 30 20 20  file.**     40  
0cc0: 20 20 20 20 36 30 20 20 20 20 20 31 35 20 34 2d      60     15 4-
0cd0: 62 79 74 65 20 6d 65 74 61 20 76 61 6c 75 65 73  byte meta values
0ce0: 20 70 61 73 73 65 64 20 74 6f 20 68 69 67 68 65   passed to highe
0cf0: 72 20 6c 61 79 65 72 73 0a 2a 2a 0a 2a 2a 20 41  r layers.**.** A
0d00: 6c 6c 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  ll of the intege
0d10: 72 20 76 61 6c 75 65 73 20 61 72 65 20 62 69 67  r values are big
0d20: 2d 65 6e 64 69 61 6e 20 28 6d 6f 73 74 20 73 69  -endian (most si
0d30: 67 6e 69 66 69 63 61 6e 74 20 62 79 74 65 20 66  gnificant byte f
0d40: 69 72 73 74 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  irst)..**.** The
0d50: 20 66 69 6c 65 20 63 68 61 6e 67 65 20 63 6f 75   file change cou
0d60: 6e 74 65 72 20 69 73 20 69 6e 63 72 65 6d 65 6e  nter is incremen
0d70: 74 65 64 20 77 68 65 6e 20 74 68 65 20 64 61 74  ted when the dat
0d80: 61 62 61 73 65 20 69 73 20 63 68 61 6e 67 65 64  abase is changed
0d90: 20 6d 6f 72 65 0a 2a 2a 20 74 68 61 6e 20 6f 6e   more.** than on
0da0: 63 65 20 77 69 74 68 69 6e 20 74 68 65 20 73 61  ce within the sa
0db0: 6d 65 20 73 65 63 6f 6e 64 2e 20 20 54 68 69 73  me second.  This
0dc0: 20 63 6f 75 6e 74 65 72 2c 20 74 6f 67 65 74 68   counter, togeth
0dd0: 65 72 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 6d  er with the.** m
0de0: 6f 64 69 66 69 63 61 74 69 6f 6e 20 74 69 6d 65  odification time
0df0: 20 6f 66 20 74 68 65 20 66 69 6c 65 2c 20 61 6c   of the file, al
0e00: 6c 6f 77 73 20 6f 74 68 65 72 20 70 72 6f 63 65  lows other proce
0e10: 73 73 65 73 20 74 6f 20 6b 6e 6f 77 0a 2a 2a 20  sses to know.** 
0e20: 77 68 65 6e 20 74 68 65 20 66 69 6c 65 20 68 61  when the file ha
0e30: 73 20 63 68 61 6e 67 65 64 20 61 6e 64 20 74 68  s changed and th
0e40: 75 73 20 77 68 65 6e 20 74 68 65 79 20 6e 65 65  us when they nee
0e50: 64 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72  d to flush their
0e60: 0a 2a 2a 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a  .** cache..**.**
0e70: 20 54 68 65 20 6d 61 78 20 65 6d 62 65 64 64 65   The max embedde
0e80: 64 20 70 61 79 6c 6f 61 64 20 66 72 61 63 74 69  d payload fracti
0e90: 6f 6e 20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74  on is the amount
0ea0: 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 75 73   of the total us
0eb0: 61 62 6c 65 0a 2a 2a 20 73 70 61 63 65 20 69 6e  able.** space in
0ec0: 20 61 20 70 61 67 65 20 74 68 61 74 20 63 61 6e   a page that can
0ed0: 20 62 65 20 63 6f 6e 73 75 6d 65 64 20 62 79 20   be consumed by 
0ee0: 61 20 73 69 6e 67 6c 65 20 63 65 6c 6c 20 66 6f  a single cell fo
0ef0: 72 20 73 74 61 6e 64 61 72 64 0a 2a 2a 20 42 2d  r standard.** B-
0f00: 74 72 65 65 20 28 6e 6f 6e 2d 4c 45 41 46 44 41  tree (non-LEAFDA
0f10: 54 41 29 20 74 61 62 6c 65 73 2e 20 20 41 20 76  TA) tables.  A v
0f20: 61 6c 75 65 20 6f 66 20 32 35 35 20 6d 65 61 6e  alue of 255 mean
0f30: 73 20 31 30 30 25 2e 20 20 54 68 65 20 64 65 66  s 100%.  The def
0f40: 61 75 6c 74 0a 2a 2a 20 69 73 20 74 6f 20 6c 69  ault.** is to li
0f50: 6d 69 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  mit the maximum 
0f60: 63 65 6c 6c 20 73 69 7a 65 20 73 6f 20 74 68 61  cell size so tha
0f70: 74 20 61 74 20 6c 65 61 73 74 20 34 20 63 65 6c  t at least 4 cel
0f80: 6c 73 20 77 69 6c 6c 20 66 69 74 0a 2a 2a 20 6f  ls will fit.** o
0f90: 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 54 68 75  n one page.  Thu
0fa0: 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 6d 61  s the default ma
0fb0: 78 20 65 6d 62 65 64 64 65 64 20 70 61 79 6c 6f  x embedded paylo
0fc0: 61 64 20 66 72 61 63 74 69 6f 6e 20 69 73 20 36  ad fraction is 6
0fd0: 34 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  4..**.** If the 
0fe0: 70 61 79 6c 6f 61 64 20 66 6f 72 20 61 20 63 65  payload for a ce
0ff0: 6c 6c 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  ll is larger tha
1000: 6e 20 74 68 65 20 6d 61 78 20 70 61 79 6c 6f 61  n the max payloa
1010: 64 2c 20 74 68 65 6e 20 65 78 74 72 61 0a 2a 2a  d, then extra.**
1020: 20 70 61 79 6c 6f 61 64 20 69 73 20 73 70 69 6c   payload is spil
1030: 6c 65 64 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  led to overflow 
1040: 70 61 67 65 73 2e 20 20 4f 6e 63 65 20 61 6e 20  pages.  Once an 
1050: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
1060: 20 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20 61   allocated,.** a
1070: 73 20 6d 61 6e 79 20 62 79 74 65 73 20 61 73 20  s many bytes as 
1080: 70 6f 73 73 69 62 6c 65 20 61 72 65 20 6d 6f 76  possible are mov
1090: 65 64 20 69 6e 74 6f 20 74 68 65 20 6f 76 65 72  ed into the over
10a0: 66 6c 6f 77 20 70 61 67 65 73 20 77 69 74 68 6f  flow pages witho
10b0: 75 74 20 6c 65 74 74 69 6e 67 0a 2a 2a 20 74 68  ut letting.** th
10c0: 65 20 63 65 6c 6c 20 73 69 7a 65 20 64 72 6f 70  e cell size drop
10d0: 20 62 65 6c 6f 77 20 74 68 65 20 6d 69 6e 20 65   below the min e
10e0: 6d 62 65 64 64 65 64 20 70 61 79 6c 6f 61 64 20  mbedded payload 
10f0: 66 72 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  fraction..**.** 
1100: 54 68 65 20 6d 69 6e 20 6c 65 61 66 20 70 61 79  The min leaf pay
1110: 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e 20 69 73  load fraction is
1120: 20 6c 69 6b 65 20 74 68 65 20 6d 69 6e 20 65 6d   like the min em
1130: 62 65 64 64 65 64 20 70 61 79 6c 6f 61 64 20 66  bedded payload f
1140: 72 61 63 74 69 6f 6e 0a 2a 2a 20 65 78 63 65 70  raction.** excep
1150: 74 20 74 68 61 74 20 69 74 20 61 70 70 6c 69 65  t that it applie
1160: 73 20 74 6f 20 6c 65 61 66 20 6e 6f 64 65 73 20  s to leaf nodes 
1170: 69 6e 20 61 20 4c 45 41 46 44 41 54 41 20 74 72  in a LEAFDATA tr
1180: 65 65 2e 20 20 54 68 65 20 6d 61 78 69 6d 75 6d  ee.  The maximum
1190: 0a 2a 2a 20 70 61 79 6c 6f 61 64 20 66 72 61 63  .** payload frac
11a0: 74 69 6f 6e 20 66 6f 72 20 61 20 4c 45 41 46 44  tion for a LEAFD
11b0: 41 54 41 20 74 72 65 65 20 69 73 20 61 6c 77 61  ATA tree is alwa
11c0: 79 73 20 31 30 30 25 20 28 6f 72 20 32 35 35 29  ys 100% (or 255)
11d0: 20 61 6e 64 20 69 74 0a 2a 2a 20 6e 6f 74 20 73   and it.** not s
11e0: 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20  pecified in the 
11f0: 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 61  header..**.** Ea
1200: 63 68 20 62 74 72 65 65 20 70 61 67 65 73 20 69  ch btree pages i
1210: 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f 20 74  s divided into t
1220: 68 72 65 65 20 73 65 63 74 69 6f 6e 73 3a 20 20  hree sections:  
1230: 54 68 65 20 68 65 61 64 65 72 2c 20 74 68 65 0a  The header, the.
1240: 2a 2a 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  ** cell pointer 
1250: 61 72 72 61 79 2c 20 61 6e 64 20 74 68 65 20 63  array, and the c
1260: 65 6c 6c 20 61 72 65 61 20 61 72 65 61 2e 20 20  ell area area.  
1270: 50 61 67 65 20 31 20 61 6c 73 6f 20 68 61 73 20  Page 1 also has 
1280: 61 20 31 30 30 2d 62 79 74 65 0a 2a 2a 20 66 69  a 100-byte.** fi
1290: 6c 65 20 68 65 61 64 65 72 20 74 68 61 74 20 6f  le header that o
12a0: 63 63 75 72 73 20 62 65 66 6f 72 65 20 74 68 65  ccurs before the
12b0: 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a 2a 2a   page header..**
12c0: 0a 2a 2a 20 20 20 20 20 20 7c 2d 2d 2d 2d 2d 2d  .**      |------
12d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 7c 0a 2a 2a 20 20  ----------|.**  
12e0: 20 20 20 20 7c 20 66 69 6c 65 20 68 65 61 64 65      | file heade
12f0: 72 20 20 20 20 7c 20 20 20 31 30 30 20 62 79 74  r    |   100 byt
1300: 65 73 2e 20 20 50 61 67 65 20 31 20 6f 6e 6c 79  es.  Page 1 only
1310: 2e 0a 2a 2a 20 20 20 20 20 20 7c 2d 2d 2d 2d 2d  ..**      |-----
1320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 7c 0a 2a 2a 20  -----------|.** 
1330: 20 20 20 20 20 7c 20 70 61 67 65 20 68 65 61 64       | page head
1340: 65 72 20 20 20 20 7c 20 20 20 38 20 62 79 74 65  er    |   8 byte
1350: 73 20 66 6f 72 20 6c 65 61 76 65 73 2e 20 20 31  s for leaves.  1
1360: 32 20 62 79 74 65 73 20 66 6f 72 20 69 6e 74 65  2 bytes for inte
1370: 72 69 6f 72 20 6e 6f 64 65 73 0a 2a 2a 20 20 20  rior nodes.**   
1380: 20 20 20 7c 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     |------------
1390: 2d 2d 2d 2d 7c 0a 2a 2a 20 20 20 20 20 20 7c 20  ----|.**      | 
13a0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 20 20 7c  cell pointer   |
13b0: 20 20 20 7c 20 20 32 20 62 79 74 65 73 20 70 65     |  2 bytes pe
13c0: 72 20 63 65 6c 6c 2e 20 20 53 6f 72 74 65 64 20  r cell.  Sorted 
13d0: 6f 72 64 65 72 2e 0a 2a 2a 20 20 20 20 20 20 7c  order..**      |
13e0: 20 61 72 72 61 79 20 20 20 20 20 20 20 20 20 20   array          
13f0: 7c 20 20 20 7c 20 20 47 72 6f 77 73 20 64 6f 77  |   |  Grows dow
1400: 6e 77 61 72 64 0a 2a 2a 20 20 20 20 20 20 7c 20  nward.**      | 
1410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1420: 20 20 20 76 0a 2a 2a 20 20 20 20 20 20 7c 2d 2d     v.**      |--
1430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 7c 0a  --------------|.
1440: 2a 2a 20 20 20 20 20 20 7c 20 75 6e 61 6c 6c 6f  **      | unallo
1450: 63 61 74 65 64 20 20 20 20 7c 0a 2a 2a 20 20 20  cated    |.**   
1460: 20 20 20 7c 20 73 70 61 63 65 20 20 20 20 20 20     | space      
1470: 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 7c 2d      |.**      |-
1480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 7c  ---------------|
1490: 20 20 20 5e 20 20 47 72 6f 77 73 20 75 70 77 61     ^  Grows upwa
14a0: 72 64 73 0a 2a 2a 20 20 20 20 20 20 7c 20 63 65  rds.**      | ce
14b0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 20 20 7c 20 20  ll content   |  
14c0: 20 7c 20 20 41 72 62 69 74 72 61 72 79 20 6f 72   |  Arbitrary or
14d0: 64 65 72 20 69 6e 74 65 72 73 70 65 72 73 65 64  der interspersed
14e0: 20 77 69 74 68 20 66 72 65 65 62 6c 6f 63 6b 73   with freeblocks
14f0: 2e 0a 2a 2a 20 20 20 20 20 20 7c 20 61 72 65 61  ..**      | area
1500: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 7c             |   |
1510: 20 20 61 6e 64 20 66 72 65 65 20 73 70 61 63 65    and free space
1520: 20 66 72 61 67 6d 65 6e 74 73 2e 0a 2a 2a 20 20   fragments..**  
1530: 20 20 20 20 7c 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      |-----------
1540: 2d 2d 2d 2d 2d 7c 0a 2a 2a 0a 2a 2a 20 54 68 65  -----|.**.** The
1550: 20 70 61 67 65 20 68 65 61 64 65 72 73 20 6c 6f   page headers lo
1560: 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  oks like this:.*
1570: 2a 0a 2a 2a 20 20 20 4f 46 46 53 45 54 20 20 20  *.**   OFFSET   
1580: 53 49 5a 45 20 20 20 20 20 44 45 53 43 52 49 50  SIZE     DESCRIP
1590: 54 49 4f 4e 0a 2a 2a 20 20 20 20 20 20 30 20 20  TION.**      0  
15a0: 20 20 20 20 20 31 20 20 20 20 20 20 46 6c 61 67       1      Flag
15b0: 73 2e 20 31 3a 20 69 6e 74 6b 65 79 2c 20 32 3a  s. 1: intkey, 2:
15c0: 20 7a 65 72 6f 64 61 74 61 2c 20 34 3a 20 6c 65   zerodata, 4: le
15d0: 61 66 64 61 74 61 2c 20 38 3a 20 6c 65 61 66 0a  afdata, 8: leaf.
15e0: 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20 20 20  **      1       
15f0: 32 20 20 20 20 20 20 62 79 74 65 20 6f 66 66 73  2      byte offs
1600: 65 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  et to the first 
1610: 66 72 65 65 62 6c 6f 63 6b 0a 2a 2a 20 20 20 20  freeblock.**    
1620: 20 20 33 20 20 20 20 20 20 20 32 20 20 20 20 20    3       2     
1630: 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   number of cells
1640: 20 6f 6e 20 74 68 69 73 20 70 61 67 65 0a 2a 2a   on this page.**
1650: 20 20 20 20 20 20 35 20 20 20 20 20 20 20 32 20        5       2 
1660: 20 20 20 20 20 66 69 72 73 74 20 62 79 74 65 20       first byte 
1670: 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  of the cell cont
1680: 65 6e 74 20 61 72 65 61 0a 2a 2a 20 20 20 20 20  ent area.**     
1690: 20 37 20 20 20 20 20 20 20 31 20 20 20 20 20 20   7       1      
16a0: 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 67 6d 65  number of fragme
16b0: 6e 74 65 64 20 66 72 65 65 20 62 79 74 65 73 0a  nted free bytes.
16c0: 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20 20 20  **      8       
16d0: 34 20 20 20 20 20 20 52 69 67 68 74 20 63 68 69  4      Right chi
16e0: 6c 64 20 28 74 68 65 20 50 74 72 28 4e 29 20 76  ld (the Ptr(N) v
16f0: 61 6c 75 65 29 2e 20 20 4f 6d 69 74 74 65 64 20  alue).  Omitted 
1700: 6f 6e 20 6c 65 61 76 65 73 2e 0a 2a 2a 0a 2a 2a  on leaves..**.**
1710: 20 54 68 65 20 66 6c 61 67 73 20 64 65 66 69 6e   The flags defin
1720: 65 20 74 68 65 20 66 6f 72 6d 61 74 20 6f 66 20  e the format of 
1730: 74 68 69 73 20 62 74 72 65 65 20 70 61 67 65 2e  this btree page.
1740: 20 20 54 68 65 20 6c 65 61 66 20 66 6c 61 67 20    The leaf flag 
1750: 6d 65 61 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68  means that.** th
1760: 69 73 20 70 61 67 65 20 68 61 73 20 6e 6f 20 63  is page has no c
1770: 68 69 6c 64 72 65 6e 2e 20 20 54 68 65 20 7a 65  hildren.  The ze
1780: 72 6f 64 61 74 61 20 66 6c 61 67 20 6d 65 61 6e  rodata flag mean
1790: 73 20 74 68 61 74 20 74 68 69 73 20 70 61 67 65  s that this page
17a0: 20 63 61 72 72 69 65 73 0a 2a 2a 20 6f 6e 6c 79   carries.** only
17b0: 20 6b 65 79 73 20 61 6e 64 20 6e 6f 20 64 61 74   keys and no dat
17c0: 61 2e 20 20 54 68 65 20 69 6e 74 6b 65 79 20 66  a.  The intkey f
17d0: 6c 61 67 20 6d 65 61 6e 73 20 74 68 61 74 20 74  lag means that t
17e0: 68 65 20 6b 65 79 20 69 73 20 61 20 69 6e 74 65  he key is a inte
17f0: 67 65 72 0a 2a 2a 20 77 68 69 63 68 20 69 73 20  ger.** which is 
1800: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6b 65  stored in the ke
1810: 79 20 73 69 7a 65 20 65 6e 74 72 79 20 6f 66 20  y size entry of 
1820: 74 68 65 20 63 65 6c 6c 20 68 65 61 64 65 72 20  the cell header 
1830: 72 61 74 68 65 72 20 74 68 61 6e 20 69 6e 0a 2a  rather than in.*
1840: 2a 20 74 68 65 20 70 61 79 6c 6f 61 64 20 61 72  * the payload ar
1850: 65 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 65  ea..**.** The ce
1860: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
1870: 20 62 65 67 69 6e 73 20 6f 6e 20 74 68 65 20 66   begins on the f
1880: 69 72 73 74 20 62 79 74 65 20 61 66 74 65 72 20  irst byte after 
1890: 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 2e  the page header.
18a0: 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 70 6f 69  .** The cell poi
18b0: 6e 74 65 72 20 61 72 72 61 79 20 63 6f 6e 74 61  nter array conta
18c0: 69 6e 73 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65  ins zero or more
18d0: 20 32 2d 62 79 74 65 20 6e 75 6d 62 65 72 73 20   2-byte numbers 
18e0: 77 68 69 63 68 20 61 72 65 0a 2a 2a 20 6f 66 66  which are.** off
18f0: 73 65 74 73 20 66 72 6f 6d 20 74 68 65 20 62 65  sets from the be
1900: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 70  ginning of the p
1910: 61 67 65 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  age to the cell 
1920: 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68 65 20 63  content in the c
1930: 65 6c 6c 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61  ell.** content a
1940: 72 65 61 2e 20 20 54 68 65 20 63 65 6c 6c 20 70  rea.  The cell p
1950: 6f 69 6e 74 65 72 73 20 6f 63 63 75 72 20 69 6e  ointers occur in
1960: 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 20 20   sorted order.  
1970: 54 68 65 20 73 79 73 74 65 6d 20 73 74 72 69 76  The system striv
1980: 65 73 0a 2a 2a 20 74 6f 20 6b 65 65 70 20 66 72  es.** to keep fr
1990: 65 65 20 73 70 61 63 65 20 61 66 74 65 72 20 74  ee space after t
19a0: 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69  he last cell poi
19b0: 6e 74 65 72 20 73 6f 20 74 68 61 74 20 6e 65 77  nter so that new
19c0: 20 63 65 6c 6c 73 20 63 61 6e 0a 2a 2a 20 62 65   cells can.** be
19d0: 20 65 61 73 69 6c 79 20 61 64 64 65 64 20 77 69   easily added wi
19e0: 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
19f0: 64 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70  defragment the p
1a00: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 43 65 6c 6c 20  age..**.** Cell 
1a10: 63 6f 6e 74 65 6e 74 20 69 73 20 73 74 6f 72 65  content is store
1a20: 64 20 61 74 20 74 68 65 20 76 65 72 79 20 65 6e  d at the very en
1a30: 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 6e  d of the page an
1a40: 64 20 67 72 6f 77 73 20 74 6f 77 61 72 64 20 74  d grows toward t
1a50: 68 65 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20  he.** beginning 
1a60: 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a  of the page..**.
1a70: 2a 2a 20 55 6e 75 73 65 64 20 73 70 61 63 65 20  ** Unused space 
1a80: 77 69 74 68 69 6e 20 74 68 65 20 63 65 6c 6c 20  within the cell 
1a90: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 69 73 20  content area is 
1aa0: 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 61  collected into a
1ab0: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 0a   linked list of.
1ac0: 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 20  ** freeblocks.  
1ad0: 45 61 63 68 20 66 72 65 65 62 6c 6f 63 6b 20 69  Each freeblock i
1ae0: 73 20 61 74 20 6c 65 61 73 74 20 34 20 62 79 74  s at least 4 byt
1af0: 65 73 20 69 6e 20 73 69 7a 65 2e 20 20 54 68 65  es in size.  The
1b00: 20 62 79 74 65 20 6f 66 66 73 65 74 0a 2a 2a 20   byte offset.** 
1b10: 74 6f 20 74 68 65 20 66 69 72 73 74 20 66 72 65  to the first fre
1b20: 65 62 6c 6f 63 6b 20 69 73 20 67 69 76 65 6e 20  eblock is given 
1b30: 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 20  in the header.  
1b40: 46 72 65 65 62 6c 6f 63 6b 73 20 6f 63 63 75 72  Freeblocks occur
1b50: 20 69 6e 0a 2a 2a 20 69 6e 63 72 65 61 73 69 6e   in.** increasin
1b60: 67 20 6f 72 64 65 72 2e 20 20 42 65 63 61 75 73  g order.  Becaus
1b70: 65 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 6d 75  e a freeblock mu
1b80: 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 34  st be at least 4
1b90: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 0a   bytes in size,.
1ba0: 2a 2a 20 61 6e 79 20 67 72 6f 75 70 20 6f 66 20  ** any group of 
1bb0: 33 20 6f 72 20 66 65 77 65 72 20 75 6e 75 73 65  3 or fewer unuse
1bc0: 64 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 63  d bytes in the c
1bd0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
1be0: 20 63 61 6e 6e 6f 74 0a 2a 2a 20 65 78 69 73 74   cannot.** exist
1bf0: 20 6f 6e 20 74 68 65 20 66 72 65 65 62 6c 6f 63   on the freebloc
1c00: 6b 20 63 68 61 69 6e 2e 20 20 41 20 67 72 6f 75  k chain.  A grou
1c10: 70 20 6f 66 20 33 20 6f 72 20 66 65 77 65 72 20  p of 3 or fewer 
1c20: 66 72 65 65 20 62 79 74 65 73 20 69 73 20 63 61  free bytes is ca
1c30: 6c 6c 65 64 0a 2a 2a 20 61 20 66 72 61 67 6d 65  lled.** a fragme
1c40: 6e 74 2e 20 20 54 68 65 20 74 6f 74 61 6c 20 6e  nt.  The total n
1c50: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
1c60: 6e 20 61 6c 6c 20 66 72 61 67 6d 65 6e 74 73 20  n all fragments 
1c70: 69 73 20 72 65 63 6f 72 64 65 64 2e 0a 2a 2a 20  is recorded..** 
1c80: 69 6e 20 74 68 65 20 70 61 67 65 20 68 65 61 64  in the page head
1c90: 65 72 20 61 74 20 6f 66 66 73 65 74 20 37 2e 0a  er at offset 7..
1ca0: 2a 2a 0a 2a 2a 20 20 20 20 53 49 5a 45 20 20 20  **.**    SIZE   
1cb0: 20 44 45 53 43 52 49 50 54 49 4f 4e 0a 2a 2a 20   DESCRIPTION.** 
1cc0: 20 20 20 20 20 32 20 20 20 20 20 42 79 74 65 20       2     Byte 
1cd0: 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 6e 65  offset of the ne
1ce0: 78 74 20 66 72 65 65 62 6c 6f 63 6b 0a 2a 2a 20  xt freeblock.** 
1cf0: 20 20 20 20 20 32 20 20 20 20 20 42 79 74 65 73       2     Bytes
1d00: 20 69 6e 20 74 68 69 73 20 66 72 65 65 62 6c 6f   in this freeblo
1d10: 63 6b 0a 2a 2a 0a 2a 2a 20 43 65 6c 6c 73 20 61  ck.**.** Cells a
1d20: 72 65 20 6f 66 20 76 61 72 69 61 62 6c 65 20 6c  re of variable l
1d30: 65 6e 67 74 68 2e 20 20 43 65 6c 6c 73 20 61 72  ength.  Cells ar
1d40: 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
1d50: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
1d60: 61 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 20  a at.** the end 
1d70: 6f 66 20 74 68 65 20 70 61 67 65 2e 20 20 50 6f  of the page.  Po
1d80: 69 6e 74 65 72 73 20 74 6f 20 74 68 65 20 63 65  inters to the ce
1d90: 6c 6c 73 20 61 72 65 20 69 6e 20 74 68 65 20 63  lls are in the c
1da0: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
1db0: 79 0a 2a 2a 20 74 68 61 74 20 69 6d 6d 65 64 69  y.** that immedi
1dc0: 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20 74 68  ately follows th
1dd0: 65 20 70 61 67 65 20 68 65 61 64 65 72 2e 20 20  e page header.  
1de0: 43 65 6c 6c 73 20 69 73 20 6e 6f 74 20 6e 65 63  Cells is not nec
1df0: 65 73 73 61 72 69 6c 79 0a 2a 2a 20 63 6f 6e 74  essarily.** cont
1e00: 69 67 75 6f 75 73 20 6f 72 20 69 6e 20 6f 72 64  iguous or in ord
1e10: 65 72 2c 20 62 75 74 20 63 65 6c 6c 20 70 6f 69  er, but cell poi
1e20: 6e 74 65 72 73 20 61 72 65 20 63 6f 6e 74 69 67  nters are contig
1e30: 75 6f 75 73 20 61 6e 64 20 69 6e 20 6f 72 64 65  uous and in orde
1e40: 72 2e 0a 2a 2a 0a 2a 2a 20 43 65 6c 6c 20 63 6f  r..**.** Cell co
1e50: 6e 74 65 6e 74 20 6d 61 6b 65 73 20 75 73 65 20  ntent makes use 
1e60: 6f 66 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67  of variable leng
1e70: 74 68 20 69 6e 74 65 67 65 72 73 2e 20 20 41 20  th integers.  A 
1e80: 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6c 65 6e 67  variable.** leng
1e90: 74 68 20 69 6e 74 65 67 65 72 20 69 73 20 31 20  th integer is 1 
1ea0: 74 6f 20 39 20 62 79 74 65 73 20 77 68 65 72 65  to 9 bytes where
1eb0: 20 74 68 65 20 6c 6f 77 65 72 20 37 20 62 69 74   the lower 7 bit
1ec0: 73 20 6f 66 20 65 61 63 68 20 0a 2a 2a 20 62 79  s of each .** by
1ed0: 74 65 20 61 72 65 20 75 73 65 64 2e 20 20 54 68  te are used.  Th
1ee0: 65 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 69 73  e integer consis
1ef0: 74 73 20 6f 66 20 61 6c 6c 20 62 79 74 65 73 20  ts of all bytes 
1f00: 74 68 61 74 20 68 61 76 65 20 62 69 74 20 38 20  that have bit 8 
1f10: 73 65 74 20 61 6e 64 0a 2a 2a 20 74 68 65 20 66  set and.** the f
1f20: 69 72 73 74 20 62 79 74 65 20 77 69 74 68 20 62  irst byte with b
1f30: 69 74 20 38 20 63 6c 65 61 72 2e 20 20 54 68 65  it 8 clear.  The
1f40: 20 6d 6f 73 74 20 73 69 67 6e 69 66 69 63 61 6e   most significan
1f50: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 69 6e  t byte of the in
1f60: 74 65 67 65 72 0a 2a 2a 20 61 70 70 65 61 72 73  teger.** appears
1f70: 20 66 69 72 73 74 2e 20 20 41 20 76 61 72 69 61   first.  A varia
1f80: 62 6c 65 2d 6c 65 6e 67 74 68 20 69 6e 74 65 67  ble-length integ
1f90: 65 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6d 6f  er may not be mo
1fa0: 72 65 20 74 68 61 6e 20 39 20 62 79 74 65 73 20  re than 9 bytes 
1fb0: 6c 6f 6e 67 2e 0a 2a 2a 20 41 73 20 61 20 73 70  long..** As a sp
1fc0: 65 63 69 61 6c 20 63 61 73 65 2c 20 61 6c 6c 20  ecial case, all 
1fd0: 38 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 39  8 bytes of the 9
1fe0: 74 68 20 62 79 74 65 20 61 72 65 20 75 73 65 64  th byte are used
1ff0: 20 61 73 20 64 61 74 61 2e 20 20 54 68 69 73 0a   as data.  This.
2000: 2a 2a 20 61 6c 6c 6f 77 73 20 61 20 36 34 2d 62  ** allows a 64-b
2010: 69 74 20 69 6e 74 65 67 65 72 20 74 6f 20 62 65  it integer to be
2020: 20 65 6e 63 6f 64 65 64 20 69 6e 20 39 20 62 79   encoded in 9 by
2030: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 30 78  tes..**.**    0x
2040: 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  00              
2050: 20 20 20 20 20 20 20 20 62 65 63 6f 6d 65 73 20          becomes 
2060: 20 30 78 30 30 30 30 30 30 30 30 0a 2a 2a 20 20   0x00000000.**  
2070: 20 20 30 78 37 66 20 20 20 20 20 20 20 20 20 20    0x7f          
2080: 20 20 20 20 20 20 20 20 20 20 20 20 62 65 63 6f              beco
2090: 6d 65 73 20 20 30 78 30 30 30 30 30 30 37 66 0a  mes  0x0000007f.
20a0: 2a 2a 20 20 20 20 30 78 38 31 20 30 78 30 30 20  **    0x81 0x00 
20b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c0: 62 65 63 6f 6d 65 73 20 20 30 78 30 30 30 30 30  becomes  0x00000
20d0: 30 38 30 0a 2a 2a 20 20 20 20 30 78 38 32 20 30  080.**    0x82 0
20e0: 78 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20  x00             
20f0: 20 20 20 20 62 65 63 6f 6d 65 73 20 20 30 78 30      becomes  0x0
2100: 30 30 30 30 31 30 30 0a 2a 2a 20 20 20 20 30 78  0000100.**    0x
2110: 38 30 20 30 78 37 66 20 20 20 20 20 20 20 20 20  80 0x7f         
2120: 20 20 20 20 20 20 20 20 62 65 63 6f 6d 65 73 20          becomes 
2130: 20 30 78 30 30 30 30 30 30 37 66 0a 2a 2a 20 20   0x0000007f.**  
2140: 20 20 30 78 38 61 20 30 78 39 31 20 30 78 64 31    0x8a 0x91 0xd1
2150: 20 30 78 61 63 20 30 78 37 38 20 20 62 65 63 6f   0xac 0x78  beco
2160: 6d 65 73 20 20 30 78 31 32 33 34 35 36 37 38 0a  mes  0x12345678.
2170: 2a 2a 20 20 20 20 30 78 38 31 20 30 78 38 31 20  **    0x81 0x81 
2180: 30 78 38 31 20 30 78 38 31 20 30 78 30 31 20 20  0x81 0x81 0x01  
2190: 62 65 63 6f 6d 65 73 20 20 30 78 31 30 32 30 34  becomes  0x10204
21a0: 30 38 31 0a 2a 2a 0a 2a 2a 20 56 61 72 69 61 62  081.**.** Variab
21b0: 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65  le length intege
21c0: 72 73 20 61 72 65 20 75 73 65 64 20 66 6f 72 20  rs are used for 
21d0: 72 6f 77 69 64 73 20 61 6e 64 20 74 6f 20 68 6f  rowids and to ho
21e0: 6c 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ld the number of
21f0: 0a 2a 2a 20 62 79 74 65 73 20 6f 66 20 6b 65 79  .** bytes of key
2200: 20 61 6e 64 20 64 61 74 61 20 69 6e 20 61 20 62   and data in a b
2210: 74 72 65 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a  tree cell..**.**
2220: 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   The content of 
2230: 61 20 63 65 6c 6c 20 6c 6f 6f 6b 73 20 6c 69 6b  a cell looks lik
2240: 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
2250: 20 53 49 5a 45 20 20 20 20 44 45 53 43 52 49 50   SIZE    DESCRIP
2260: 54 49 4f 4e 0a 2a 2a 20 20 20 20 20 20 34 20 20  TION.**      4  
2270: 20 20 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f     Page number o
2280: 66 20 74 68 65 20 6c 65 66 74 20 63 68 69 6c 64  f the left child
2290: 2e 20 4f 6d 69 74 74 65 64 20 69 66 20 6c 65 61  . Omitted if lea
22a0: 66 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a 2a  f flag is set..*
22b0: 2a 20 20 20 20 20 76 61 72 20 20 20 20 4e 75 6d  *     var    Num
22c0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
22d0: 64 61 74 61 2e 20 4f 6d 69 74 74 65 64 20 69 66  data. Omitted if
22e0: 20 74 68 65 20 7a 65 72 6f 64 61 74 61 20 66 6c   the zerodata fl
22f0: 61 67 20 69 73 20 73 65 74 2e 0a 2a 2a 20 20 20  ag is set..**   
2300: 20 20 76 61 72 20 20 20 20 4e 75 6d 62 65 72 20    var    Number 
2310: 6f 66 20 62 79 74 65 73 20 6f 66 20 6b 65 79 2e  of bytes of key.
2320: 20 4f 72 20 74 68 65 20 6b 65 79 20 69 74 73 65   Or the key itse
2330: 6c 66 20 69 66 20 69 6e 74 6b 65 79 20 66 6c 61  lf if intkey fla
2340: 67 20 69 73 20 73 65 74 2e 0a 2a 2a 20 20 20 20  g is set..**    
2350: 20 20 2a 20 20 20 20 20 50 61 79 6c 6f 61 64 0a    *     Payload.
2360: 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20 46 69  **      4     Fi
2370: 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
2380: 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20  overflow chain. 
2390: 20 4f 6d 69 74 74 65 64 20 69 66 20 6e 6f 20 6f   Omitted if no o
23a0: 76 65 72 66 6c 6f 77 0a 2a 2a 0a 2a 2a 20 4f 76  verflow.**.** Ov
23b0: 65 72 66 6c 6f 77 20 70 61 67 65 73 20 66 6f 72  erflow pages for
23c0: 6d 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e  m a linked list.
23d0: 20 20 45 61 63 68 20 70 61 67 65 20 65 78 63 65    Each page exce
23e0: 70 74 20 74 68 65 20 6c 61 73 74 20 69 73 20 63  pt the last is c
23f0: 6f 6d 70 6c 65 74 65 6c 79 0a 2a 2a 20 66 69 6c  ompletely.** fil
2400: 6c 65 64 20 77 69 74 68 20 64 61 74 61 20 28 70  led with data (p
2410: 61 67 65 73 69 7a 65 20 2d 20 34 20 62 79 74 65  agesize - 4 byte
2420: 73 29 2e 20 20 54 68 65 20 6c 61 73 74 20 70 61  s).  The last pa
2430: 67 65 20 63 61 6e 20 68 61 76 65 20 61 73 20 6c  ge can have as l
2440: 69 74 74 6c 65 0a 2a 2a 20 61 73 20 31 20 62 79  ittle.** as 1 by
2450: 74 65 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a  te of data..**.*
2460: 2a 20 20 20 20 53 49 5a 45 20 20 20 20 44 45 53  *    SIZE    DES
2470: 43 52 49 50 54 49 4f 4e 0a 2a 2a 20 20 20 20 20  CRIPTION.**     
2480: 20 34 20 20 20 20 20 50 61 67 65 20 6e 75 6d 62   4     Page numb
2490: 65 72 20 6f 66 20 6e 65 78 74 20 6f 76 65 72 66  er of next overf
24a0: 6c 6f 77 20 70 61 67 65 0a 2a 2a 20 20 20 20 20  low page.**     
24b0: 20 2a 20 20 20 20 20 44 61 74 61 0a 2a 2a 0a 2a   *     Data.**.*
24c0: 2a 20 46 72 65 65 6c 69 73 74 20 70 61 67 65 73  * Freelist pages
24d0: 20 63 6f 6d 65 20 69 6e 20 74 77 6f 20 73 75 62   come in two sub
24e0: 74 79 70 65 73 3a 20 74 72 75 6e 6b 20 70 61 67  types: trunk pag
24f0: 65 73 20 61 6e 64 20 6c 65 61 66 20 70 61 67 65  es and leaf page
2500: 73 2e 20 20 54 68 65 0a 2a 2a 20 66 69 6c 65 20  s.  The.** file 
2510: 68 65 61 64 65 72 20 70 6f 69 6e 74 73 20 74 6f  header points to
2520: 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b   first in a link
2530: 65 64 20 6c 69 73 74 20 6f 66 20 74 72 75 6e 6b  ed list of trunk
2540: 20 70 61 67 65 2e 20 20 45 61 63 68 20 74 72 75   page.  Each tru
2550: 6e 6b 0a 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74  nk.** page point
2560: 73 20 74 6f 20 6d 75 6c 74 69 70 6c 65 20 6c 65  s to multiple le
2570: 61 66 20 70 61 67 65 73 2e 20 20 54 68 65 20 63  af pages.  The c
2580: 6f 6e 74 65 6e 74 20 6f 66 20 61 20 6c 65 61 66  ontent of a leaf
2590: 20 70 61 67 65 20 69 73 0a 2a 2a 20 75 6e 73 70   page is.** unsp
25a0: 65 63 69 66 69 65 64 2e 20 20 41 20 74 72 75 6e  ecified.  A trun
25b0: 6b 20 70 61 67 65 20 6c 6f 6f 6b 73 20 6c 69 6b  k page looks lik
25c0: 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
25d0: 20 53 49 5a 45 20 20 20 20 44 45 53 43 52 49 50   SIZE    DESCRIP
25e0: 54 49 4f 4e 0a 2a 2a 20 20 20 20 20 20 34 20 20  TION.**      4  
25f0: 20 20 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f     Page number o
2600: 66 20 6e 65 78 74 20 74 72 75 6e 6b 20 70 61 67  f next trunk pag
2610: 65 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20  e.**      4     
2620: 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70  Number of leaf p
2630: 6f 69 6e 74 65 72 73 20 6f 6e 20 74 68 69 73 20  ointers on this 
2640: 70 61 67 65 0a 2a 2a 20 20 20 20 20 20 2a 20 20  page.**      *  
2650: 20 20 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20     zero or more 
2660: 70 61 67 65 73 20 6e 75 6d 62 65 72 73 20 6f 66  pages numbers of
2670: 20 6c 65 61 76 65 73 0a 2a 2f 0a 23 69 6e 63 6c   leaves.*/.#incl
2680: 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68  ude "sqliteInt.h
2690: 22 0a 23 69 6e 63 6c 75 64 65 20 22 70 61 67 65  ".#include "page
26a0: 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 62  r.h".#include "b
26b0: 74 72 65 65 2e 68 22 0a 23 69 6e 63 6c 75 64 65  tree.h".#include
26c0: 20 22 6f 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65   "os.h".#include
26d0: 20 3c 61 73 73 65 72 74 2e 68 3e 0a 0a 2f 2a 20   <assert.h>../* 
26e0: 52 6f 75 6e 64 20 75 70 20 61 20 6e 75 6d 62 65  Round up a numbe
26f0: 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6c 61  r to the next la
2700: 72 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  rger multiple of
2710: 20 38 2e 20 20 54 68 69 73 20 69 73 20 75 73 65   8.  This is use
2720: 64 0a 2a 2a 20 74 6f 20 66 6f 72 63 65 20 38 2d  d.** to force 8-
2730: 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f  byte alignment o
2740: 6e 20 36 34 2d 62 69 74 20 61 72 63 68 69 74 65  n 64-bit archite
2750: 63 74 75 72 65 73 2e 0a 2a 2f 0a 23 64 65 66 69  ctures..*/.#defi
2760: 6e 65 20 52 4f 55 4e 44 38 28 78 29 20 20 20 28  ne ROUND8(x)   (
2770: 28 78 2b 37 29 26 7e 37 29 0a 0a 0a 2f 2a 20 54  (x+7)&~7).../* T
2780: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c  he following val
2790: 75 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  ue is the maximu
27a0: 6d 20 63 65 6c 6c 20 73 69 7a 65 20 61 73 73 75  m cell size assu
27b0: 6d 69 6e 67 20 61 20 6d 61 78 69 6d 75 6d 20 70  ming a maximum p
27c0: 61 67 65 0a 2a 2a 20 73 69 7a 65 20 67 69 76 65  age.** size give
27d0: 20 61 62 6f 76 65 2e 0a 2a 2f 0a 23 64 65 66 69   above..*/.#defi
27e0: 6e 65 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  ne MX_CELL_SIZE(
27f0: 70 42 74 29 20 20 28 70 42 74 2d 3e 70 61 67 65  pBt)  (pBt->page
2800: 53 69 7a 65 2d 38 29 0a 0a 2f 2a 20 54 68 65 20  Size-8)../* The 
2810: 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
2820: 66 20 63 65 6c 6c 73 20 6f 6e 20 61 20 73 69 6e  f cells on a sin
2830: 67 6c 65 20 70 61 67 65 20 6f 66 20 74 68 65 20  gle page of the 
2840: 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 0a  database.  This.
2850: 2a 2a 20 61 73 73 75 6d 65 73 20 61 20 6d 69 6e  ** assumes a min
2860: 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 6f  imum cell size o
2870: 66 20 33 20 62 79 74 65 73 2e 20 20 53 75 63 68  f 3 bytes.  Such
2880: 20 73 6d 61 6c 6c 20 63 65 6c 6c 73 20 77 69 6c   small cells wil
2890: 6c 20 62 65 0a 2a 2a 20 65 78 63 65 65 64 69 6e  l be.** exceedin
28a0: 67 6c 79 20 72 61 72 65 2c 20 62 75 74 20 74 68  gly rare, but th
28b0: 65 79 20 61 72 65 20 70 6f 73 73 69 62 6c 65 2e  ey are possible.
28c0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 58 5f 43  .*/.#define MX_C
28d0: 45 4c 4c 28 70 42 74 29 20 28 28 70 42 74 2d 3e  ELL(pBt) ((pBt->
28e0: 70 61 67 65 53 69 7a 65 2d 38 29 2f 33 29 0a 0a  pageSize-8)/3)..
28f0: 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  /* Forward decla
2900: 72 61 74 69 6f 6e 73 20 2a 2f 0a 74 79 70 65 64  rations */.typed
2910: 65 66 20 73 74 72 75 63 74 20 4d 65 6d 50 61 67  ef struct MemPag
2920: 65 20 4d 65 6d 50 61 67 65 3b 0a 74 79 70 65 64  e MemPage;.typed
2930: 65 66 20 73 74 72 75 63 74 20 42 74 4c 6f 63 6b  ef struct BtLock
2940: 20 42 74 4c 6f 63 6b 3b 0a 0a 2f 2a 0a 2a 2a 20   BtLock;../*.** 
2950: 54 68 69 73 20 69 73 20 61 20 6d 61 67 69 63 20  This is a magic 
2960: 73 74 72 69 6e 67 20 74 68 61 74 20 61 70 70 65  string that appe
2970: 61 72 73 20 61 74 20 74 68 65 20 62 65 67 69 6e  ars at the begin
2980: 6e 69 6e 67 20 6f 66 20 65 76 65 72 79 0a 2a 2a  ning of every.**
2990: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
29a0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 64 65   in order to ide
29b0: 6e 74 69 66 79 20 74 68 65 20 66 69 6c 65 20 61  ntify the file a
29c0: 73 20 61 20 72 65 61 6c 20 64 61 74 61 62 61 73  s a real databas
29d0: 65 2e 0a 2a 2a 0a 2a 2a 20 59 6f 75 20 63 61 6e  e..**.** You can
29e0: 20 63 68 61 6e 67 65 20 74 68 69 73 20 76 61 6c   change this val
29f0: 75 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ue at compile-ti
2a00: 6d 65 20 62 79 20 73 70 65 63 69 66 79 69 6e 67  me by specifying
2a10: 20 61 0a 2a 2a 20 2d 44 53 51 4c 49 54 45 5f 46   a.** -DSQLITE_F
2a20: 49 4c 45 5f 48 45 41 44 45 52 3d 22 2e 2e 2e 22  ILE_HEADER="..."
2a30: 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72   on the compiler
2a40: 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 2e 20 20   command-line.  
2a50: 54 68 65 0a 2a 2a 20 68 65 61 64 65 72 20 6d 75  The.** header mu
2a60: 73 74 20 62 65 20 65 78 61 63 74 6c 79 20 31 36  st be exactly 16
2a70: 20 62 79 74 65 73 20 69 6e 63 6c 75 64 69 6e 67   bytes including
2a80: 20 74 68 65 20 7a 65 72 6f 2d 74 65 72 6d 69 6e   the zero-termin
2a90: 61 74 6f 72 20 73 6f 0a 2a 2a 20 74 68 65 20 73  ator so.** the s
2aa0: 74 72 69 6e 67 20 69 74 73 65 6c 66 20 73 68 6f  tring itself sho
2ab0: 75 6c 64 20 62 65 20 31 35 20 63 68 61 72 61 63  uld be 15 charac
2ac0: 74 65 72 73 20 6c 6f 6e 67 2e 20 20 49 66 20 79  ters long.  If y
2ad0: 6f 75 20 63 68 61 6e 67 65 0a 2a 2a 20 74 68 65  ou change.** the
2ae0: 20 68 65 61 64 65 72 2c 20 74 68 65 6e 20 79 6f   header, then yo
2af0: 75 72 20 63 75 73 74 6f 6d 20 6c 69 62 72 61 72  ur custom librar
2b00: 79 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62  y will not be ab
2b10: 6c 65 20 74 6f 20 72 65 61 64 20 0a 2a 2a 20 64  le to read .** d
2b20: 61 74 61 62 61 73 65 73 20 67 65 6e 65 72 61 74  atabases generat
2b30: 65 64 20 62 79 20 74 68 65 20 73 74 61 6e 64 61  ed by the standa
2b40: 72 64 20 74 6f 6f 6c 73 20 61 6e 64 20 74 68 65  rd tools and the
2b50: 20 73 74 61 6e 64 61 72 64 20 74 6f 6f 6c 73 0a   standard tools.
2b60: 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61  ** will not be a
2b70: 62 6c 65 20 74 6f 20 72 65 61 64 20 64 61 74 61  ble to read data
2b80: 62 61 73 65 73 20 63 72 65 61 74 65 64 20 62 79  bases created by
2b90: 20 79 6f 75 72 20 63 75 73 74 6f 6d 20 6c 69 62   your custom lib
2ba0: 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  rary..*/.#ifndef
2bb0: 20 53 51 4c 49 54 45 5f 46 49 4c 45 5f 48 45 41   SQLITE_FILE_HEA
2bc0: 44 45 52 20 2f 2a 20 31 32 33 34 35 36 37 38 39  DER /* 123456789
2bd0: 20 31 32 33 34 35 36 20 2a 2f 0a 23 20 20 64 65   123456 */.#  de
2be0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 46 49 4c 45  fine SQLITE_FILE
2bf0: 5f 48 45 41 44 45 52 20 22 53 51 4c 69 74 65 20  _HEADER "SQLite 
2c00: 66 6f 72 6d 61 74 20 33 22 0a 23 65 6e 64 69 66  format 3".#endif
2c10: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
2c20: 61 72 20 7a 4d 61 67 69 63 48 65 61 64 65 72 5b  ar zMagicHeader[
2c30: 5d 20 3d 20 53 51 4c 49 54 45 5f 46 49 4c 45 5f  ] = SQLITE_FILE_
2c40: 48 45 41 44 45 52 3b 0a 0a 2f 2a 0a 2a 2a 20 50  HEADER;../*.** P
2c50: 61 67 65 20 74 79 70 65 20 66 6c 61 67 73 2e 20  age type flags. 
2c60: 20 41 6e 20 4f 52 65 64 20 63 6f 6d 62 69 6e 61   An ORed combina
2c70: 74 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 66 6c  tion of these fl
2c80: 61 67 73 20 61 70 70 65 61 72 20 61 73 20 74 68  ags appear as th
2c90: 65 0a 2a 2a 20 66 69 72 73 74 20 62 79 74 65 20  e.** first byte 
2ca0: 6f 66 20 65 76 65 72 79 20 42 54 72 65 65 20 70  of every BTree p
2cb0: 61 67 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  age..*/.#define 
2cc0: 50 54 46 5f 49 4e 54 4b 45 59 20 20 20 20 30 78  PTF_INTKEY    0x
2cd0: 30 31 0a 23 64 65 66 69 6e 65 20 50 54 46 5f 5a  01.#define PTF_Z
2ce0: 45 52 4f 44 41 54 41 20 20 30 78 30 32 0a 23 64  ERODATA  0x02.#d
2cf0: 65 66 69 6e 65 20 50 54 46 5f 4c 45 41 46 44 41  efine PTF_LEAFDA
2d00: 54 41 20 20 30 78 30 34 0a 23 64 65 66 69 6e 65  TA  0x04.#define
2d10: 20 50 54 46 5f 4c 45 41 46 20 20 20 20 20 20 30   PTF_LEAF      0
2d20: 78 30 38 0a 0a 2f 2a 0a 2a 2a 20 41 73 20 65 61  x08../*.** As ea
2d30: 63 68 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  ch page of the f
2d40: 69 6c 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e  ile is loaded in
2d50: 74 6f 20 6d 65 6d 6f 72 79 2c 20 61 6e 20 69 6e  to memory, an in
2d60: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
2d70: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63  llowing.** struc
2d80: 74 75 72 65 20 69 73 20 61 70 70 65 6e 64 65 64  ture is appended
2d90: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 64   and initialized
2da0: 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 69 73 20   to zero.  This 
2db0: 73 74 72 75 63 74 75 72 65 20 73 74 6f 72 65 73  structure stores
2dc0: 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
2dd0: 61 62 6f 75 74 20 74 68 65 20 70 61 67 65 20 74  about the page t
2de0: 68 61 74 20 69 73 20 64 65 63 6f 64 65 64 20 66  hat is decoded f
2df0: 72 6f 6d 20 74 68 65 20 72 61 77 20 66 69 6c 65  rom the raw file
2e00: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
2e10: 20 70 50 61 72 65 6e 74 20 66 69 65 6c 64 20 70   pParent field p
2e20: 6f 69 6e 74 73 20 62 61 63 6b 20 74 6f 20 74 68  oints back to th
2e30: 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20 20  e parent page.  
2e40: 54 68 69 73 20 61 6c 6c 6f 77 73 20 75 73 20 74  This allows us t
2e50: 6f 0a 2a 2a 20 77 61 6c 6b 20 75 70 20 74 68 65  o.** walk up the
2e60: 20 42 54 72 65 65 20 66 72 6f 6d 20 61 6e 79 20   BTree from any 
2e70: 6c 65 61 66 20 74 6f 20 74 68 65 20 72 6f 6f 74  leaf to the root
2e80: 2e 20 20 43 61 72 65 20 6d 75 73 74 20 62 65 20  .  Care must be 
2e90: 74 61 6b 65 6e 20 74 6f 0a 2a 2a 20 75 6e 72 65  taken to.** unre
2ea0: 66 28 29 20 74 68 65 20 70 61 72 65 6e 74 20 70  f() the parent p
2eb0: 61 67 65 20 70 6f 69 6e 74 65 72 20 77 68 65 6e  age pointer when
2ec0: 20 74 68 69 73 20 70 61 67 65 20 69 73 20 6e 6f   this page is no
2ed0: 20 6c 6f 6e 67 65 72 20 72 65 66 65 72 65 6e 63   longer referenc
2ee0: 65 64 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 44  ed..** The pageD
2ef0: 65 73 74 72 75 63 74 6f 72 28 29 20 72 6f 75 74  estructor() rout
2f00: 69 6e 65 20 68 61 6e 64 6c 65 73 20 74 68 61 74  ine handles that
2f10: 20 63 68 6f 72 65 2e 0a 2a 2f 0a 73 74 72 75 63   chore..*/.struc
2f20: 74 20 4d 65 6d 50 61 67 65 20 7b 0a 20 20 75 38  t MemPage {.  u8
2f30: 20 69 73 49 6e 69 74 3b 20 20 20 20 20 20 20 20   isInit;        
2f40: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 72     /* True if pr
2f50: 65 76 69 6f 75 73 6c 79 20 69 6e 69 74 69 61 6c  eviously initial
2f60: 69 7a 65 64 2e 20 4d 55 53 54 20 42 45 20 46 49  ized. MUST BE FI
2f70: 52 53 54 21 20 2a 2f 0a 20 20 75 38 20 69 64 78  RST! */.  u8 idx
2f80: 53 68 69 66 74 3b 20 20 20 20 20 20 20 20 20 2f  Shift;         /
2f90: 2a 20 54 72 75 65 20 69 66 20 43 65 6c 6c 20 69  * True if Cell i
2fa0: 6e 64 69 63 65 73 20 68 61 76 65 20 63 68 61 6e  ndices have chan
2fb0: 67 65 64 20 2a 2f 0a 20 20 75 38 20 6e 4f 76 65  ged */.  u8 nOve
2fc0: 72 66 6c 6f 77 3b 20 20 20 20 20 20 20 20 2f 2a  rflow;        /*
2fd0: 20 4e 75 6d 62 65 72 20 6f 66 20 6f 76 65 72 66   Number of overf
2fe0: 6c 6f 77 20 63 65 6c 6c 20 62 6f 64 69 65 73 20  low cell bodies 
2ff0: 69 6e 20 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20  in aCell[] */.  
3000: 75 38 20 69 6e 74 4b 65 79 3b 20 20 20 20 20 20  u8 intKey;      
3010: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
3020: 69 6e 74 6b 65 79 20 66 6c 61 67 20 69 73 20 73  intkey flag is s
3030: 65 74 20 2a 2f 0a 20 20 75 38 20 6c 65 61 66 3b  et */.  u8 leaf;
3040: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3050: 54 72 75 65 20 69 66 20 6c 65 61 66 20 66 6c 61  True if leaf fla
3060: 67 20 69 73 20 73 65 74 20 2a 2f 0a 20 20 75 38  g is set */.  u8
3070: 20 7a 65 72 6f 44 61 74 61 3b 20 20 20 20 20 20   zeroData;      
3080: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 61     /* True if ta
3090: 62 6c 65 20 73 74 6f 72 65 73 20 6b 65 79 73 20  ble stores keys 
30a0: 6f 6e 6c 79 20 2a 2f 0a 20 20 75 38 20 6c 65 61  only */.  u8 lea
30b0: 66 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f  fData;         /
30c0: 2a 20 54 72 75 65 20 69 66 20 74 61 62 6c 65 73  * True if tables
30d0: 20 73 74 6f 72 65 73 20 64 61 74 61 20 6f 6e 20   stores data on 
30e0: 6c 65 61 76 65 73 20 6f 6e 6c 79 20 2a 2f 0a 20  leaves only */. 
30f0: 20 75 38 20 68 61 73 44 61 74 61 3b 20 20 20 20   u8 hasData;    
3100: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3110: 20 74 68 69 73 20 70 61 67 65 20 73 74 6f 72 65   this page store
3120: 73 20 64 61 74 61 20 2a 2f 0a 20 20 75 38 20 68  s data */.  u8 h
3130: 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  drOffset;       
3140: 20 2f 2a 20 31 30 30 20 66 6f 72 20 70 61 67 65   /* 100 for page
3150: 20 31 2e 20 20 30 20 6f 74 68 65 72 77 69 73 65   1.  0 otherwise
3160: 20 2a 2f 0a 20 20 75 38 20 63 68 69 6c 64 50 74   */.  u8 childPt
3170: 72 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 30 20  rSize;     /* 0 
3180: 69 66 20 6c 65 61 66 3d 3d 31 2e 20 20 34 20 69  if leaf==1.  4 i
3190: 66 20 6c 65 61 66 3d 3d 30 20 2a 2f 0a 20 20 75  f leaf==0 */.  u
31a0: 31 36 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 20 20  16 maxLocal;    
31b0: 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 42      /* Copy of B
31c0: 74 72 65 65 2e 6d 61 78 4c 6f 63 61 6c 20 6f 72  tree.maxLocal or
31d0: 20 42 74 72 65 65 2e 6d 61 78 4c 65 61 66 20 2a   Btree.maxLeaf *
31e0: 2f 0a 20 20 75 31 36 20 6d 69 6e 4c 6f 63 61 6c  /.  u16 minLocal
31f0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79  ;        /* Copy
3200: 20 6f 66 20 42 74 72 65 65 2e 6d 69 6e 4c 6f 63   of Btree.minLoc
3210: 61 6c 20 6f 72 20 42 74 72 65 65 2e 6d 69 6e 4c  al or Btree.minL
3220: 65 61 66 20 2a 2f 0a 20 20 75 31 36 20 63 65 6c  eaf */.  u16 cel
3230: 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a  lOffset;      /*
3240: 20 49 6e 64 65 78 20 69 6e 20 61 44 61 74 61 20   Index in aData 
3250: 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f  of first cell po
3260: 69 6e 74 65 72 20 2a 2f 0a 20 20 75 31 36 20 69  inter */.  u16 i
3270: 64 78 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20  dxParent;       
3280: 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 61 72 65  /* Index in pare
3290: 6e 74 20 6f 66 20 74 68 69 73 20 6e 6f 64 65 20  nt of this node 
32a0: 2a 2f 0a 20 20 75 31 36 20 6e 46 72 65 65 3b 20  */.  u16 nFree; 
32b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
32c0: 62 65 72 20 6f 66 20 66 72 65 65 20 62 79 74 65  ber of free byte
32d0: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  s on the page */
32e0: 0a 20 20 75 31 36 20 6e 43 65 6c 6c 3b 20 20 20  .  u16 nCell;   
32f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3300: 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68  r of cells on th
3310: 69 73 20 70 61 67 65 2c 20 6c 6f 63 61 6c 20 61  is page, local a
3320: 6e 64 20 6f 76 66 6c 20 2a 2f 0a 20 20 73 74 72  nd ovfl */.  str
3330: 75 63 74 20 5f 4f 76 66 6c 43 65 6c 6c 20 7b 20  uct _OvflCell { 
3340: 20 20 2f 2a 20 43 65 6c 6c 73 20 74 68 61 74 20    /* Cells that 
3350: 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20  will not fit on 
3360: 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75  aData[] */.    u
3370: 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20  8 *pCell;       
3380: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74     /* Pointers t
3390: 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68  o the body of th
33a0: 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20  e overflow cell 
33b0: 2a 2f 0a 20 20 20 20 75 31 36 20 69 64 78 3b 20  */.    u16 idx; 
33c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
33d0: 73 65 72 74 20 74 68 69 73 20 63 65 6c 6c 20 62  sert this cell b
33e0: 65 66 6f 72 65 20 69 64 78 2d 74 68 20 6e 6f 6e  efore idx-th non
33f0: 2d 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 2a  -overflow cell *
3400: 2f 0a 20 20 7d 20 61 4f 76 66 6c 5b 35 5d 3b 0a  /.  } aOvfl[5];.
3410: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
3420: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
3430: 72 20 62 61 63 6b 20 74 6f 20 42 54 72 65 65 20  r back to BTree 
3440: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 75  structure */.  u
3450: 38 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20 20  8 *aData;       
3460: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 62      /* Pointer b
3470: 61 63 6b 20 74 6f 20 74 68 65 20 73 74 61 72 74  ack to the start
3480: 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   of the page */.
3490: 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
34a0: 65 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20  e;     /* Pager 
34b0: 70 61 67 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  page handle */. 
34c0: 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20   Pgno pgno;     
34d0: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
34e0: 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20 70 61  mber for this pa
34f0: 67 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ge */.  MemPage 
3500: 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 2f 2a 20  *pParent;    /* 
3510: 54 68 65 20 70 61 72 65 6e 74 20 6f 66 20 74 68  The parent of th
3520: 69 73 20 70 61 67 65 2e 20 20 4e 55 4c 4c 20 66  is page.  NULL f
3530: 6f 72 20 72 6f 6f 74 20 2a 2f 0a 7d 3b 0a 0a 2f  or root */.};../
3540: 2a 0a 2a 2a 20 54 68 65 20 69 6e 2d 6d 65 6d 6f  *.** The in-memo
3550: 72 79 20 69 6d 61 67 65 20 6f 66 20 61 20 64 69  ry image of a di
3560: 73 6b 20 70 61 67 65 20 68 61 73 20 74 68 65 20  sk page has the 
3570: 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d  auxiliary inform
3580: 61 74 69 6f 6e 20 61 70 70 65 6e 64 65 64 0a 2a  ation appended.*
3590: 2a 20 74 6f 20 74 68 65 20 65 6e 64 2e 20 20 45  * to the end.  E
35a0: 58 54 52 41 5f 53 49 5a 45 20 69 73 20 74 68 65  XTRA_SIZE is the
35b0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
35c0: 20 6f 66 20 73 70 61 63 65 20 6e 65 65 64 65 64   of space needed
35d0: 20 74 6f 20 68 6f 6c 64 0a 2a 2a 20 74 68 61 74   to hold.** that
35e0: 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69   extra informati
35f0: 6f 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 45  on..*/.#define E
3600: 58 54 52 41 5f 53 49 5a 45 20 73 69 7a 65 6f 66  XTRA_SIZE sizeof
3610: 28 4d 65 6d 50 61 67 65 29 0a 0a 2f 2a 20 42 74  (MemPage)../* Bt
3620: 72 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 73 74  ree handle */.st
3630: 72 75 63 74 20 42 74 72 65 65 20 7b 0a 20 20 73  ruct Btree {.  s
3640: 71 6c 69 74 65 33 20 2a 70 53 71 6c 69 74 65 3b  qlite3 *pSqlite;
3650: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
3660: 3b 0a 20 20 75 38 20 69 6e 54 72 61 6e 73 3b 20  ;.  u8 inTrans; 
3670: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52             /* TR
3680: 41 4e 53 5f 4e 4f 4e 45 2c 20 54 52 41 4e 53 5f  ANS_NONE, TRANS_
3690: 52 45 41 44 20 6f 72 20 54 52 41 4e 53 5f 57 52  READ or TRANS_WR
36a0: 49 54 45 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ITE */.};../*.**
36b0: 20 42 74 72 65 65 2e 69 6e 54 72 61 6e 73 20 6d   Btree.inTrans m
36c0: 61 79 20 74 61 6b 65 20 6f 6e 65 20 6f 66 20 74  ay take one of t
36d0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c  he following val
36e0: 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ues..**.** If th
36f0: 65 20 73 68 61 72 65 64 2d 64 61 74 61 20 65 78  e shared-data ex
3700: 74 65 6e 73 69 6f 6e 20 69 73 20 65 6e 61 62 6c  tension is enabl
3710: 65 64 2c 20 74 68 65 72 65 20 6d 61 79 20 62 65  ed, there may be
3720: 20 6d 75 6c 74 69 70 6c 65 20 75 73 65 72 73 0a   multiple users.
3730: 2a 2a 20 6f 66 20 74 68 65 20 42 74 72 65 65 20  ** of the Btree 
3740: 73 74 72 75 63 74 75 72 65 2e 20 41 74 20 6d 6f  structure. At mo
3750: 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 73 65 20  st one of these 
3760: 6d 61 79 20 6f 70 65 6e 20 61 20 77 72 69 74 65  may open a write
3770: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a   transaction,.**
3780: 20 62 75 74 20 61 6e 79 20 6e 75 6d 62 65 72 20   but any number 
3790: 6d 61 79 20 68 61 76 65 20 61 63 74 69 76 65 20  may have active 
37a0: 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
37b0: 73 2e 20 56 61 72 69 61 62 6c 65 20 42 74 72 65  s. Variable Btre
37c0: 65 2e 70 44 62 20 0a 2a 2a 20 70 6f 69 6e 74 73  e.pDb .** points
37d0: 20 74 6f 20 74 68 65 20 68 61 6e 64 6c 65 20 74   to the handle t
37e0: 68 61 74 20 6f 77 6e 73 20 61 6e 79 20 63 75 72  hat owns any cur
37f0: 72 65 6e 74 20 77 72 69 74 65 2d 74 72 61 6e 73  rent write-trans
3800: 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 64 65 66 69  action..*/.#defi
3810: 6e 65 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 20 30  ne TRANS_NONE  0
3820: 0a 23 64 65 66 69 6e 65 20 54 52 41 4e 53 5f 52  .#define TRANS_R
3830: 45 41 44 20 20 31 0a 23 64 65 66 69 6e 65 20 54  EAD  1.#define T
3840: 52 41 4e 53 5f 57 52 49 54 45 20 32 0a 0a 2f 2a  RANS_WRITE 2../*
3850: 0a 2a 2a 20 45 76 65 72 79 74 68 69 6e 67 20 77  .** Everything w
3860: 65 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 61  e need to know a
3870: 62 6f 75 74 20 61 6e 20 6f 70 65 6e 20 64 61 74  bout an open dat
3880: 61 62 61 73 65 0a 2a 2f 0a 73 74 72 75 63 74 20  abase.*/.struct 
3890: 42 74 53 68 61 72 65 64 20 7b 0a 20 20 50 61 67  BtShared {.  Pag
38a0: 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20 20 20  er *pPager;     
38b0: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 63     /* The page c
38c0: 61 63 68 65 20 2a 2f 0a 20 20 42 74 43 75 72 73  ache */.  BtCurs
38d0: 6f 72 20 2a 70 43 75 72 73 6f 72 3b 20 20 20 20  or *pCursor;    
38e0: 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c  /* A list of all
38f0: 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 20 2a 2f   open cursors */
3900: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
3910: 65 31 3b 20 20 20 20 20 20 2f 2a 20 46 69 72 73  e1;      /* Firs
3920: 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
3930: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 69  tabase */.  u8 i
3940: 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20  nStmt;          
3950: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20    /* True if we 
3960: 61 72 65 20 69 6e 20 61 20 73 74 61 74 65 6d 65  are in a stateme
3970: 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
3980: 6e 20 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f 6e  n */.  u8 readOn
3990: 6c 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ly;          /* 
39a0: 54 72 75 65 20 69 66 20 74 68 65 20 75 6e 64 65  True if the unde
39b0: 72 6c 79 69 6e 67 20 66 69 6c 65 20 69 73 20 72  rlying file is r
39c0: 65 61 64 6f 6e 6c 79 20 2a 2f 0a 20 20 75 38 20  eadonly */.  u8 
39d0: 6d 61 78 45 6d 62 65 64 46 72 61 63 3b 20 20 20  maxEmbedFrac;   
39e0: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 70 61     /* Maximum pa
39f0: 79 6c 6f 61 64 20 61 73 20 25 20 6f 66 20 74 6f  yload as % of to
3a00: 74 61 6c 20 70 61 67 65 20 73 69 7a 65 20 2a 2f  tal page size */
3a10: 0a 20 20 75 38 20 6d 69 6e 45 6d 62 65 64 46 72  .  u8 minEmbedFr
3a20: 61 63 3b 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69  ac;      /* Mini
3a30: 6d 75 6d 20 70 61 79 6c 6f 61 64 20 61 73 20 25  mum payload as %
3a40: 20 6f 66 20 74 6f 74 61 6c 20 70 61 67 65 20 73   of total page s
3a50: 69 7a 65 20 2a 2f 0a 20 20 75 38 20 6d 69 6e 4c  ize */.  u8 minL
3a60: 65 61 66 46 72 61 63 3b 20 20 20 20 20 20 20 2f  eafFrac;       /
3a70: 2a 20 4d 69 6e 69 6d 75 6d 20 6c 65 61 66 20 70  * Minimum leaf p
3a80: 61 79 6c 6f 61 64 20 61 73 20 25 20 6f 66 20 74  ayload as % of t
3a90: 6f 74 61 6c 20 70 61 67 65 20 73 69 7a 65 20 2a  otal page size *
3aa0: 2f 0a 20 20 75 38 20 70 61 67 65 53 69 7a 65 46  /.  u8 pageSizeF
3ab0: 69 78 65 64 3b 20 20 20 20 20 2f 2a 20 54 72 75  ixed;     /* Tru
3ac0: 65 20 69 66 20 74 68 65 20 70 61 67 65 20 73 69  e if the page si
3ad0: 7a 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72  ze can no longer
3ae0: 20 62 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 23   be changed */.#
3af0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3b00: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
3b10: 75 38 20 61 75 74 6f 56 61 63 75 75 6d 3b 20 20  u8 autoVacuum;  
3b20: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3b30: 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72   database suppor
3b40: 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 2a  ts auto-vacuum *
3b50: 2f 0a 23 65 6e 64 69 66 0a 20 20 75 31 36 20 70  /.#endif.  u16 p
3b60: 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  ageSize;        
3b70: 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
3b80: 20 6f 66 20 62 79 74 65 73 20 6f 6e 20 61 20 70   of bytes on a p
3b90: 61 67 65 20 2a 2f 0a 20 20 75 31 36 20 75 73 61  age */.  u16 usa
3ba0: 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 2f  bleSize;       /
3bb0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62  * Number of usab
3bc0: 6c 65 20 62 79 74 65 73 20 6f 6e 20 65 61 63 68  le bytes on each
3bd0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6d   page */.  int m
3be0: 61 78 4c 6f 63 61 6c 3b 20 20 20 20 20 20 20 20  axLocal;        
3bf0: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6c 6f 63 61   /* Maximum loca
3c00: 6c 20 70 61 79 6c 6f 61 64 20 69 6e 20 6e 6f 6e  l payload in non
3c10: 2d 4c 45 41 46 44 41 54 41 20 74 61 62 6c 65 73  -LEAFDATA tables
3c20: 20 2a 2f 0a 20 20 69 6e 74 20 6d 69 6e 4c 6f 63   */.  int minLoc
3c30: 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  al;         /* M
3c40: 69 6e 69 6d 75 6d 20 6c 6f 63 61 6c 20 70 61 79  inimum local pay
3c50: 6c 6f 61 64 20 69 6e 20 6e 6f 6e 2d 4c 45 41 46  load in non-LEAF
3c60: 44 41 54 41 20 74 61 62 6c 65 73 20 2a 2f 0a 20  DATA tables */. 
3c70: 20 69 6e 74 20 6d 61 78 4c 65 61 66 3b 20 20 20   int maxLeaf;   
3c80: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
3c90: 6d 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 20  m local payload 
3ca0: 69 6e 20 61 20 4c 45 41 46 44 41 54 41 20 74 61  in a LEAFDATA ta
3cb0: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 69 6e  ble */.  int min
3cc0: 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 2f  Leaf;          /
3cd0: 2a 20 4d 69 6e 69 6d 75 6d 20 6c 6f 63 61 6c 20  * Minimum local 
3ce0: 70 61 79 6c 6f 61 64 20 69 6e 20 61 20 4c 45 41  payload in a LEA
3cf0: 46 44 41 54 41 20 74 61 62 6c 65 20 2a 2f 0a 20  FDATA table */. 
3d00: 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42   BusyHandler *pB
3d10: 75 73 79 48 61 6e 64 6c 65 72 3b 20 20 20 2f 2a  usyHandler;   /*
3d20: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 77 68   Callback for wh
3d30: 65 6e 20 74 68 65 72 65 20 69 73 20 6c 6f 63 6b  en there is lock
3d40: 20 63 6f 6e 74 65 6e 74 69 6f 6e 20 2a 2f 0a 20   contention */. 
3d50: 20 75 38 20 69 6e 54 72 61 6e 73 61 63 74 69 6f   u8 inTransactio
3d60: 6e 3b 20 20 20 20 20 2f 2a 20 54 72 61 6e 73 61  n;     /* Transa
3d70: 63 74 69 6f 6e 20 73 74 61 74 65 20 2a 2f 0a 20  ction state */. 
3d80: 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
3d90: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3da0: 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
3db0: 6f 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  o this structure
3dc0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73   */.  int nTrans
3dd0: 61 63 74 69 6f 6e 3b 20 20 20 20 20 2f 2a 20 4e  action;     /* N
3de0: 75 6d 62 65 72 20 6f 66 20 6f 70 65 6e 20 74 72  umber of open tr
3df0: 61 6e 73 61 63 74 69 6f 6e 73 20 28 72 65 61 64  ansactions (read
3e00: 20 2b 20 77 72 69 74 65 29 20 2a 2f 0a 20 20 76   + write) */.  v
3e10: 6f 69 64 20 2a 70 53 63 68 65 6d 61 3b 20 20 20  oid *pSchema;   
3e20: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
3e30: 74 6f 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74  to space allocat
3e40: 65 64 20 62 79 20 73 71 6c 69 74 65 33 42 74 72  ed by sqlite3Btr
3e50: 65 65 53 63 68 65 6d 61 28 29 20 2a 2f 0a 20 20  eeSchema() */.  
3e60: 76 6f 69 64 20 28 2a 78 46 72 65 65 53 63 68 65  void (*xFreeSche
3e70: 6d 61 29 28 76 6f 69 64 2a 29 3b 20 20 2f 2a 20  ma)(void*);  /* 
3e80: 44 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 42  Destructor for B
3e90: 74 53 68 61 72 65 64 2e 70 53 63 68 65 6d 61 20  tShared.pSchema 
3ea0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
3eb0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
3ec0: 43 48 45 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c  CHE.  BtLock *pL
3ed0: 6f 63 6b 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  ock;        /* L
3ee0: 69 73 74 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c  ist of locks hel
3ef0: 64 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64  d on this shared
3f00: 2d 62 74 72 65 65 20 73 74 72 75 63 74 20 2a 2f  -btree struct */
3f10: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 4e 65  .  BtShared *pNe
3f20: 78 74 3b 20 20 20 20 20 20 2f 2a 20 4e 65 78 74  xt;      /* Next
3f30: 20 69 6e 20 54 68 72 65 61 64 44 61 74 61 2e 70   in ThreadData.p
3f40: 42 74 72 65 65 20 6c 69 6e 6b 65 64 20 6c 69 73  Btree linked lis
3f50: 74 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  t */.#endif.};..
3f60: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
3f70: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
3f80: 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ng structure is 
3f90: 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 69 6e 66  used to hold inf
3fa0: 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 61 62 6f 75  ormation.** abou
3fb0: 74 20 61 20 63 65 6c 6c 2e 20 20 54 68 65 20 70  t a cell.  The p
3fc0: 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 66 75  arseCellPtr() fu
3fd0: 6e 63 74 69 6f 6e 20 66 69 6c 6c 73 20 69 6e 20  nction fills in 
3fe0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 0a 2a  this structure.*
3ff0: 2a 20 62 61 73 65 64 20 6f 6e 20 69 6e 66 6f 72  * based on infor
4000: 6d 61 74 69 6f 6e 20 65 78 74 72 61 63 74 20 66  mation extract f
4010: 72 6f 6d 20 74 68 65 20 72 61 77 20 64 69 73 6b  rom the raw disk
4020: 20 70 61 67 65 2e 0a 2a 2f 0a 74 79 70 65 64 65   page..*/.typede
4030: 66 20 73 74 72 75 63 74 20 43 65 6c 6c 49 6e 66  f struct CellInf
4040: 6f 20 43 65 6c 6c 49 6e 66 6f 3b 0a 73 74 72 75  o CellInfo;.stru
4050: 63 74 20 43 65 6c 6c 49 6e 66 6f 20 7b 0a 20 20  ct CellInfo {.  
4060: 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 2f  u8 *pCell;     /
4070: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
4080: 20 73 74 61 72 74 20 6f 66 20 63 65 6c 6c 20 63   start of cell c
4090: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 36 34 20  ontent */.  i64 
40a0: 6e 4b 65 79 3b 20 20 20 20 20 20 2f 2a 20 54 68  nKey;      /* Th
40b0: 65 20 6b 65 79 20 66 6f 72 20 49 4e 54 4b 45 59  e key for INTKEY
40c0: 20 74 61 62 6c 65 73 2c 20 6f 72 20 6e 75 6d 62   tables, or numb
40d0: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 6b  er of bytes in k
40e0: 65 79 20 2a 2f 0a 20 20 75 33 32 20 6e 44 61 74  ey */.  u32 nDat
40f0: 61 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  a;     /* Number
4100: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74   of bytes of dat
4110: 61 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c  a */.  u32 nPayl
4120: 6f 61 64 3b 20 20 2f 2a 20 54 6f 74 61 6c 20 61  oad;  /* Total a
4130: 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
4140: 20 2a 2f 0a 20 20 75 31 36 20 6e 48 65 61 64 65   */.  u16 nHeade
4150: 72 3b 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20  r;   /* Size of 
4160: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
4170: 20 68 65 61 64 65 72 20 69 6e 20 62 79 74 65 73   header in bytes
4180: 20 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f 63 61 6c   */.  u16 nLocal
4190: 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f  ;    /* Amount o
41a0: 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c  f payload held l
41b0: 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 75 31 36 20  ocally */.  u16 
41c0: 69 4f 76 65 72 66 6c 6f 77 3b 20 2f 2a 20 4f 66  iOverflow; /* Of
41d0: 66 73 65 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77  fset to overflow
41e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 5a   page number.  Z
41f0: 65 72 6f 20 69 66 20 6e 6f 20 6f 76 65 72 66 6c  ero if no overfl
4200: 6f 77 20 2a 2f 0a 20 20 75 31 36 20 6e 53 69 7a  ow */.  u16 nSiz
4210: 65 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  e;     /* Size o
4220: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
4230: 6e 74 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62  nt on the main b
4240: 2d 74 72 65 65 20 70 61 67 65 20 2a 2f 0a 7d 3b  -tree page */.};
4250: 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 75 72 73 6f 72  ../*.** A cursor
4260: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
4270: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 65 6e   a particular en
4280: 74 72 79 20 69 6e 20 74 68 65 20 42 54 72 65 65  try in the BTree
4290: 2e 0a 2a 2a 20 54 68 65 20 65 6e 74 72 79 20 69  ..** The entry i
42a0: 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  s identified by 
42b0: 69 74 73 20 4d 65 6d 50 61 67 65 20 61 6e 64 20  its MemPage and 
42c0: 74 68 65 20 69 6e 64 65 78 20 69 6e 0a 2a 2a 20  the index in.** 
42d0: 4d 65 6d 50 61 67 65 2e 61 43 65 6c 6c 5b 5d 20  MemPage.aCell[] 
42e0: 6f 66 20 74 68 65 20 65 6e 74 72 79 2e 0a 2a 2f  of the entry..*/
42f0: 0a 73 74 72 75 63 74 20 42 74 43 75 72 73 6f 72  .struct BtCursor
4300: 20 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72   {.  Btree *pBtr
4310: 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ee;            /
4320: 2a 20 54 68 65 20 42 74 72 65 65 20 74 6f 20 77  * The Btree to w
4330: 68 69 63 68 20 74 68 69 73 20 63 75 72 73 6f 72  hich this cursor
4340: 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 42 74   belongs */.  Bt
4350: 43 75 72 73 6f 72 20 2a 70 4e 65 78 74 2c 20 2a  Cursor *pNext, *
4360: 70 50 72 65 76 3b 20 20 2f 2a 20 46 6f 72 6d 73  pPrev;  /* Forms
4370: 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f   a linked list o
4380: 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 2a 2f  f all cursors */
4390: 0a 20 20 69 6e 74 20 28 2a 78 43 6f 6d 70 61 72  .  int (*xCompar
43a0: 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  e)(void*,int,con
43b0: 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  st void*,int,con
43c0: 73 74 20 76 6f 69 64 2a 29 3b 20 2f 2a 20 4b 65  st void*); /* Ke
43d0: 79 20 63 6f 6d 70 20 66 75 6e 63 20 2a 2f 0a 20  y comp func */. 
43e0: 20 76 6f 69 64 20 2a 70 41 72 67 3b 20 20 20 20   void *pArg;    
43f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
4400: 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70  rst arg to xComp
4410: 61 72 65 28 29 20 2a 2f 0a 20 20 50 67 6e 6f 20  are() */.  Pgno 
4420: 70 67 6e 6f 52 6f 6f 74 3b 20 20 20 20 20 20 20  pgnoRoot;       
4430: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74       /* The root
4440: 20 70 61 67 65 20 6f 66 20 74 68 69 73 20 74 72   page of this tr
4450: 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ee */.  MemPage 
4460: 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  *pPage;         
4470: 20 20 2f 2a 20 50 61 67 65 20 74 68 61 74 20 63    /* Page that c
4480: 6f 6e 74 61 69 6e 73 20 74 68 65 20 65 6e 74 72  ontains the entr
4490: 79 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 3b 20  y */.  int idx; 
44a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44b0: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
44c0: 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65 2d   entry in pPage-
44d0: 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 43 65  >aCell[] */.  Ce
44e0: 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 20 20 20 20  llInfo info;    
44f0: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 70 61 72          /* A par
4500: 73 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 77  se of the cell w
4510: 65 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 20 61  e are pointing a
4520: 74 20 2a 2f 0a 20 20 75 38 20 77 72 46 6c 61 67  t */.  u8 wrFlag
4530: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4540: 20 2f 2a 20 54 72 75 65 20 69 66 20 77 72 69 74   /* True if writ
4550: 61 62 6c 65 20 2a 2f 0a 20 20 75 38 20 65 53 74  able */.  u8 eSt
4560: 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ate;            
4570: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
4580: 65 20 43 55 52 53 4f 52 5f 58 58 58 20 63 6f 6e  e CURSOR_XXX con
4590: 73 74 61 6e 74 73 20 28 73 65 65 20 62 65 6c 6f  stants (see belo
45a0: 77 29 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 4b  w) */.  void *pK
45b0: 65 79 3b 20 20 20 20 20 20 2f 2a 20 53 61 76 65  ey;      /* Save
45c0: 64 20 6b 65 79 20 74 68 61 74 20 77 61 73 20 63  d key that was c
45d0: 75 72 73 6f 72 27 73 20 6c 61 73 74 20 6b 6e 6f  ursor's last kno
45e0: 77 6e 20 70 6f 73 69 74 69 6f 6e 20 2a 2f 0a 20  wn position */. 
45f0: 20 69 36 34 20 6e 4b 65 79 3b 20 20 20 20 20 20   i64 nKey;      
4600: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 4b 65    /* Size of pKe
4610: 79 2c 20 6f 72 20 6c 61 73 74 20 69 6e 74 65 67  y, or last integ
4620: 65 72 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  er key */.  int 
4630: 73 6b 69 70 3b 20 20 20 20 20 20 20 20 2f 2a 20  skip;        /* 
4640: 28 73 6b 69 70 3c 30 29 20 2d 3e 20 50 72 65 76  (skip<0) -> Prev
4650: 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 28  () is a no-op. (
4660: 73 6b 69 70 3e 30 29 20 2d 3e 20 4e 65 78 74 28  skip>0) -> Next(
4670: 29 20 69 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  ) is */.};../*.*
4680: 2a 20 50 6f 74 65 6e 74 69 61 6c 20 76 61 6c 75  * Potential valu
4690: 65 73 20 66 6f 72 20 42 74 43 75 72 73 6f 72 2e  es for BtCursor.
46a0: 65 53 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 43 55  eState..**.** CU
46b0: 52 53 4f 52 5f 56 41 4c 49 44 3a 0a 2a 2a 20 20  RSOR_VALID:.**  
46c0: 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 74   Cursor points t
46d0: 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2e  o a valid entry.
46e0: 20 67 65 74 50 61 79 6c 6f 61 64 28 29 20 65 74   getPayload() et
46f0: 63 2e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  c. may be called
4700: 2e 0a 2a 2a 0a 2a 2a 20 43 55 52 53 4f 52 5f 49  ..**.** CURSOR_I
4710: 4e 56 41 4c 49 44 3a 0a 2a 2a 20 20 20 43 75 72  NVALID:.**   Cur
4720: 73 6f 72 20 64 6f 65 73 20 6e 6f 74 20 70 6f 69  sor does not poi
4730: 6e 74 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e  nt to a valid en
4740: 74 72 79 2e 20 54 68 69 73 20 63 61 6e 20 68 61  try. This can ha
4750: 70 70 65 6e 20 28 66 6f 72 20 65 78 61 6d 70 6c  ppen (for exampl
4760: 65 29 20 0a 2a 2a 20 20 20 62 65 63 61 75 73 65  e) .**   because
4770: 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
4780: 70 74 79 20 6f 72 20 62 65 63 61 75 73 65 20 42  pty or because B
4790: 74 72 65 65 43 75 72 73 6f 72 46 69 72 73 74 28  treeCursorFirst(
47a0: 29 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 0a 2a  ) has not been.*
47b0: 2a 20 20 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a  *   called..**.*
47c0: 2a 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  * CURSOR_REQUIRE
47d0: 53 45 45 4b 3a 0a 2a 2a 20 20 20 54 68 65 20 74  SEEK:.**   The t
47e0: 61 62 6c 65 20 74 68 61 74 20 74 68 69 73 20 63  able that this c
47f0: 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64  ursor was opened
4800: 20 6f 6e 20 73 74 69 6c 6c 20 65 78 69 73 74 73   on still exists
4810: 2c 20 62 75 74 20 68 61 73 20 62 65 65 6e 20 0a  , but has been .
4820: 2a 2a 20 20 20 6d 6f 64 69 66 69 65 64 20 73 69  **   modified si
4830: 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 77  nce the cursor w
4840: 61 73 20 6c 61 73 74 20 75 73 65 64 2e 20 54 68  as last used. Th
4850: 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  e cursor positio
4860: 6e 20 69 73 20 73 61 76 65 64 0a 2a 2a 20 20 20  n is saved.**   
4870: 69 6e 20 76 61 72 69 61 62 6c 65 73 20 42 74 43  in variables BtC
4880: 75 72 73 6f 72 2e 70 4b 65 79 20 61 6e 64 20 42  ursor.pKey and B
4890: 74 43 75 72 73 6f 72 2e 6e 4b 65 79 2e 20 57 68  tCursor.nKey. Wh
48a0: 65 6e 20 61 20 63 75 72 73 6f 72 20 69 73 20 69  en a cursor is i
48b0: 6e 20 0a 2a 2a 20 20 20 74 68 69 73 20 73 74 61  n .**   this sta
48c0: 74 65 2c 20 72 65 73 74 6f 72 65 4f 72 43 6c 65  te, restoreOrCle
48d0: 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  arCursorPosition
48e0: 28 29 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64  () can be called
48f0: 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 0a 2a   to attempt to.*
4900: 2a 20 20 20 73 65 65 6b 20 74 68 65 20 63 75 72  *   seek the cur
4910: 73 6f 72 20 74 6f 20 74 68 65 20 73 61 76 65 64  sor to the saved
4920: 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 64   position..*/.#d
4930: 65 66 69 6e 65 20 43 55 52 53 4f 52 5f 49 4e 56  efine CURSOR_INV
4940: 41 4c 49 44 20 20 20 20 20 20 20 20 20 20 20 30  ALID           0
4950: 0a 23 64 65 66 69 6e 65 20 43 55 52 53 4f 52 5f  .#define CURSOR_
4960: 56 41 4c 49 44 20 20 20 20 20 20 20 20 20 20 20  VALID           
4970: 20 20 31 0a 23 64 65 66 69 6e 65 20 43 55 52 53    1.#define CURS
4980: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 20  OR_REQUIRESEEK  
4990: 20 20 20 20 20 32 0a 0a 2f 2a 0a 2a 2a 20 54 68       2../*.** Th
49a0: 65 20 54 52 41 43 45 20 6d 61 63 72 6f 20 77 69  e TRACE macro wi
49b0: 6c 6c 20 70 72 69 6e 74 20 68 69 67 68 2d 6c 65  ll print high-le
49c0: 76 65 6c 20 73 74 61 74 75 73 20 69 6e 66 6f 72  vel status infor
49d0: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
49e0: 0a 2a 2a 20 62 74 72 65 65 20 6f 70 65 72 61 74  .** btree operat
49f0: 69 6f 6e 20 77 68 65 6e 20 74 68 65 20 67 6c 6f  ion when the glo
4a00: 62 61 6c 20 76 61 72 69 61 62 6c 65 20 73 71 6c  bal variable sql
4a10: 69 74 65 33 5f 62 74 72 65 65 5f 74 72 61 63 65  ite3_btree_trace
4a20: 20 69 73 0a 2a 2a 20 65 6e 61 62 6c 65 64 2e 0a   is.** enabled..
4a30: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45  */.#if SQLITE_TE
4a40: 53 54 0a 23 20 64 65 66 69 6e 65 20 54 52 41 43  ST.# define TRAC
4a50: 45 28 58 29 20 20 20 69 66 28 20 73 71 6c 69 74  E(X)   if( sqlit
4a60: 65 33 5f 62 74 72 65 65 5f 74 72 61 63 65 20 29  e3_btree_trace )
4a70: 5c 0a 2f 2a 20 20 20 20 20 20 20 20 20 20 20 20  \./*            
4a80: 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 73 71              { sq
4a90: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
4aa0: 20 58 3b 20 66 66 6c 75 73 68 28 73 74 64 6f 75   X; fflush(stdou
4ab0: 74 29 3b 20 7d 20 2a 2f 20 5c 0a 7b 20 70 72 69  t); } */ \.{ pri
4ac0: 6e 74 66 20 58 3b 20 66 66 6c 75 73 68 28 73 74  ntf X; fflush(st
4ad0: 64 6f 75 74 29 3b 20 7d 0a 69 6e 74 20 73 71 6c  dout); }.int sql
4ae0: 69 74 65 33 5f 62 74 72 65 65 5f 74 72 61 63 65  ite3_btree_trace
4af0: 3d 30 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =0;  /* True to 
4b00: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
4b10: 2f 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  /.#else.# define
4b20: 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66   TRACE(X).#endif
4b30: 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20  ../*.** Forward 
4b40: 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73  declaration.*/.s
4b50: 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 52  tatic int checkR
4b60: 65 61 64 4c 6f 63 6b 73 28 42 74 72 65 65 2a 2c  eadLocks(Btree*,
4b70: 50 67 6e 6f 2c 42 74 43 75 72 73 6f 72 2a 29 3b  Pgno,BtCursor*);
4b80: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 6f 72 20  ../*.** Read or 
4b90: 77 72 69 74 65 20 61 20 74 77 6f 2d 20 61 6e 64  write a two- and
4ba0: 20 66 6f 75 72 2d 62 79 74 65 20 62 69 67 2d 65   four-byte big-e
4bb0: 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 76 61  ndian integer va
4bc0: 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lues..*/.static 
4bd0: 75 33 32 20 67 65 74 32 62 79 74 65 28 75 6e 73  u32 get2byte(uns
4be0: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 29 7b 0a  igned char *p){.
4bf0: 20 20 72 65 74 75 72 6e 20 28 70 5b 30 5d 3c 3c    return (p[0]<<
4c00: 38 29 20 7c 20 70 5b 31 5d 3b 0a 7d 0a 73 74 61  8) | p[1];.}.sta
4c10: 74 69 63 20 75 33 32 20 67 65 74 34 62 79 74 65  tic u32 get4byte
4c20: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
4c30: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 5b  p){.  return (p[
4c40: 30 5d 3c 3c 32 34 29 20 7c 20 28 70 5b 31 5d 3c  0]<<24) | (p[1]<
4c50: 3c 31 36 29 20 7c 20 28 70 5b 32 5d 3c 3c 38 29  <16) | (p[2]<<8)
4c60: 20 7c 20 70 5b 33 5d 3b 0a 7d 0a 73 74 61 74 69   | p[3];.}.stati
4c70: 63 20 76 6f 69 64 20 70 75 74 32 62 79 74 65 28  c void put2byte(
4c80: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
4c90: 2c 20 75 33 32 20 76 29 7b 0a 20 20 70 5b 30 5d  , u32 v){.  p[0]
4ca0: 20 3d 20 76 3e 3e 38 3b 0a 20 20 70 5b 31 5d 20   = v>>8;.  p[1] 
4cb0: 3d 20 76 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  = v;.}.static vo
4cc0: 69 64 20 70 75 74 34 62 79 74 65 28 75 6e 73 69  id put4byte(unsi
4cd0: 67 6e 65 64 20 63 68 61 72 20 2a 70 2c 20 75 33  gned char *p, u3
4ce0: 32 20 76 29 7b 0a 20 20 70 5b 30 5d 20 3d 20 76  2 v){.  p[0] = v
4cf0: 3e 3e 32 34 3b 0a 20 20 70 5b 31 5d 20 3d 20 76  >>24;.  p[1] = v
4d00: 3e 3e 31 36 3b 0a 20 20 70 5b 32 5d 20 3d 20 76  >>16;.  p[2] = v
4d10: 3e 3e 38 3b 0a 20 20 70 5b 33 5d 20 3d 20 76 3b  >>8;.  p[3] = v;
4d20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e  .}../*.** Routin
4d30: 65 73 20 74 6f 20 72 65 61 64 20 61 6e 64 20 77  es to read and w
4d40: 72 69 74 65 20 76 61 72 69 61 62 6c 65 2d 6c 65  rite variable-le
4d50: 6e 67 74 68 20 69 6e 74 65 67 65 72 73 2e 20 20  ngth integers.  
4d60: 54 68 65 73 65 20 75 73 65 64 20 74 6f 0a 2a 2a  These used to.**
4d70: 20 62 65 20 64 65 66 69 6e 65 64 20 6c 6f 63 61   be defined loca
4d80: 6c 6c 79 2c 20 62 75 74 20 6e 6f 77 20 77 65 20  lly, but now we 
4d90: 75 73 65 20 74 68 65 20 76 61 72 69 6e 74 20 72  use the varint r
4da0: 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 65 20 75  outines in the u
4db0: 74 69 6c 2e 63 0a 2a 2a 20 66 69 6c 65 2e 0a 2a  til.c.** file..*
4dc0: 2f 0a 23 64 65 66 69 6e 65 20 67 65 74 56 61 72  /.#define getVar
4dd0: 69 6e 74 20 20 20 20 73 71 6c 69 74 65 33 47 65  int    sqlite3Ge
4de0: 74 56 61 72 69 6e 74 0a 2f 2a 20 23 64 65 66 69  tVarint./* #defi
4df0: 6e 65 20 67 65 74 56 61 72 69 6e 74 33 32 20 20  ne getVarint32  
4e00: 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
4e10: 33 32 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65  32 */.#define ge
4e20: 74 56 61 72 69 6e 74 33 32 28 41 2c 42 29 20 20  tVarint32(A,B)  
4e30: 28 28 2a 42 3d 2a 28 41 29 29 3c 3d 30 78 37 66  ((*B=*(A))<=0x7f
4e40: 3f 31 3a 73 71 6c 69 74 65 33 47 65 74 56 61 72  ?1:sqlite3GetVar
4e50: 69 6e 74 33 32 28 41 2c 42 29 29 0a 23 64 65 66  int32(A,B)).#def
4e60: 69 6e 65 20 70 75 74 56 61 72 69 6e 74 20 20 20  ine putVarint   
4e70: 20 73 71 6c 69 74 65 33 50 75 74 56 61 72 69 6e   sqlite3PutVarin
4e80: 74 0a 0a 2f 2a 20 54 68 65 20 64 61 74 61 62 61  t../* The databa
4e90: 73 65 20 70 61 67 65 20 74 68 65 20 50 45 4e 44  se page the PEND
4ea0: 49 4e 47 5f 42 59 54 45 20 6f 63 63 75 70 69 65  ING_BYTE occupie
4eb0: 73 2e 20 54 68 69 73 20 70 61 67 65 20 69 73 20  s. This page is 
4ec0: 6e 65 76 65 72 20 75 73 65 64 2e 0a 2a 2a 20 54  never used..** T
4ed0: 4f 44 4f 3a 20 54 68 69 73 20 6d 61 63 72 6f 20  ODO: This macro 
4ee0: 69 73 20 76 65 72 79 20 73 69 6d 69 6c 61 72 79  is very similary
4ef0: 20 74 6f 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e   to PAGER_MJ_PGN
4f00: 4f 28 29 20 69 6e 20 70 61 67 65 72 2e 63 2e 20  O() in pager.c. 
4f10: 54 68 65 79 0a 2a 2a 20 73 68 6f 75 6c 64 20 70  They.** should p
4f20: 6f 73 73 69 62 6c 79 20 62 65 20 63 6f 6e 73 6f  ossibly be conso
4f30: 6c 69 64 61 74 65 64 20 28 70 72 65 73 75 6d 61  lidated (presuma
4f40: 62 6c 79 20 69 6e 20 70 61 67 65 72 2e 68 29 2e  bly in pager.h).
4f50: 0a 2a 2a 0a 2a 2a 20 49 66 20 64 69 73 6b 20 49  .**.** If disk I
4f60: 2f 4f 20 69 73 20 6f 6d 69 74 74 65 64 20 28 6d  /O is omitted (m
4f70: 65 61 6e 69 6e 67 20 74 68 61 74 20 74 68 65 20  eaning that the 
4f80: 64 61 74 61 62 61 73 65 20 69 73 20 73 74 6f 72  database is stor
4f90: 65 64 20 70 75 72 65 6c 79 0a 2a 2a 20 69 6e 20  ed purely.** in 
4fa0: 6d 65 6d 6f 72 79 29 20 74 68 65 6e 20 74 68 65  memory) then the
4fb0: 72 65 20 69 73 20 6e 6f 20 70 65 6e 64 69 6e 67  re is no pending
4fc0: 20 62 79 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66   byte..*/.#ifdef
4fd0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53   SQLITE_OMIT_DIS
4fe0: 4b 49 4f 0a 23 20 64 65 66 69 6e 65 20 50 45 4e  KIO.# define PEN
4ff0: 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
5000: 42 74 29 20 20 30 78 37 66 66 66 66 66 66 66 0a  Bt)  0x7fffffff.
5010: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 50  #else.# define P
5020: 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
5030: 28 70 42 74 29 20 28 28 50 45 4e 44 49 4e 47 5f  (pBt) ((PENDING_
5040: 42 59 54 45 2f 28 70 42 74 29 2d 3e 70 61 67 65  BYTE/(pBt)->page
5050: 53 69 7a 65 29 2b 31 29 0a 23 65 6e 64 69 66 0a  Size)+1).#endif.
5060: 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 6e 6b 65 64 20  ./*.** A linked 
5070: 6c 69 73 74 20 6f 66 20 74 68 65 20 66 6f 6c 6c  list of the foll
5080: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 73  owing structures
5090: 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 42 74   is stored at Bt
50a0: 53 68 61 72 65 64 2e 70 4c 6f 63 6b 2e 0a 2a 2a  Shared.pLock..**
50b0: 20 4c 6f 63 6b 73 20 61 72 65 20 61 64 64 65 64   Locks are added
50c0: 20 28 6f 72 20 75 70 67 72 61 64 65 64 20 66 72   (or upgraded fr
50d0: 6f 6d 20 52 45 41 44 5f 4c 4f 43 4b 20 74 6f 20  om READ_LOCK to 
50e0: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 77 68 65 6e  WRITE_LOCK) when
50f0: 20 61 20 63 75 72 73 6f 72 20 0a 2a 2a 20 69 73   a cursor .** is
5100: 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 74   opened on the t
5110: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 20 70  able with root p
5120: 61 67 65 20 42 74 53 68 61 72 65 64 2e 69 54 61  age BtShared.iTa
5130: 62 6c 65 2e 20 4c 6f 63 6b 73 20 61 72 65 20 72  ble. Locks are r
5140: 65 6d 6f 76 65 64 0a 2a 2a 20 66 72 6f 6d 20 74  emoved.** from t
5150: 68 69 73 20 6c 69 73 74 20 77 68 65 6e 20 61 20  his list when a 
5160: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
5170: 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
5180: 65 64 20 62 61 63 6b 2c 20 6f 72 20 77 68 65 6e  ed back, or when
5190: 0a 2a 2a 20 61 20 62 74 72 65 65 20 68 61 6e 64  .** a btree hand
51a0: 6c 65 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f  le is closed..*/
51b0: 0a 73 74 72 75 63 74 20 42 74 4c 6f 63 6b 20 7b  .struct BtLock {
51c0: 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
51d0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65  ;        /* Btre
51e0: 65 20 68 61 6e 64 6c 65 20 68 6f 6c 64 69 6e 67  e handle holding
51f0: 20 74 68 69 73 20 6c 6f 63 6b 20 2a 2f 0a 20 20   this lock */.  
5200: 50 67 6e 6f 20 69 54 61 62 6c 65 3b 20 20 20 20  Pgno iTable;    
5210: 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
5220: 67 65 20 6f 66 20 74 61 62 6c 65 20 2a 2f 0a 20  ge of table */. 
5230: 20 75 38 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20   u8 eLock;      
5240: 20 20 20 20 20 20 20 2f 2a 20 52 45 41 44 5f 4c         /* READ_L
5250: 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f 43  OCK or WRITE_LOC
5260: 4b 20 2a 2f 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  K */.  BtLock *p
5270: 4e 65 78 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  Next;        /* 
5280: 4e 65 78 74 20 69 6e 20 42 74 53 68 61 72 65 64  Next in BtShared
5290: 2e 70 4c 6f 63 6b 20 6c 69 73 74 20 2a 2f 0a 7d  .pLock list */.}
52a0: 3b 0a 0a 2f 2a 20 43 61 6e 64 69 64 61 74 65 20  ;../* Candidate 
52b0: 76 61 6c 75 65 73 20 66 6f 72 20 42 74 4c 6f 63  values for BtLoc
52c0: 6b 2e 65 4c 6f 63 6b 20 2a 2f 0a 23 64 65 66 69  k.eLock */.#defi
52d0: 6e 65 20 52 45 41 44 5f 4c 4f 43 4b 20 20 20 20  ne READ_LOCK    
52e0: 20 31 0a 23 64 65 66 69 6e 65 20 57 52 49 54 45   1.#define WRITE
52f0: 5f 4c 4f 43 4b 20 20 20 20 32 0a 0a 23 69 66 64  _LOCK    2..#ifd
5300: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
5310: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a  HARED_CACHE.  /*
5320: 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74 69  .  ** The functi
5330: 6f 6e 73 20 71 75 65 72 79 54 61 62 6c 65 4c 6f  ons queryTableLo
5340: 63 6b 28 29 2c 20 6c 6f 63 6b 54 61 62 6c 65 28  ck(), lockTable(
5350: 29 20 61 6e 64 20 75 6e 6c 6f 63 6b 41 6c 6c 54  ) and unlockAllT
5360: 61 62 6c 65 73 28 29 0a 20 20 2a 2a 20 6d 61 6e  ables().  ** man
5370: 69 70 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20  ipulate entries 
5380: 69 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  in the BtShared.
5390: 70 4c 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73  pLock linked lis
53a0: 74 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a  t used to store.
53b0: 20 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68    ** shared-cach
53c0: 65 20 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f  e table level lo
53d0: 63 6b 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72  cks. If the libr
53e0: 61 72 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20  ary is compiled 
53f0: 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68  with the.  ** sh
5400: 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74 75  ared-cache featu
5410: 72 65 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65  re disabled, the
5420: 6e 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  n there is only 
5430: 65 76 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20  ever one user.  
5440: 2a 2a 20 6f 66 20 65 61 63 68 20 42 74 53 68 61  ** of each BtSha
5450: 72 65 64 20 73 74 72 75 63 74 75 72 65 20 61 6e  red structure an
5460: 64 20 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e  d so this lockin
5470: 67 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  g is not necessa
5480: 72 79 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66  ry. .  ** So def
5490: 69 6e 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c  ine the lock rel
54a0: 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61  ated functions a
54b0: 73 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20  s no-ops..  */. 
54c0: 20 23 64 65 66 69 6e 65 20 71 75 65 72 79 54 61   #define queryTa
54d0: 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20 53  bleLock(a,b,c) S
54e0: 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69  QLITE_OK.  #defi
54f0: 6e 65 20 6c 6f 63 6b 54 61 62 6c 65 28 61 2c 62  ne lockTable(a,b
5500: 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  ,c) SQLITE_OK.  
5510: 23 64 65 66 69 6e 65 20 75 6e 6c 6f 63 6b 41 6c  #define unlockAl
5520: 6c 54 61 62 6c 65 73 28 61 29 0a 23 65 6c 73 65  lTables(a).#else
5530: 0a 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74  .../*.** Query t
5540: 6f 20 73 65 65 20 69 66 20 62 74 72 65 65 20 68  o see if btree h
5550: 61 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61  andle p may obta
5560: 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70  in a lock of typ
5570: 65 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41  e eLock .** (REA
5580: 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f  D_LOCK or WRITE_
5590: 4c 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62  LOCK) on the tab
55a0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
55b0: 65 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a  e iTab. Return.*
55c0: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74  * SQLITE_OK if t
55d0: 68 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f  he lock may be o
55e0: 62 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c  btained (by call
55f0: 69 6e 67 20 6c 6f 63 6b 54 61 62 6c 65 28 29 29  ing lockTable())
5600: 2c 20 6f 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c  , or.** SQLITE_L
5610: 4f 43 4b 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f  OCKED if not..*/
5620: 0a 73 74 61 74 69 63 20 69 6e 74 20 71 75 65 72  .static int quer
5630: 79 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  yTableLock(Btree
5640: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20   *p, Pgno iTab, 
5650: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
5660: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
5670: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
5680: 49 74 65 72 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  Iter;..  /* This
5690: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
56a0: 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  he shared-cache 
56b0: 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a  is not enabled *
56c0: 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74  /.  if( 0==sqlit
56d0: 65 33 54 68 72 65 61 64 44 61 74 61 52 65 61 64  e3ThreadDataRead
56e0: 4f 6e 6c 79 28 29 2d 3e 75 73 65 53 68 61 72 65  Only()->useShare
56f0: 64 44 61 74 61 20 29 7b 0a 20 20 20 20 72 65 74  dData ){.    ret
5700: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
5710: 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 28 61   }..  /* This (a
5720: 6c 6f 6e 67 20 77 69 74 68 20 6c 6f 63 6b 54 61  long with lockTa
5730: 62 6c 65 28 29 29 20 69 73 20 77 68 65 72 65 20  ble()) is where 
5740: 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74  the ReadUncommit
5750: 74 65 64 20 66 6c 61 67 20 69 73 0a 20 20 2a 2a  ted flag is.  **
5760: 20 64 65 61 6c 74 20 77 69 74 68 2e 20 49 66 20   dealt with. If 
5770: 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 71 75  the caller is qu
5780: 65 72 79 69 6e 67 20 66 6f 72 20 61 20 72 65 61  erying for a rea
5790: 64 2d 6c 6f 63 6b 20 61 6e 64 20 74 68 65 20 66  d-lock and the f
57a0: 6c 61 67 20 69 73 0a 20 20 2a 2a 20 73 65 74 2c  lag is.  ** set,
57b0: 20 69 74 20 69 73 20 75 6e 63 6f 6e 64 69 74 69   it is unconditi
57c0: 6f 6e 61 6c 6c 79 20 67 72 61 6e 74 65 64 20 2d  onally granted -
57d0: 20 65 76 65 6e 20 69 66 20 74 68 65 72 65 20 61   even if there a
57e0: 72 65 20 77 72 69 74 65 2d 6c 6f 63 6b 73 0a 20  re write-locks. 
57f0: 20 2a 2a 20 6f 6e 20 74 68 65 20 74 61 62 6c 65   ** on the table
5800: 2e 20 49 66 20 61 20 77 72 69 74 65 2d 6c 6f 63  . If a write-loc
5810: 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  k is requested, 
5820: 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74  the ReadUncommit
5830: 74 65 64 20 66 6c 61 67 0a 20 20 2a 2a 20 69 73  ted flag.  ** is
5840: 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 2e   not considered.
5850: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 66 75  .  **.  ** In fu
5860: 6e 63 74 69 6f 6e 20 6c 6f 63 6b 54 61 62 6c 65  nction lockTable
5870: 28 29 2c 20 69 66 20 61 20 72 65 61 64 2d 6c 6f  (), if a read-lo
5880: 63 6b 20 69 73 20 64 65 6d 61 6e 64 65 64 20 61  ck is demanded a
5890: 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20 52 65 61  nd the .  ** Rea
58a0: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61  dUncommitted fla
58b0: 67 20 69 73 20 73 65 74 2c 20 6e 6f 20 65 6e 74  g is set, no ent
58c0: 72 79 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ry is added to t
58d0: 68 65 20 6c 6f 63 6b 73 20 6c 69 73 74 20 0a 20  he locks list . 
58e0: 20 2a 2a 20 28 42 74 53 68 61 72 65 64 2e 70 4c   ** (BtShared.pL
58f0: 6f 63 6b 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ock)..  **.  ** 
5900: 54 6f 20 73 75 6d 6d 61 72 69 7a 65 3a 20 49 66  To summarize: If
5910: 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69   the ReadUncommi
5920: 74 74 65 64 20 66 6c 61 67 20 69 73 20 73 65 74  tted flag is set
5930: 2c 20 74 68 65 6e 20 72 65 61 64 20 63 75 72 73  , then read curs
5940: 6f 72 73 20 64 6f 0a 20 20 2a 2a 20 6e 6f 74 20  ors do.  ** not 
5950: 63 72 65 61 74 65 20 6f 72 20 72 65 73 70 65 63  create or respec
5960: 74 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2e 20 54  t table locks. T
5970: 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 63 65  he locking proce
5980: 64 75 72 65 20 66 6f 72 20 61 20 0a 20 20 2a 2a  dure for a .  **
5990: 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 64 6f   write-cursor do
59a0: 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 2e 0a 20  es not change.. 
59b0: 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20 20 21   */.  if( .    !
59c0: 70 2d 3e 70 53 71 6c 69 74 65 20 7c 7c 20 0a 20  p->pSqlite || . 
59d0: 20 20 20 30 3d 3d 28 70 2d 3e 70 53 71 6c 69 74     0==(p->pSqlit
59e0: 65 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  e->flags&SQLITE_
59f0: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29  ReadUncommitted)
5a00: 20 7c 7c 20 0a 20 20 20 20 65 4c 6f 63 6b 3d 3d   || .    eLock==
5a10: 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 0a 20 20  WRITE_LOCK ||.  
5a20: 20 20 69 54 61 62 3d 3d 4d 41 53 54 45 52 5f 52    iTab==MASTER_R
5a30: 4f 4f 54 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72  OOT.  ){.    for
5a40: 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
5a50: 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
5a60: 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
5a70: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
5a80: 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49 74  pBtree!=p && pIt
5a90: 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62  er->iTable==iTab
5aa0: 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 28   && .          (
5ab0: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c  pIter->eLock!=eL
5ac0: 6f 63 6b 20 7c 7c 20 65 4c 6f 63 6b 21 3d 52 45  ock || eLock!=RE
5ad0: 41 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20  AD_LOCK) ){.    
5ae0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5af0: 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20  E_LOCKED;.      
5b00: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
5b10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
5b20: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c  }../*.** Add a l
5b30: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
5b40: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
5b50: 69 54 61 62 6c 65 20 74 6f 20 74 68 65 20 73 68  iTable to the sh
5b60: 61 72 65 64 2d 62 74 72 65 65 20 75 73 65 64 0a  ared-btree used.
5b70: 2a 2a 20 62 79 20 42 74 72 65 65 20 68 61 6e 64  ** by Btree hand
5b80: 6c 65 20 70 2e 20 50 61 72 61 6d 65 74 65 72 20  le p. Parameter 
5b90: 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 65 69  eLock must be ei
5ba0: 74 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20 6f  ther READ_LOCK o
5bb0: 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43 4b  r .** WRITE_LOCK
5bc0: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
5bd0: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
5be0: 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64   the lock is add
5bf0: 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e  ed successfully.
5c00: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64   SQLITE_BUSY and
5c10: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
5c20: 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 72 65 74   may also be ret
5c30: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
5c40: 20 69 6e 74 20 6c 6f 63 6b 54 61 62 6c 65 28 42   int lockTable(B
5c50: 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54  tree *p, Pgno iT
5c60: 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b  able, u8 eLock){
5c70: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
5c80: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c   = p->pBt;.  BtL
5c90: 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a  ock *pLock = 0;.
5ca0: 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b    BtLock *pIter;
5cb0: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61  ..  /* This is a
5cc0: 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68   no-op if the sh
5cd0: 61 72 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f  ared-cache is no
5ce0: 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69  t enabled */.  i
5cf0: 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 54 68 72  f( 0==sqlite3Thr
5d00: 65 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79 28  eadDataReadOnly(
5d10: 29 2d 3e 75 73 65 53 68 61 72 65 64 44 61 74 61  )->useSharedData
5d20: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
5d30: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
5d40: 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
5d50: 4f 4b 3d 3d 71 75 65 72 79 54 61 62 6c 65 4c 6f  OK==queryTableLo
5d60: 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c  ck(p, iTable, eL
5d70: 6f 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  ock) );..  /* If
5d80: 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d   the read-uncomm
5d90: 69 74 74 65 64 20 66 6c 61 67 20 69 73 20 73 65  itted flag is se
5da0: 74 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63  t and a read-loc
5db0: 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 0a  k is requested,.
5dc0: 20 20 2a 2a 20 72 65 74 75 72 6e 20 65 61 72 6c    ** return earl
5dd0: 79 20 77 69 74 68 6f 75 74 20 61 64 64 69 6e 67  y without adding
5de0: 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65   an entry to the
5df0: 20 42 74 53 68 61 72 65 64 2e 70 4c 6f 63 6b 20   BtShared.pLock 
5e00: 6c 69 73 74 2e 20 53 65 65 0a 20 20 2a 2a 20 63  list. See.  ** c
5e10: 6f 6d 6d 65 6e 74 20 69 6e 20 66 75 6e 63 74 69  omment in functi
5e20: 6f 6e 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63  on queryTableLoc
5e30: 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 69 6e 66  k() for more inf
5e40: 6f 20 6f 6e 20 68 61 6e 64 6c 69 6e 67 20 0a 20  o on handling . 
5e50: 20 2a 2a 20 74 68 65 20 52 65 61 64 55 6e 63 6f   ** the ReadUnco
5e60: 6d 6d 69 74 74 65 64 20 66 6c 61 67 2e 0a 20 20  mmitted flag..  
5e70: 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20 20 28 70  */.  if( .    (p
5e80: 2d 3e 70 53 71 6c 69 74 65 29 20 26 26 20 0a 20  ->pSqlite) && . 
5e90: 20 20 20 28 70 2d 3e 70 53 71 6c 69 74 65 2d 3e     (p->pSqlite->
5ea0: 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61  flags&SQLITE_Rea
5eb0: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 20 26 26  dUncommitted) &&
5ec0: 20 0a 20 20 20 20 28 65 4c 6f 63 6b 3d 3d 52 45   .    (eLock==RE
5ed0: 41 44 5f 4c 4f 43 4b 29 20 26 26 0a 20 20 20 20  AD_LOCK) &&.    
5ee0: 69 54 61 62 6c 65 21 3d 4d 41 53 54 45 52 5f 52  iTable!=MASTER_R
5ef0: 4f 4f 54 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  OOT.  ){.    ret
5f00: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
5f10: 20 7d 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 73   }..  /* First s
5f20: 65 61 72 63 68 20 74 68 65 20 6c 69 73 74 20 66  earch the list f
5f30: 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6c  or an existing l
5f40: 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74 61 62 6c  ock on this tabl
5f50: 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49 74 65  e. */.  for(pIte
5f60: 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
5f70: 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
5f80: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
5f90: 28 20 70 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d  ( pIter->iTable=
5fa0: 3d 69 54 61 62 6c 65 20 26 26 20 70 49 74 65 72  =iTable && pIter
5fb0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
5fc0: 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20 70 49 74       pLock = pIt
5fd0: 65 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  er;.      break;
5fe0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
5ff0: 20 49 66 20 74 68 65 20 61 62 6f 76 65 20 73 65   If the above se
6000: 61 72 63 68 20 64 69 64 20 6e 6f 74 20 66 69 6e  arch did not fin
6010: 64 20 61 20 42 74 4c 6f 63 6b 20 73 74 72 75 63  d a BtLock struc
6020: 74 20 61 73 73 6f 63 69 61 74 69 6e 67 20 42 74  t associating Bt
6030: 72 65 65 20 70 0a 20 20 2a 2a 20 77 69 74 68 20  ree p.  ** with 
6040: 74 61 62 6c 65 20 69 54 61 62 6c 65 2c 20 61 6c  table iTable, al
6050: 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e 64 20 6c  locate one and l
6060: 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74 68 65 20  ink it into the 
6070: 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  list..  */.  if(
6080: 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70   !pLock ){.    p
6090: 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63 6b 20 2a  Lock = (BtLock *
60a0: 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 69  )sqliteMalloc(si
60b0: 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20  zeof(BtLock));. 
60c0: 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b     if( !pLock ){
60d0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
60e0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
60f0: 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61  }.    pLock->iTa
6100: 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20  ble = iTable;.  
6110: 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20    pLock->pBtree 
6120: 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  = p;.    pLock->
6130: 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f  pNext = pBt->pLo
6140: 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f  ck;.    pBt->pLo
6150: 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = pLock;.  }.
6160: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 42 74  .  /* Set the Bt
6170: 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61  Lock.eLock varia
6180: 62 6c 65 20 74 6f 20 74 68 65 20 6d 61 78 69 6d  ble to the maxim
6190: 75 6d 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  um of the curren
61a0: 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20  t lock.  ** and 
61b0: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
61c0: 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69  ck. This means i
61d0: 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77  f a write-lock w
61e0: 61 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 0a  as already held.
61f0: 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 61 64 2d    ** and a read-
6200: 6c 6f 63 6b 20 72 65 71 75 65 73 74 65 64 2c 20  lock requested, 
6210: 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65  we don't incorre
6220: 63 74 6c 79 20 64 6f 77 6e 67 72 61 64 65 20 74  ctly downgrade t
6230: 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  he lock..  */.  
6240: 61 73 73 65 72 74 28 20 57 52 49 54 45 5f 4c 4f  assert( WRITE_LO
6250: 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a  CK>READ_LOCK );.
6260: 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63    if( eLock>pLoc
6270: 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k->eLock ){.    
6280: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65  pLock->eLock = e
6290: 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Lock;.  }..  ret
62a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
62b0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
62c0: 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f  all the table lo
62d0: 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69  cks (locks obtai
62e0: 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f  ned via calls to
62f0: 20 74 68 65 20 6c 6f 63 6b 54 61 62 6c 65 28 29   the lockTable()
6300: 0a 2a 2a 20 70 72 6f 63 65 64 75 72 65 29 20 68  .** procedure) h
6310: 65 6c 64 20 62 79 20 42 74 72 65 65 20 68 61 6e  eld by Btree han
6320: 64 6c 65 20 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  dle p..*/.static
6330: 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 41 6c 6c 54   void unlockAllT
6340: 61 62 6c 65 73 28 42 74 72 65 65 20 2a 70 29 7b  ables(Btree *p){
6350: 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49 74  .  BtLock **ppIt
6360: 65 72 20 3d 20 26 70 2d 3e 70 42 74 2d 3e 70 4c  er = &p->pBt->pL
6370: 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ock;..  /* If th
6380: 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 65  e shared-cache e
6390: 78 74 65 6e 73 69 6f 6e 20 69 73 20 6e 6f 74 20  xtension is not 
63a0: 65 6e 61 62 6c 65 64 2c 20 74 68 65 72 65 20 73  enabled, there s
63b0: 68 6f 75 6c 64 20 62 65 20 6e 6f 0a 20 20 2a 2a  hould be no.  **
63c0: 20 6c 6f 63 6b 73 20 69 6e 20 74 68 65 20 42 74   locks in the Bt
63d0: 53 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 73  Shared.pLock lis
63e0: 74 2c 20 6d 61 6b 69 6e 67 20 74 68 69 73 20 70  t, making this p
63f0: 72 6f 63 65 64 75 72 65 20 61 20 6e 6f 2d 6f 70  rocedure a no-op
6400: 2e 20 41 73 73 65 72 74 0a 20 20 2a 2a 20 74 68  . Assert.  ** th
6410: 61 74 20 74 68 69 73 20 69 73 20 74 68 65 20 63  at this is the c
6420: 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ase..  */.  asse
6430: 72 74 28 20 73 71 6c 69 74 65 33 54 68 72 65 61  rt( sqlite3Threa
6440: 64 44 61 74 61 52 65 61 64 4f 6e 6c 79 28 29 2d  dDataReadOnly()-
6450: 3e 75 73 65 53 68 61 72 65 64 44 61 74 61 20 7c  >useSharedData |
6460: 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29 3b 0a  | 0==*ppIter );.
6470: 0a 20 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65  .  while( *ppIte
6480: 72 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20  r ){.    BtLock 
6490: 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72  *pLock = *ppIter
64a0: 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d  ;.    if( pLock-
64b0: 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20  >pBtree==p ){.  
64c0: 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70 4c      *ppIter = pL
64d0: 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ock->pNext;.    
64e0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 6f    sqliteFree(pLo
64f0: 63 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ck);.    }else{.
6500: 20 20 20 20 20 20 70 70 49 74 65 72 20 3d 20 26        ppIter = &
6510: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20  pLock->pNext;.  
6520: 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
6530: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
6540: 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a  SHARED_CACHE */.
6550: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
6560: 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65  easePage(MemPage
6570: 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f   *pPage);  /* Fo
6580: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
6590: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74  */../*.** Save t
65a0: 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
65b0: 72 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68  r position in th
65c0: 65 20 76 61 72 69 61 62 6c 65 73 20 42 74 43 75  e variables BtCu
65d0: 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e  rsor.nKey .** an
65e0: 64 20 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e  d BtCursor.pKey.
65f0: 20 54 68 65 20 63 75 72 73 6f 72 27 73 20 73 74   The cursor's st
6600: 61 74 65 20 69 73 20 73 65 74 20 74 6f 20 43 55  ate is set to CU
6610: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
6620: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6630: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
6640: 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  on(BtCursor *pCu
6650: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  r){.  int rc;.. 
6660: 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
6670: 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
6680: 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ate );.  assert(
6690: 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29   0==pCur->pKey )
66a0: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
66b0: 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43  3BtreeKeySize(pC
66c0: 75 72 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79 29  ur, &pCur->nKey)
66d0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
66e0: 69 73 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62  is an intKey tab
66f0: 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 61 62 6f  le, then the abo
6700: 76 65 20 63 61 6c 6c 20 74 6f 20 42 74 72 65 65  ve call to Btree
6710: 4b 65 79 53 69 7a 65 28 29 0a 20 20 2a 2a 20 73  KeySize().  ** s
6720: 74 6f 72 65 73 20 74 68 65 20 69 6e 74 65 67 65  tores the intege
6730: 72 20 6b 65 79 20 69 6e 20 70 43 75 72 2d 3e 6e  r key in pCur->n
6740: 4b 65 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73  Key. In this cas
6750: 65 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 0a  e this value is.
6760: 20 20 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69 73    ** all that is
6770: 20 72 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72   required. Other
6780: 77 69 73 65 2c 20 69 66 20 70 43 75 72 20 69 73  wise, if pCur is
6790: 20 6e 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e 20   not open on an 
67a0: 69 6e 74 4b 65 79 0a 20 20 2a 2a 20 74 61 62 6c  intKey.  ** tabl
67b0: 65 2c 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 20 73  e, then malloc s
67c0: 70 61 63 65 20 66 6f 72 20 61 6e 64 20 73 74 6f  pace for and sto
67d0: 72 65 20 74 68 65 20 70 43 75 72 2d 3e 6e 4b 65  re the pCur->nKe
67e0: 79 20 62 79 74 65 73 20 6f 66 20 6b 65 79 20 0a  y bytes of key .
67f0: 20 20 2a 2a 20 64 61 74 61 2e 0a 20 20 2a 2f 0a    ** data..  */.
6800: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6810: 5f 4f 4b 20 26 26 20 30 3d 3d 70 43 75 72 2d 3e  _OK && 0==pCur->
6820: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 29 7b 0a  pPage->intKey){.
6830: 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d      void *pKey =
6840: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 70 43   sqliteMalloc(pC
6850: 75 72 2d 3e 6e 4b 65 79 29 3b 0a 20 20 20 20 69  ur->nKey);.    i
6860: 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 20  f( pKey ){.     
6870: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
6880: 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c 20 70  eeKey(pCur, 0, p
6890: 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29  Cur->nKey, pKey)
68a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
68b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
68c0: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20       pCur->pKey 
68d0: 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  = pKey;.      }e
68e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
68f0: 69 74 65 46 72 65 65 28 70 4b 65 79 29 3b 0a 20  iteFree(pKey);. 
6900: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
6910: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
6920: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
6930: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
6940: 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74  pCur->pPage->int
6950: 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b  Key || !pCur->pK
6960: 65 79 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  ey );..  if( rc=
6970: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6980: 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
6990: 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20 20  ur->pPage);.    
69a0: 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 30 3b  pCur->pPage = 0;
69b0: 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
69c0: 65 20 3d 20 43 55 52 53 4f 52 5f 52 45 51 55 49  e = CURSOR_REQUI
69d0: 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20 72  RESEEK;.  }..  r
69e0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
69f0: 2a 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69  ** Save the posi
6a00: 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72  tions of all cur
6a10: 73 6f 72 73 20 65 78 63 65 70 74 20 70 45 78 63  sors except pExc
6a20: 65 70 74 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ept open on the 
6a30: 74 61 62 6c 65 20 0a 2a 2a 20 77 69 74 68 20 72  table .** with r
6a40: 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20  oot-page iRoot. 
6a50: 55 73 75 61 6c 6c 79 2c 20 74 68 69 73 20 69 73  Usually, this is
6a60: 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65 66   called just bef
6a70: 6f 72 65 20 63 75 72 73 6f 72 0a 2a 2a 20 70 45  ore cursor.** pE
6a80: 78 63 65 70 74 20 69 73 20 75 73 65 64 20 74 6f  xcept is used to
6a90: 20 6d 6f 64 69 66 79 20 74 68 65 20 74 61 62 6c   modify the tabl
6aa0: 65 20 28 42 74 72 65 65 44 65 6c 65 74 65 28 29  e (BtreeDelete()
6ab0: 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74 28   or BtreeInsert(
6ac0: 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ))..*/.static in
6ad0: 74 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  t saveAllCursors
6ae0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
6af0: 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43 75  Pgno iRoot, BtCu
6b00: 72 73 6f 72 20 2a 70 45 78 63 65 70 74 29 7b 0a  rsor *pExcept){.
6b10: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
6b20: 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72   for(p=pBt->pCur
6b30: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
6b40: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d  xt){.    if( p!=
6b50: 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69  pExcept && (0==i
6b60: 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52  Root || p->pgnoR
6b70: 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 26 26 20 0a  oot==iRoot) && .
6b80: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
6b90: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
6ba0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  ){.      int rc 
6bb0: 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  = saveCursorPosi
6bc0: 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 69  tion(p);.      i
6bd0: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
6be0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
6bf0: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
6c00: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
6c10: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
6c20: 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74 68  /*.** Restore th
6c30: 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
6c40: 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73 20  position it was 
6c50: 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65 20  in (or as close 
6c60: 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29 0a  to as possible).
6c70: 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72 73  ** when saveCurs
6c80: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61 73  orPosition() was
6c90: 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68   called. Note th
6ca0: 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65 6c  at this call del
6cb0: 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61 76  etes the .** sav
6cc0: 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f  ed position info
6cd0: 20 73 74 6f 72 65 64 20 62 79 20 73 61 76 65 43   stored by saveC
6ce0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c  ursorPosition(),
6cf0: 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62 65   so there can be
6d00: 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  .** at most one 
6d10: 65 66 66 65 63 74 69 76 65 20 72 65 73 74 6f 72  effective restor
6d20: 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f  eOrClearCursorPo
6d30: 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66  sition() call af
6d40: 74 65 72 20 65 61 63 68 20 0a 2a 2a 20 73 61 76  ter each .** sav
6d50: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
6d60: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
6d70: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
6d80: 61 72 67 75 6d 65 6e 74 20 2d 20 64 6f 53 65 65  argument - doSee
6d90: 6b 20 2d 20 69 73 20 66 61 6c 73 65 2c 20 74 68  k - is false, th
6da0: 65 6e 20 69 6e 73 74 65 61 64 20 6f 66 20 0a 2a  en instead of .*
6db0: 2a 20 72 65 74 75 72 6e 69 6e 67 20 74 68 65 20  * returning the 
6dc0: 63 75 72 73 6f 72 20 74 6f 20 69 74 27 73 20 73  cursor to it's s
6dd0: 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 2c 20 61  aved position, a
6de0: 6e 79 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f  ny saved positio
6df0: 6e 20 69 73 20 64 65 6c 65 74 65 64 0a 2a 2a 20  n is deleted.** 
6e00: 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 73  and the cursor s
6e10: 74 61 74 65 20 73 65 74 20 74 6f 20 43 55 52 53  tate set to CURS
6e20: 4f 52 5f 49 4e 56 41 4c 49 44 2e 0a 2a 2f 0a 73  OR_INVALID..*/.s
6e30: 74 61 74 69 63 20 69 6e 74 20 72 65 73 74 6f 72  tatic int restor
6e40: 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f  eOrClearCursorPo
6e50: 73 69 74 69 6f 6e 58 28 42 74 43 75 72 73 6f 72  sitionX(BtCursor
6e60: 20 2a 70 43 75 72 2c 20 69 6e 74 20 64 6f 53 65   *pCur, int doSe
6e70: 65 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ek){.  int rc = 
6e80: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
6e90: 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
6ea0: 65 3d 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e==CURSOR_REQUIR
6eb0: 45 53 45 45 4b 20 29 3b 0a 20 20 70 43 75 72 2d  ESEEK );.  pCur-
6ec0: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
6ed0: 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 69 66 28 20  _INVALID;.  if( 
6ee0: 64 6f 53 65 65 6b 20 29 7b 0a 20 20 20 20 72 63  doSeek ){.    rc
6ef0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
6f00: 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72  oveto(pCur, pCur
6f10: 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b  ->pKey, pCur->nK
6f20: 65 79 2c 20 26 70 43 75 72 2d 3e 73 6b 69 70 29  ey, &pCur->skip)
6f30: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
6f40: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6f50: 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 75 72   sqliteFree(pCur
6f60: 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70 43 75  ->pKey);.    pCu
6f70: 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20  r->pKey = 0;.   
6f80: 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
6f90: 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
6fa0: 61 74 65 20 7c 7c 20 43 55 52 53 4f 52 5f 49 4e  ate || CURSOR_IN
6fb0: 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
6fc0: 61 74 65 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ate );.  }.  ret
6fd0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69  urn rc;.}..#defi
6fe0: 6e 65 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61  ne restoreOrClea
6ff0: 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
7000: 70 2c 78 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74  p,x) \.  (p->eSt
7010: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate==CURSOR_REQU
7020: 49 52 45 53 45 45 4b 3f 72 65 73 74 6f 72 65 4f  IRESEEK?restoreO
7030: 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69  rClearCursorPosi
7040: 74 69 6f 6e 58 28 70 2c 78 29 3a 53 51 4c 49 54  tionX(p,x):SQLIT
7050: 45 5f 4f 4b 29 0a 0a 23 69 66 6e 64 65 66 20 53  E_OK)..#ifndef S
7060: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
7070: 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 54 68 65 73  ACUUM./*.** Thes
7080: 65 20 6d 61 63 72 6f 73 20 64 65 66 69 6e 65 20  e macros define 
7090: 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  the location of 
70a0: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
70b0: 65 6e 74 72 79 20 66 6f 72 20 61 20 0a 2a 2a 20  entry for a .** 
70c0: 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 54  database page. T
70d0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
70e0: 74 20 74 6f 20 65 61 63 68 20 69 73 20 74 68 65  t to each is the
70f0: 20 6e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c   number of usabl
7100: 65 0a 2a 2a 20 62 79 74 65 73 20 6f 6e 20 65 61  e.** bytes on ea
7110: 63 68 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  ch page of the d
7120: 61 74 61 62 61 73 65 20 28 6f 66 74 65 6e 20 31  atabase (often 1
7130: 30 32 34 29 2e 20 54 68 65 20 73 65 63 6f 6e 64  024). The second
7140: 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   is the.** page 
7150: 6e 75 6d 62 65 72 20 74 6f 20 6c 6f 6f 6b 20 75  number to look u
7160: 70 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  p in the pointer
7170: 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d   map..**.** PTRM
7180: 41 50 5f 50 41 47 45 4e 4f 20 72 65 74 75 72 6e  AP_PAGENO return
7190: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  s the database p
71a0: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
71b0: 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a  e pointer-map.**
71c0: 20 70 61 67 65 20 74 68 61 74 20 73 74 6f 72 65   page that store
71d0: 73 20 74 68 65 20 72 65 71 75 69 72 65 64 20 70  s the required p
71e0: 6f 69 6e 74 65 72 2e 20 50 54 52 4d 41 50 5f 50  ointer. PTRMAP_P
71f0: 54 52 4f 46 46 53 45 54 20 72 65 74 75 72 6e 73  TROFFSET returns
7200: 0a 2a 2a 20 74 68 65 20 6f 66 66 73 65 74 20 6f  .** the offset o
7210: 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
7220: 6d 61 70 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a  map entry..**.**
7230: 20 49 66 20 74 68 65 20 70 67 6e 6f 20 61 72 67   If the pgno arg
7240: 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
7250: 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 20 69 73  PTRMAP_PAGENO is
7260: 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70   a pointer-map p
7270: 61 67 65 2c 0a 2a 2a 20 74 68 65 6e 20 70 67 6e  age,.** then pgn
7280: 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 53  o is returned. S
7290: 6f 20 28 70 67 6e 6f 3d 3d 50 54 52 4d 41 50 5f  o (pgno==PTRMAP_
72a0: 50 41 47 45 4e 4f 28 70 67 73 7a 2c 20 70 67 6e  PAGENO(pgsz, pgn
72b0: 6f 29 29 20 63 61 6e 20 62 65 0a 2a 2a 20 75 73  o)) can be.** us
72c0: 65 64 20 74 6f 20 74 65 73 74 20 69 66 20 70 67  ed to test if pg
72d0: 6e 6f 20 69 73 20 61 20 70 6f 69 6e 74 65 72 2d  no is a pointer-
72e0: 6d 61 70 20 70 61 67 65 2e 20 50 54 52 4d 41 50  map page. PTRMAP
72f0: 5f 49 53 50 41 47 45 20 69 6d 70 6c 65 6d 65 6e  _ISPAGE implemen
7300: 74 73 0a 2a 2a 20 74 68 69 73 20 74 65 73 74 2e  ts.** this test.
7310: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 54 52 4d  .*/.#define PTRM
7320: 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 70  AP_PAGENO(pBt, p
7330: 67 6e 6f 29 20 70 74 72 6d 61 70 50 61 67 65 6e  gno) ptrmapPagen
7340: 6f 28 70 42 74 2c 20 70 67 6e 6f 29 0a 23 64 65  o(pBt, pgno).#de
7350: 66 69 6e 65 20 50 54 52 4d 41 50 5f 50 54 52 4f  fine PTRMAP_PTRO
7360: 46 46 53 45 54 28 70 42 74 2c 20 70 67 6e 6f 29  FFSET(pBt, pgno)
7370: 20 28 35 2a 28 70 67 6e 6f 2d 70 74 72 6d 61 70   (5*(pgno-ptrmap
7380: 50 61 67 65 6e 6f 28 70 42 74 2c 20 70 67 6e 6f  Pageno(pBt, pgno
7390: 29 2d 31 29 29 0a 23 64 65 66 69 6e 65 20 50 54  )-1)).#define PT
73a0: 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
73b0: 20 70 67 6e 6f 29 20 28 50 54 52 4d 41 50 5f 50   pgno) (PTRMAP_P
73c0: 41 47 45 4e 4f 28 28 70 42 74 29 2c 28 70 67 6e  AGENO((pBt),(pgn
73d0: 6f 29 29 3d 3d 28 70 67 6e 6f 29 29 0a 0a 73 74  o))==(pgno))..st
73e0: 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61 70  atic Pgno ptrmap
73f0: 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64 20  Pageno(BtShared 
7400: 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pBt, Pgno pgno)
7410: 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50 65  {.  int nPagesPe
7420: 72 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d  rMapPage = (pBt-
7430: 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31  >usableSize/5)+1
7440: 3b 0a 20 20 69 6e 74 20 69 50 74 72 4d 61 70 20  ;.  int iPtrMap 
7450: 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65  = (pgno-2)/nPage
7460: 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 69  sPerMapPage;.  i
7470: 6e 74 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61  nt ret = (iPtrMa
7480: 70 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61  p*nPagesPerMapPa
7490: 67 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20  ge) + 2; .  if( 
74a0: 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ret==PENDING_BYT
74b0: 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
74c0: 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20     ret++;.  }.  
74d0: 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f  return ret;.}../
74e0: 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  *.** The pointer
74f0: 20 6d 61 70 20 69 73 20 61 20 6c 6f 6f 6b 75 70   map is a lookup
7500: 20 74 61 62 6c 65 20 74 68 61 74 20 69 64 65 6e   table that iden
7510: 74 69 66 69 65 73 20 74 68 65 20 70 61 72 65 6e  tifies the paren
7520: 74 20 70 61 67 65 20 66 6f 72 0a 2a 2a 20 65 61  t page for.** ea
7530: 63 68 20 63 68 69 6c 64 20 70 61 67 65 20 69 6e  ch child page in
7540: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
7550: 6c 65 2e 20 20 54 68 65 20 70 61 72 65 6e 74 20  le.  The parent 
7560: 70 61 67 65 20 69 73 20 74 68 65 20 70 61 67 65  page is the page
7570: 20 74 68 61 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e   that.** contain
7580: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
7590: 68 65 20 63 68 69 6c 64 2e 20 20 45 76 65 72 79  he child.  Every
75a0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
75b0: 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 73 0a 2a  abase contains.*
75c0: 2a 20 30 20 6f 72 20 31 20 70 61 72 65 6e 74 20  * 0 or 1 parent 
75d0: 70 61 67 65 73 2e 20 20 28 49 6e 20 74 68 69 73  pages.  (In this
75e0: 20 63 6f 6e 74 65 78 74 20 27 64 61 74 61 62 61   context 'databa
75f0: 73 65 20 70 61 67 65 27 20 72 65 66 65 72 73 0a  se page' refers.
7600: 2a 2a 20 74 6f 20 61 6e 79 20 70 61 67 65 20 74  ** to any page t
7610: 68 61 74 20 69 73 20 6e 6f 74 20 70 61 72 74 20  hat is not part 
7620: 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  of the pointer m
7630: 61 70 20 69 74 73 65 6c 66 2e 29 20 20 45 61 63  ap itself.)  Eac
7640: 68 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 2a 2a  h pointer map.**
7650: 20 65 6e 74 72 79 20 63 6f 6e 73 69 73 74 73 20   entry consists 
7660: 6f 66 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  of a single byte
7670: 20 27 74 79 70 65 27 20 61 6e 64 20 61 20 34 20   'type' and a 4 
7680: 62 79 74 65 20 70 61 72 65 6e 74 20 70 61 67 65  byte parent page
7690: 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 54 68 65 20   number..** The 
76a0: 50 54 52 4d 41 50 5f 58 58 58 20 69 64 65 6e 74  PTRMAP_XXX ident
76b0: 69 66 69 65 72 73 20 62 65 6c 6f 77 20 61 72 65  ifiers below are
76c0: 20 74 68 65 20 76 61 6c 69 64 20 74 79 70 65 73   the valid types
76d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 75 72 70  ..**.** The purp
76e0: 6f 73 65 20 6f 66 20 74 68 65 20 70 6f 69 6e 74  ose of the point
76f0: 65 72 20 6d 61 70 20 69 73 20 74 6f 20 66 61 63  er map is to fac
7700: 69 6c 69 74 79 20 6d 6f 76 69 6e 67 20 70 61 67  ility moving pag
7710: 65 73 20 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20 70  es from one.** p
7720: 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 66  osition in the f
7730: 69 6c 65 20 74 6f 20 61 6e 6f 74 68 65 72 20 61  ile to another a
7740: 73 20 70 61 72 74 20 6f 66 20 61 75 74 6f 76 61  s part of autova
7750: 63 75 75 6d 2e 20 20 57 68 65 6e 20 61 20 70 61  cuum.  When a pa
7760: 67 65 0a 2a 2a 20 69 73 20 6d 6f 76 65 64 2c 20  ge.** is moved, 
7770: 74 68 65 20 70 6f 69 6e 74 65 72 20 69 6e 20 69  the pointer in i
7780: 74 73 20 70 61 72 65 6e 74 20 6d 75 73 74 20 62  ts parent must b
7790: 65 20 75 70 64 61 74 65 64 20 74 6f 20 70 6f 69  e updated to poi
77a0: 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20 6e 65 77  nt to the.** new
77b0: 20 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 65 20   location.  The 
77c0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 69 73 20 75  pointer map is u
77d0: 73 65 64 20 74 6f 20 6c 6f 63 61 74 65 20 74 68  sed to locate th
77e0: 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 71 75  e parent page qu
77f0: 69 63 6b 6c 79 2e 0a 2a 2a 0a 2a 2a 20 50 54 52  ickly..**.** PTR
7800: 4d 41 50 5f 52 4f 4f 54 50 41 47 45 3a 20 54 68  MAP_ROOTPAGE: Th
7810: 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  e database page 
7820: 69 73 20 61 20 72 6f 6f 74 2d 70 61 67 65 2e 20  is a root-page. 
7830: 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  The page-number 
7840: 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  is not.**       
7850: 20 20 20 20 20 20 20 20 20 20 20 75 73 65 64 20             used 
7860: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
7870: 0a 2a 2a 20 50 54 52 4d 41 50 5f 46 52 45 45 50  .** PTRMAP_FREEP
7880: 41 47 45 3a 20 54 68 65 20 64 61 74 61 62 61 73  AGE: The databas
7890: 65 20 70 61 67 65 20 69 73 20 61 6e 20 75 6e 75  e page is an unu
78a0: 73 65 64 20 28 66 72 65 65 29 20 70 61 67 65 2e  sed (free) page.
78b0: 20 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72   The page-number
78c0: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
78d0: 20 20 20 20 20 20 69 73 20 6e 6f 74 20 75 73 65        is not use
78e0: 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  d in this case..
78f0: 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45  **.** PTRMAP_OVE
7900: 52 46 4c 4f 57 31 3a 20 54 68 65 20 64 61 74 61  RFLOW1: The data
7910: 62 61 73 65 20 70 61 67 65 20 69 73 20 74 68 65  base page is the
7920: 20 66 69 72 73 74 20 70 61 67 65 20 69 6e 20 61   first page in a
7930: 20 6c 69 73 74 20 6f 66 20 0a 2a 2a 20 20 20 20   list of .**    
7940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
7950: 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54  verflow pages. T
7960: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  he page number i
7970: 64 65 6e 74 69 66 69 65 73 20 74 68 65 20 70 61  dentifies the pa
7980: 67 65 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ge that.**      
7990: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
79a0: 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 77  tains the cell w
79b0: 69 74 68 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ith a pointer to
79c0: 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 70   this overflow p
79d0: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  age..**.** PTRMA
79e0: 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 54 68 65  P_OVERFLOW2: The
79f0: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 69   database page i
7a00: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20  s the second or 
7a10: 6c 61 74 65 72 20 70 61 67 65 20 69 6e 20 61 20  later page in a 
7a20: 6c 69 73 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20  list of.**      
7a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65               ove
7a40: 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65  rflow pages. The
7a50: 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 64 65   page-number ide
7a60: 6e 74 69 66 69 65 73 20 74 68 65 20 70 72 65 76  ntifies the prev
7a70: 69 6f 75 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  ious.**         
7a80: 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20 69            page i
7a90: 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  n the overflow p
7aa0: 61 67 65 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  age list..**.** 
7ab0: 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 54 68  PTRMAP_BTREE: Th
7ac0: 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  e database page 
7ad0: 69 73 20 61 20 6e 6f 6e 2d 72 6f 6f 74 20 62 74  is a non-root bt
7ae0: 72 65 65 20 70 61 67 65 2e 20 54 68 65 20 70 61  ree page. The pa
7af0: 67 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 20  ge number.**    
7b00: 20 20 20 20 20 20 20 20 20 20 20 69 64 65 6e 74             ident
7b10: 69 66 69 65 73 20 74 68 65 20 70 61 72 65 6e 74  ifies the parent
7b20: 20 70 61 67 65 20 69 6e 20 74 68 65 20 62 74 72   page in the btr
7b30: 65 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  ee..*/.#define P
7b40: 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 31  TRMAP_ROOTPAGE 1
7b50: 0a 23 64 65 66 69 6e 65 20 50 54 52 4d 41 50 5f  .#define PTRMAP_
7b60: 46 52 45 45 50 41 47 45 20 32 0a 23 64 65 66 69  FREEPAGE 2.#defi
7b70: 6e 65 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ne PTRMAP_OVERFL
7b80: 4f 57 31 20 33 0a 23 64 65 66 69 6e 65 20 50 54  OW1 3.#define PT
7b90: 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 34  RMAP_OVERFLOW2 4
7ba0: 0a 23 64 65 66 69 6e 65 20 50 54 52 4d 41 50 5f  .#define PTRMAP_
7bb0: 42 54 52 45 45 20 35 0a 0a 2f 2a 0a 2a 2a 20 57  BTREE 5../*.** W
7bc0: 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e  rite an entry in
7bd0: 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  to the pointer m
7be0: 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ap..**.** This r
7bf0: 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73 20 74  outine updates t
7c00: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
7c10: 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e 75  ntry for page nu
7c20: 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f  mber 'key'.** so
7c30: 20 74 68 61 74 20 69 74 20 6d 61 70 73 20 74 6f   that it maps to
7c40: 20 74 79 70 65 20 27 65 54 79 70 65 27 20 61 6e   type 'eType' an
7c50: 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75  d parent page nu
7c60: 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 20  mber 'pgno'..** 
7c70: 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  An error code is
7c80: 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d   returned if som
7c90: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
7ca0: 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c  g, otherwise SQL
7cb0: 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69  ITE_OK..*/.stati
7cc0: 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74 28  c int ptrmapPut(
7cd0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
7ce0: 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79 70  gno key, u8 eTyp
7cf0: 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 29 7b  e, Pgno parent){
7d00: 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
7d10: 67 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e  ge;  /* The poin
7d20: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
7d30: 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20    u8 *pPtrmap;  
7d40: 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
7d50: 65 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20  er map data */. 
7d60: 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20   Pgno iPtrmap;  
7d70: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
7d80: 72 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65  r map page numbe
7d90: 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65  r */.  int offse
7da0: 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73  t;       /* Offs
7db0: 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61  et in pointer ma
7dc0: 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  p page */.  int 
7dd0: 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61  rc;..  /* The ma
7de0: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67  ster-journal pag
7df0: 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e 65  e number must ne
7e00: 76 65 72 20 62 65 20 75 73 65 64 20 61 73 20 61  ver be used as a
7e10: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
7e20: 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30  e */.  assert( 0
7e30: 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ==PTRMAP_ISPAGE(
7e40: 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  pBt, PENDING_BYT
7e50: 45 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b 0a  E_PAGE(pBt)) );.
7e60: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
7e70: 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20  autoVacuum );.  
7e80: 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20  if( key==0 ){.  
7e90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7ea0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
7eb0: 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54  }.  iPtrmap = PT
7ec0: 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
7ed0: 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71   key);.  rc = sq
7ee0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
7ef0: 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d  t->pPager, iPtrm
7f00: 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20  ap, &pDbPage);. 
7f10: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
7f20: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
7f30: 20 72 63 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65   rc;.  }.  offse
7f40: 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46  t = PTRMAP_PTROF
7f50: 46 53 45 54 28 70 42 74 2c 20 6b 65 79 29 3b 0a  FSET(pBt, key);.
7f60: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
7f70: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
7f80: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
7f90: 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 70 50  .  if( eType!=pP
7fa0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c  trmap[offset] ||
7fb0: 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d   get4byte(&pPtrm
7fc0: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70  ap[offset+1])!=p
7fd0: 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41  arent ){.    TRA
7fe0: 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41  CE(("PTRMAP_UPDA
7ff0: 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c  TE: %d->(%d,%d)\
8000: 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20  n", key, eType, 
8010: 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 72 63  parent));.    rc
8020: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
8030: 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
8040: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
8050: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
8060: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20  trmap[offset] = 
8070: 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74  eType;.      put
8080: 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f  4byte(&pPtrmap[o
8090: 66 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74  ffset+1], parent
80a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
80b0: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
80c0: 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 72 65  f(pDbPage);.  re
80d0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
80e0: 2a 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20  * Read an entry 
80f0: 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72  from the pointer
8100: 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   map..**.** This
8110: 20 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76   routine retriev
8120: 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  es the pointer m
8130: 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67  ap entry for pag
8140: 65 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67  e 'key', writing
8150: 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64  .** the type and
8160: 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d   parent page num
8170: 62 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61  ber to *pEType a
8180: 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63  nd *pPgno respec
8190: 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72  tively..** An er
81a0: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
81b0: 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e  rned if somethin
81c0: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74  g goes wrong, ot
81d0: 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f  herwise SQLITE_O
81e0: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
81f0: 20 70 74 72 6d 61 70 47 65 74 28 42 74 53 68 61   ptrmapGet(BtSha
8200: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b  red *pBt, Pgno k
8210: 65 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20  ey, u8 *pEType, 
8220: 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20  Pgno *pPgno){.  
8230: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
8240: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
8250: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
8260: 69 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20  int iPtrmap;    
8270: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
8280: 70 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a  p page index */.
8290: 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20    u8 *pPtrmap;  
82a0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
82b0: 6d 61 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f  map page data */
82c0: 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20  .  int offset;  
82d0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
82e0: 6f 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e  of entry in poin
82f0: 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74  ter map */.  int
8300: 20 72 63 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20   rc;..  iPtrmap 
8310: 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  = PTRMAP_PAGENO(
8320: 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20  pBt, key);.  rc 
8330: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
8340: 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69  t(pBt->pPager, i
8350: 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65  Ptrmap, &pDbPage
8360: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29  );.  if( rc!=0 )
8370: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
8380: 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d  .  }.  pPtrmap =
8390: 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61   (u8 *)sqlite3Pa
83a0: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
83b0: 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d  ge);..  offset =
83c0: 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45   PTRMAP_PTROFFSE
83d0: 54 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 61  T(pBt, key);.  a
83e0: 73 73 65 72 74 28 20 70 45 54 79 70 65 21 3d 30  ssert( pEType!=0
83f0: 20 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20   );.  *pEType = 
8400: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b  pPtrmap[offset];
8410: 0a 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a  .  if( pPgno ) *
8420: 70 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  pPgno = get4byte
8430: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
8440: 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  +1]);..  sqlite3
8450: 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
8460: 67 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79  ge);.  if( *pETy
8470: 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e  pe<1 || *pEType>
8480: 35 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  5 ) return SQLIT
8490: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
84a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
84b0: 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  OK;.}..#endif /*
84c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
84d0: 4f 56 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a  OVACUUM */../*.*
84e0: 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65 65 20  * Given a btree 
84f0: 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20  page and a cell 
8500: 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74  index (0 means t
8510: 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e  he first cell on
8520: 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20  .** the page, 1 
8530: 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64  means the second
8540: 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f   cell, and so fo
8550: 72 74 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f  rth) return a po
8560: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
8570: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a  cell content..**
8580: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8590: 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20   works only for 
85a0: 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e 6f  pages that do no
85b0: 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c  t contain overfl
85c0: 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61  ow cells..*/.sta
85d0: 74 69 63 20 75 38 20 2a 66 69 6e 64 43 65 6c 6c  tic u8 *findCell
85e0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
85f0: 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 75   int iCell){.  u
8600: 38 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d  8 *data = pPage-
8610: 3e 61 44 61 74 61 3b 0a 20 20 61 73 73 65 72 74  >aData;.  assert
8620: 28 20 69 43 65 6c 6c 3e 3d 30 20 29 3b 0a 20 20  ( iCell>=0 );.  
8630: 61 73 73 65 72 74 28 20 69 43 65 6c 6c 3c 67 65  assert( iCell<ge
8640: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61  t2byte(&data[pPa
8650: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d  ge->hdrOffset+3]
8660: 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 64 61  ) );.  return da
8670: 74 61 20 2b 20 67 65 74 32 62 79 74 65 28 26 64  ta + get2byte(&d
8680: 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  ata[pPage->cellO
8690: 66 66 73 65 74 2b 32 2a 69 43 65 6c 6c 5d 29 3b  ffset+2*iCell]);
86a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61  .}../*.** This a
86b0: 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76 65   more complex ve
86c0: 72 73 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c  rsion of findCel
86d0: 6c 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66  l() that works f
86e0: 6f 72 0a 2a 2a 20 70 61 67 65 73 20 74 68 61 74  or.** pages that
86f0: 20 64 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72   do contain over
8700: 66 6c 6f 77 20 63 65 6c 6c 73 2e 20 20 53 65 65  flow cells.  See
8710: 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 74 61 74 69   insert.*/.stati
8720: 63 20 75 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c  c u8 *findOverfl
8730: 6f 77 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a  owCell(MemPage *
8740: 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c  pPage, int iCell
8750: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
8760: 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72  r(i=pPage->nOver
8770: 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  flow-1; i>=0; i-
8780: 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20  -){.    int k;. 
8790: 20 20 20 73 74 72 75 63 74 20 5f 4f 76 66 6c 43     struct _OvflC
87a0: 65 6c 6c 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20  ell *pOvfl;.    
87b0: 70 4f 76 66 6c 20 3d 20 26 70 50 61 67 65 2d 3e  pOvfl = &pPage->
87c0: 61 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 6b 20  aOvfl[i];.    k 
87d0: 3d 20 70 4f 76 66 6c 2d 3e 69 64 78 3b 0a 20 20  = pOvfl->idx;.  
87e0: 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29    if( k<=iCell )
87f0: 7b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 69  {.      if( k==i
8800: 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Cell ){.        
8810: 72 65 74 75 72 6e 20 70 4f 76 66 6c 2d 3e 70 43  return pOvfl->pC
8820: 65 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ell;.      }.   
8830: 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20     iCell--;.    
8840: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66  }.  }.  return f
8850: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
8860: 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Cell);.}../*.** 
8870: 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e  Parse a cell con
8880: 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66  tent block and f
8890: 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49  ill in the CellI
88a0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20  nfo structure.  
88b0: 54 68 65 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f  There.** are two
88c0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69   versions of thi
88d0: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 70 61 72  s function.  par
88e0: 73 65 43 65 6c 6c 28 29 20 74 61 6b 65 73 20 61  seCell() takes a
88f0: 20 63 65 6c 6c 20 69 6e 64 65 78 0a 2a 2a 20 61   cell index.** a
8900: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
8910: 75 6d 65 6e 74 20 61 6e 64 20 70 61 72 73 65 43  ument and parseC
8920: 65 6c 6c 50 74 72 28 29 20 74 61 6b 65 73 20 61  ellPtr() takes a
8930: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a   pointer to the.
8940: 2a 2a 20 62 6f 64 79 20 6f 66 20 74 68 65 20 63  ** body of the c
8950: 65 6c 6c 20 61 73 20 69 74 73 20 73 65 63 6f 6e  ell as its secon
8960: 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  d argument..*/.s
8970: 74 61 74 69 63 20 76 6f 69 64 20 70 61 72 73 65  tatic void parse
8980: 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61  CellPtr(.  MemPa
8990: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
89a0: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
89b0: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
89c0: 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20  /.  u8 *pCell,  
89d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
89e0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65  ointer to the ce
89f0: 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65  ll text. */.  Ce
8a00: 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20  llInfo *pInfo   
8a10: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
8a20: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
8a30: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 20 20  */.){.  int n;  
8a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a50: 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74 65 73 20  /* Number bytes 
8a60: 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  in cell content 
8a70: 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  header */.  u32 
8a80: 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20  nPayload;       
8a90: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8aa0: 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70   bytes of cell p
8ab0: 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 70 49 6e  ayload */..  pIn
8ac0: 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70 43 65 6c  fo->pCell = pCel
8ad0: 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  l;.  assert( pPa
8ae0: 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70  ge->leaf==0 || p
8af0: 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b  Page->leaf==1 );
8b00: 0a 20 20 6e 20 3d 20 70 50 61 67 65 2d 3e 63 68  .  n = pPage->ch
8b10: 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 61 73  ildPtrSize;.  as
8b20: 73 65 72 74 28 20 6e 3d 3d 34 2d 34 2a 70 50 61  sert( n==4-4*pPa
8b30: 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 69 66  ge->leaf );.  if
8b40: 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
8b50: 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74   ){.    n += get
8b60: 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b  Varint32(&pCell[
8b70: 6e 5d 2c 20 26 6e 50 61 79 6c 6f 61 64 29 3b 0a  n], &nPayload);.
8b80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50 61    }else{.    nPa
8b90: 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 7d 0a 20  yload = 0;.  }. 
8ba0: 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20   pInfo->nData = 
8bb0: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 69 66 28 20  nPayload;.  if( 
8bc0: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
8bd0: 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72  .    n += getVar
8be0: 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 28  int(&pCell[n], (
8bf0: 75 36 34 20 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b  u64 *)&pInfo->nK
8c00: 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ey);.  }else{.  
8c10: 20 20 75 33 32 20 78 3b 0a 20 20 20 20 6e 20 2b    u32 x;.    n +
8c20: 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 70  = getVarint32(&p
8c30: 43 65 6c 6c 5b 6e 5d 2c 20 26 78 29 3b 0a 20 20  Cell[n], &x);.  
8c40: 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20    pInfo->nKey = 
8c50: 78 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20  x;.    nPayload 
8c60: 2b 3d 20 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 66  += x;.  }.  pInf
8c70: 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50  o->nPayload = nP
8c80: 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d  ayload;.  pInfo-
8c90: 3e 6e 48 65 61 64 65 72 20 3d 20 6e 3b 0a 20 20  >nHeader = n;.  
8ca0: 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50  if( nPayload<=pP
8cb0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
8cc0: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
8cd0: 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f  the (easy) commo
8ce0: 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65  n case where the
8cf0: 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20   entire payload 
8d00: 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74  fits.    ** on t
8d10: 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20  he local page.  
8d20: 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72  No overflow is r
8d30: 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  equired..    */.
8d40: 20 20 20 20 69 6e 74 20 6e 53 69 7a 65 3b 20 20      int nSize;  
8d50: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
8d60: 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 20 63 6f   size of cell co
8d70: 6e 74 65 6e 74 20 69 6e 20 62 79 74 65 73 20 2a  ntent in bytes *
8d80: 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  /.    pInfo->nLo
8d90: 63 61 6c 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a  cal = nPayload;.
8da0: 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72      pInfo->iOver
8db0: 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 6e 53  flow = 0;.    nS
8dc0: 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b  ize = nPayload +
8dd0: 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a   n;.    if( nSiz
8de0: 65 3c 34 20 29 7b 0a 20 20 20 20 20 20 6e 53 69  e<4 ){.      nSi
8df0: 7a 65 20 3d 20 34 3b 20 20 20 20 20 20 20 20 2f  ze = 4;        /
8e00: 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73  * Minimum cell s
8e10: 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 20 20  ize is 4 */.    
8e20: 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69  }.    pInfo->nSi
8e30: 7a 65 20 3d 20 6e 53 69 7a 65 3b 0a 20 20 7d 65  ze = nSize;.  }e
8e40: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  lse{.    /* If t
8e50: 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20  he payload will 
8e60: 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74 65  not fit complete
8e70: 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  ly on the local 
8e80: 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20 20  page, we have.  
8e90: 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68    ** to decide h
8ea0: 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65  ow much to store
8eb0: 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77   locally and how
8ec0: 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f   much to spill o
8ed0: 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65 72 66  nto.    ** overf
8ee0: 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65 20  low pages.  The 
8ef0: 73 74 72 61 74 65 67 79 20 69 73 20 74 6f 20 6d  strategy is to m
8f00: 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75  inimize the amou
8f10: 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20 20  nt of unused.   
8f20: 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76 65   ** space on ove
8f30: 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69 6c  rflow pages whil
8f40: 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61 6d  e keeping the am
8f50: 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74  ount of local st
8f60: 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20  orage.    ** in 
8f70: 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c  between minLocal
8f80: 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20   and maxLocal.. 
8f90: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 61 72     **.    ** War
8fa0: 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67 20  ning:  changing 
8fb0: 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f 77  the way overflow
8fc0: 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73 74   payload is dist
8fd0: 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a 20  ributed in any. 
8fe0: 20 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72     ** way will r
8ff0: 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f  esult in an inco
9000: 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f  mpatible file fo
9010: 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rmat..    */.   
9020: 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20   int minLocal;  
9030: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e  /* Minimum amoun
9040: 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c  t of payload hel
9050: 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20  d locally */.   
9060: 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20   int maxLocal;  
9070: 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e  /* Maximum amoun
9080: 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c  t of payload hel
9090: 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20  d locally */.   
90a0: 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20 20   int surplus;   
90b0: 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c  /* Overflow payl
90c0: 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  oad available fo
90d0: 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20  r local storage 
90e0: 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63 61 6c  */..    minLocal
90f0: 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
9100: 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63 61 6c  al;.    maxLocal
9110: 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63   = pPage->maxLoc
9120: 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75 73 20  al;.    surplus 
9130: 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50  = minLocal + (nP
9140: 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61  ayload - minLoca
9150: 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  l)%(pPage->pBt->
9160: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b  usableSize - 4);
9170: 0a 20 20 20 20 69 66 28 20 73 75 72 70 6c 75 73  .    if( surplus
9180: 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a   <= maxLocal ){.
9190: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f        pInfo->nLo
91a0: 63 61 6c 20 3d 20 73 75 72 70 6c 75 73 3b 0a 20  cal = surplus;. 
91b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
91c0: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
91d0: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a  minLocal;.    }.
91e0: 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72      pInfo->iOver
91f0: 66 6c 6f 77 20 3d 20 70 49 6e 66 6f 2d 3e 6e 4c  flow = pInfo->nL
9200: 6f 63 61 6c 20 2b 20 6e 3b 0a 20 20 20 20 70 49  ocal + n;.    pI
9210: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70 49 6e  nfo->nSize = pIn
9220: 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 2b 20  fo->iOverflow + 
9230: 34 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  4;.  }.}.static 
9240: 76 6f 69 64 20 70 61 72 73 65 43 65 6c 6c 28 0a  void parseCell(.
9250: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
9260: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67  ,         /* Pag
9270: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
9280: 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69   cell */.  int i
9290: 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
92a0: 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69     /* The cell i
92b0: 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c  ndex.  First cel
92c0: 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c  l is 0 */.  Cell
92d0: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
92e0: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
92f0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
9300: 0a 29 7b 0a 20 20 70 61 72 73 65 43 65 6c 6c 50  .){.  parseCellP
9310: 74 72 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65  tr(pPage, findCe
9320: 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29  ll(pPage, iCell)
9330: 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a  , pInfo);.}../*.
9340: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74  ** Compute the t
9350: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62  otal number of b
9360: 79 74 65 73 20 74 68 61 74 20 61 20 43 65 6c 6c  ytes that a Cell
9370: 20 6e 65 65 64 73 20 69 6e 20 74 68 65 20 63 65   needs in the ce
9380: 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65 61 20  ll.** data area 
9390: 6f 66 20 74 68 65 20 62 74 72 65 65 2d 70 61 67  of the btree-pag
93a0: 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 6e  e.  The return n
93b0: 75 6d 62 65 72 20 69 6e 63 6c 75 64 65 73 20 74  umber includes t
93c0: 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20  he cell.** data 
93d0: 68 65 61 64 65 72 20 61 6e 64 20 74 68 65 20 6c  header and the l
93e0: 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75  ocal payload, bu
93f0: 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c  t not any overfl
9400: 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68  ow page or.** th
9410: 65 20 73 70 61 63 65 20 75 73 65 64 20 62 79 20  e space used by 
9420: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
9430: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  ..*/.#ifndef NDE
9440: 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63  BUG.static int c
9450: 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65 20  ellSize(MemPage 
9460: 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c  *pPage, int iCel
9470: 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  l){.  CellInfo i
9480: 6e 66 6f 3b 0a 20 20 70 61 72 73 65 43 65 6c 6c  nfo;.  parseCell
9490: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 26  (pPage, iCell, &
94a0: 69 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20  info);.  return 
94b0: 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 7d 0a 23 65  info.nSize;.}.#e
94c0: 6e 64 69 66 0a 73 74 61 74 69 63 20 69 6e 74 20  ndif.static int 
94d0: 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50  cellSizePtr(MemP
94e0: 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a  age *pPage, u8 *
94f0: 70 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e  pCell){.  CellIn
9500: 66 6f 20 69 6e 66 6f 3b 0a 20 20 70 61 72 73 65  fo info;.  parse
9510: 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
9520: 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
9530: 72 65 74 75 72 6e 20 69 6e 66 6f 2e 6e 53 69 7a  return info.nSiz
9540: 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  e;.}..#ifndef SQ
9550: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
9560: 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  CUUM./*.** If th
9570: 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61  e cell pCell, pa
9580: 72 74 20 6f 66 20 70 61 67 65 20 70 50 61 67 65  rt of page pPage
9590: 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
95a0: 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65  ter.** to an ove
95b0: 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65  rflow page, inse
95c0: 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f  rt an entry into
95d0: 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
95e0: 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72  .** for the over
95f0: 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74  flow page..*/.st
9600: 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50  atic int ptrmapP
9610: 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67  utOvflPtr(MemPag
9620: 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43  e *pPage, u8 *pC
9630: 65 6c 6c 29 7b 0a 20 20 69 66 28 20 70 43 65 6c  ell){.  if( pCel
9640: 6c 20 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66  l ){.    CellInf
9650: 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 70 61 72 73  o info;.    pars
9660: 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
9670: 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
9680: 20 20 20 61 73 73 65 72 74 28 20 28 69 6e 66 6f     assert( (info
9690: 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69  .nData+(pPage->i
96a0: 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65  ntKey?0:info.nKe
96b0: 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f  y))==info.nPaylo
96c0: 61 64 20 29 3b 0a 20 20 20 20 69 66 28 20 28 69  ad );.    if( (i
96d0: 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65  nfo.nData+(pPage
96e0: 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e  ->intKey?0:info.
96f0: 6e 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63  nKey))>info.nLoc
9700: 61 6c 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  al ){.      Pgno
9710: 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65   ovfl = get4byte
9720: 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
9730: 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20  erflow]);.      
9740: 72 65 74 75 72 6e 20 70 74 72 6d 61 70 50 75 74  return ptrmapPut
9750: 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66  (pPage->pBt, ovf
9760: 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  l, PTRMAP_OVERFL
9770: 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  OW1, pPage->pgno
9780: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
9790: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
97a0: 0a 7d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  .}./*.** If the 
97b0: 63 65 6c 6c 20 77 69 74 68 20 69 6e 64 65 78 20  cell with index 
97c0: 69 43 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50  iCell on page pP
97d0: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  age contains a p
97e0: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20  ointer.** to an 
97f0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69  overflow page, i
9800: 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69  nsert an entry i
9810: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  nto the pointer-
9820: 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f  map.** for the o
9830: 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f  verflow page..*/
9840: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
9850: 61 70 50 75 74 4f 76 66 6c 28 4d 65 6d 50 61 67  apPutOvfl(MemPag
9860: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43  e *pPage, int iC
9870: 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 43 65 6c  ell){.  u8 *pCel
9880: 6c 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e  l;.  pCell = fin
9890: 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50  dOverflowCell(pP
98a0: 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 20 20 72  age, iCell);.  r
98b0: 65 74 75 72 6e 20 70 74 72 6d 61 70 50 75 74 4f  eturn ptrmapPutO
98c0: 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  vflPtr(pPage, pC
98d0: 65 6c 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ell);.}.#endif..
98e0: 0a 2f 2a 20 41 20 62 75 6e 63 68 20 6f 66 20 61  ./* A bunch of a
98f0: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
9900: 74 73 20 74 6f 20 63 68 65 63 6b 20 74 68 65 20  ts to check the 
9910: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74  transaction stat
9920: 65 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f  e variables.** o
9930: 66 20 68 61 6e 64 6c 65 20 70 20 28 74 79 70 65  f handle p (type
9940: 20 42 74 72 65 65 2a 29 20 61 72 65 20 69 6e 74   Btree*) are int
9950: 65 72 6e 61 6c 6c 79 20 63 6f 6e 73 69 73 74 65  ernally consiste
9960: 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 62  nt..*/.#define b
9970: 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
9980: 20 5c 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   \.  assert( p->
9990: 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e  inTrans!=TRANS_N
99a0: 4f 4e 45 20 7c 7c 20 70 2d 3e 70 42 74 2d 3e 6e  ONE || p->pBt->n
99b0: 54 72 61 6e 73 61 63 74 69 6f 6e 3c 70 2d 3e 70  Transaction<p->p
99c0: 42 74 2d 3e 6e 52 65 66 20 29 3b 20 5c 0a 20 20  Bt->nRef ); \.  
99d0: 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e  assert( p->pBt->
99e0: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3c 3d 70 2d  nTransaction<=p-
99f0: 3e 70 42 74 2d 3e 6e 52 65 66 20 29 3b 20 5c 0a  >pBt->nRef ); \.
9a00: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74    assert( p->pBt
9a10: 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21  ->inTransaction!
9a20: 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 7c 7c 20 70  =TRANS_NONE || p
9a30: 2d 3e 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74  ->pBt->nTransact
9a40: 69 6f 6e 3d 3d 30 20 29 3b 20 5c 0a 20 20 61 73  ion==0 ); \.  as
9a50: 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 69 6e  sert( p->pBt->in
9a60: 54 72 61 6e 73 61 63 74 69 6f 6e 3e 3d 70 2d 3e  Transaction>=p->
9a70: 69 6e 54 72 61 6e 73 20 29 3b 20 0a 0a 2f 2a 0a  inTrans ); ../*.
9a80: 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68  ** Defragment th
9a90: 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20 20 41  e page given.  A
9aa0: 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76  ll Cells are mov
9ab0: 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64  ed to the.** end
9ac0: 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 6e 64   of the page and
9ad0: 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20   all free space 
9ae0: 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74  is collected int
9af0: 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65  o one.** big Fre
9b00: 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75 72 73  eBlk that occurs
9b10: 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
9b20: 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a  header and cell.
9b30: 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ** pointer array
9b40: 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f   and the cell co
9b50: 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a 73  ntent area..*/.s
9b60: 74 61 74 69 63 20 69 6e 74 20 64 65 66 72 61 67  tatic int defrag
9b70: 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65  mentPage(MemPage
9b80: 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
9b90: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
9ba0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
9bb0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
9bc0: 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pc;             
9bd0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
9be0: 73 20 6f 66 20 61 20 69 2d 74 68 20 63 65 6c 6c  s of a i-th cell
9bf0: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 20   */.  int addr; 
9c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c10: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69   /* Offset of fi
9c20: 72 73 74 20 62 79 74 65 20 61 66 74 65 72 20 63  rst byte after c
9c30: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
9c40: 79 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20  y */.  int hdr; 
9c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c60: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
9c70: 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  he page header *
9c80: 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20  /.  int size;   
9c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9ca0: 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c  * Size of a cell
9cb0: 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
9cc0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
9cd0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73   /* Number of us
9ce0: 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20  able bytes on a 
9cf0: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65  page */.  int ce
9d00: 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  llOffset;       
9d10: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
9d20: 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  o the cell point
9d30: 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e  er array */.  in
9d40: 74 20 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20  t brk;          
9d50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
9d60: 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  et to the cell c
9d70: 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20  ontent area */. 
9d80: 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20   int nCell;     
9d90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9da0: 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f  umber of cells o
9db0: 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  n the page */.  
9dc0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
9dd0: 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  ata;       /* Th
9de0: 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  e page data */. 
9df0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
9e00: 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54  temp;       /* T
9e10: 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c  emp area for cel
9e20: 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20  l content */..  
9e30: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
9e40: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
9e50: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
9e60: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9e70: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
9e80: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
9e90: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c  Bt->usableSize <
9ea0: 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  = SQLITE_MAX_PAG
9eb0: 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73 73 65  E_SIZE );.  asse
9ec0: 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
9ed0: 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 74 65 6d  flow==0 );.  tem
9ee0: 70 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  p = sqliteMalloc
9ef0: 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61  ( pPage->pBt->pa
9f00: 67 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20  geSize );.  if( 
9f10: 74 65 6d 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  temp==0 ) return
9f20: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
9f30: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
9f40: 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50  Data;.  hdr = pP
9f50: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
9f60: 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70    cellOffset = p
9f70: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
9f80: 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67  ;.  nCell = pPag
9f90: 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65  e->nCell;.  asse
9fa0: 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62  rt( nCell==get2b
9fb0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
9fc0: 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a  ) );.  usableSiz
9fd0: 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  e = pPage->pBt->
9fe0: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 62 72  usableSize;.  br
9ff0: 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  k = get2byte(&da
a000: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65  ta[hdr+5]);.  me
a010: 6d 63 70 79 28 26 74 65 6d 70 5b 62 72 6b 5d 2c  mcpy(&temp[brk],
a020: 20 26 64 61 74 61 5b 62 72 6b 5d 2c 20 75 73 61   &data[brk], usa
a030: 62 6c 65 53 69 7a 65 20 2d 20 62 72 6b 29 3b 0a  bleSize - brk);.
a040: 20 20 62 72 6b 20 3d 20 75 73 61 62 6c 65 53 69    brk = usableSi
a050: 7a 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ze;.  for(i=0; i
a060: 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
a070: 20 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20    u8 *pAddr;    
a080: 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c   /* The i-th cel
a090: 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20  l pointer */.   
a0a0: 20 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63   pAddr = &data[c
a0b0: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d  ellOffset + i*2]
a0c0: 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62  ;.    pc = get2b
a0d0: 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20  yte(pAddr);.    
a0e0: 61 73 73 65 72 74 28 20 70 63 3c 70 50 61 67 65  assert( pc<pPage
a0f0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
a100: 65 20 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20  e );.    size = 
a110: 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
a120: 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29 3b 0a 20  e, &temp[pc]);. 
a130: 20 20 20 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a     brk -= size;.
a140: 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
a150: 5b 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63 5d  [brk], &temp[pc]
a160: 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 70 75 74  , size);.    put
a170: 32 62 79 74 65 28 70 41 64 64 72 2c 20 62 72 6b  2byte(pAddr, brk
a180: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
a190: 20 62 72 6b 3e 3d 63 65 6c 6c 4f 66 66 73 65 74   brk>=cellOffset
a1a0: 2b 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20 70 75  +2*nCell );.  pu
a1b0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
a1c0: 2b 35 5d 2c 20 62 72 6b 29 3b 0a 20 20 64 61 74  +5], brk);.  dat
a1d0: 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20  a[hdr+1] = 0;.  
a1e0: 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b  data[hdr+2] = 0;
a1f0: 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d  .  data[hdr+7] =
a200: 20 30 3b 0a 20 20 61 64 64 72 20 3d 20 63 65 6c   0;.  addr = cel
a210: 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 3b  lOffset+2*nCell;
a220: 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
a230: 61 64 64 72 5d 2c 20 30 2c 20 62 72 6b 2d 61 64  addr], 0, brk-ad
a240: 64 72 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  dr);.  sqliteFre
a250: 65 28 74 65 6d 70 29 3b 0a 20 20 72 65 74 75 72  e(temp);.  retur
a260: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
a270: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e  /*.** Allocate n
a280: 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 73 70  Byte bytes of sp
a290: 61 63 65 20 6f 6e 20 61 20 70 61 67 65 2e 0a 2a  ace on a page..*
a2a0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
a2b0: 69 6e 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65  index into pPage
a2c0: 2d 3e 61 44 61 74 61 5b 5d 20 6f 66 20 74 68 65  ->aData[] of the
a2d0: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 0a 2a   first byte of.*
a2e0: 2a 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61  * the new alloca
a2f0: 74 69 6f 6e 2e 20 4f 72 20 72 65 74 75 72 6e 20  tion. Or return 
a300: 30 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  0 if there is no
a310: 74 20 65 6e 6f 75 67 68 20 66 72 65 65 0a 2a 2a  t enough free.**
a320: 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61   space on the pa
a330: 67 65 20 74 6f 20 73 61 74 69 73 66 79 20 74 68  ge to satisfy th
a340: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72 65 71  e allocation req
a350: 75 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  uest..**.** If t
a360: 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73  he page contains
a370: 20 6e 42 79 74 65 73 20 6f 66 20 66 72 65 65 20   nBytes of free 
a380: 73 70 61 63 65 20 62 75 74 20 64 6f 65 73 20 6e  space but does n
a390: 6f 74 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 42  ot contain.** nB
a3a0: 79 74 65 73 20 6f 66 20 63 6f 6e 74 69 67 75 6f  ytes of contiguo
a3b0: 75 73 20 66 72 65 65 20 73 70 61 63 65 2c 20 74  us free space, t
a3c0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
a3d0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 2a   automatically.*
a3e0: 2a 20 63 61 6c 6c 73 20 64 65 66 72 61 67 65 6d  * calls defragem
a3f0: 65 6e 74 50 61 67 65 28 29 20 74 6f 20 63 6f 6e  entPage() to con
a400: 73 6f 6c 69 64 61 74 65 20 61 6c 6c 20 66 72 65  solidate all fre
a410: 65 20 73 70 61 63 65 20 62 65 66 6f 72 65 20 0a  e space before .
a420: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68  ** allocating th
a430: 65 20 6e 65 77 20 63 68 75 6e 6b 2e 0a 2a 2f 0a  e new chunk..*/.
a440: 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
a450: 61 74 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65  ateSpace(MemPage
a460: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 42 79   *pPage, int nBy
a470: 74 65 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c  te){.  int addr,
a480: 20 70 63 2c 20 68 64 72 3b 0a 20 20 69 6e 74 20   pc, hdr;.  int 
a490: 73 69 7a 65 3b 0a 20 20 69 6e 74 20 6e 46 72 61  size;.  int nFra
a4a0: 67 3b 0a 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20  g;.  int top;.  
a4b0: 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 69 6e 74  int nCell;.  int
a4c0: 20 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 75   cellOffset;.  u
a4d0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
a4e0: 74 61 3b 0a 20 20 0a 20 20 64 61 74 61 20 3d 20  ta;.  .  data = 
a4f0: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
a500: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
a510: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
a520: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
a530: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
a540: 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 69 66 28  ge->pBt );.  if(
a550: 20 6e 42 79 74 65 3c 34 20 29 20 6e 42 79 74 65   nByte<4 ) nByte
a560: 20 3d 20 34 3b 0a 20 20 69 66 28 20 70 50 61 67   = 4;.  if( pPag
a570: 65 2d 3e 6e 46 72 65 65 3c 6e 42 79 74 65 20 7c  e->nFree<nByte |
a580: 7c 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  | pPage->nOverfl
a590: 6f 77 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b  ow>0 ) return 0;
a5a0: 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
a5b0: 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 68 64 72 20  -= nByte;.  hdr 
a5c0: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
a5d0: 65 74 3b 0a 0a 20 20 6e 46 72 61 67 20 3d 20 64  et;..  nFrag = d
a5e0: 61 74 61 5b 68 64 72 2b 37 5d 3b 0a 20 20 69 66  ata[hdr+7];.  if
a5f0: 28 20 6e 46 72 61 67 3c 36 30 20 29 7b 0a 20 20  ( nFrag<60 ){.  
a600: 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20    /* Search the 
a610: 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67  freelist looking
a620: 20 66 6f 72 20 61 20 73 6c 6f 74 20 62 69 67 20   for a slot big 
a630: 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66  enough to satisf
a640: 79 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 70 61  y the.    ** spa
a650: 63 65 20 72 65 71 75 65 73 74 2e 20 2a 2f 0a 20  ce request. */. 
a660: 20 20 20 61 64 64 72 20 3d 20 68 64 72 2b 31 3b     addr = hdr+1;
a670: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 70 63 20  .    while( (pc 
a680: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
a690: 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20  [addr]))>0 ){.  
a6a0: 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62      size = get2b
a6b0: 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29  yte(&data[pc+2])
a6c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a 65  ;.      if( size
a6d0: 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20  >=nByte ){.     
a6e0: 20 20 20 69 66 28 20 73 69 7a 65 3c 6e 42 79 74     if( size<nByt
a6f0: 65 2b 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  e+4 ){.         
a700: 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 61 64   memcpy(&data[ad
a710: 64 72 5d 2c 20 26 64 61 74 61 5b 70 63 5d 2c 20  dr], &data[pc], 
a720: 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 61  2);.          da
a730: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 6e 46 72 61  ta[hdr+7] = nFra
a740: 67 20 2b 20 73 69 7a 65 20 2d 20 6e 42 79 74 65  g + size - nByte
a750: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
a760: 72 6e 20 70 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn pc;.        }
a770: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
a780: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  put2byte(&data[p
a790: 63 2b 32 5d 2c 20 73 69 7a 65 2d 6e 42 79 74 65  c+2], size-nByte
a7a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
a7b0: 75 72 6e 20 70 63 20 2b 20 73 69 7a 65 20 2d 20  urn pc + size - 
a7c0: 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 7d  nByte;.        }
a7d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
a7e0: 64 64 72 20 3d 20 70 63 3b 0a 20 20 20 20 7d 0a  ddr = pc;.    }.
a7f0: 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61    }..  /* Alloca
a800: 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74  te memory from t
a810: 68 65 20 67 61 70 20 69 6e 20 62 65 74 77 65 65  he gap in betwee
a820: 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  n the cell point
a830: 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e  er array.  ** an
a840: 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  d the cell conte
a850: 6e 74 20 61 72 65 61 2e 0a 20 20 2a 2f 0a 20 20  nt area..  */.  
a860: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
a870: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
a880: 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65  nCell = get2byte
a890: 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a  (&data[hdr+3]);.
a8a0: 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70    cellOffset = p
a8b0: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
a8c0: 3b 0a 20 20 69 66 28 20 6e 46 72 61 67 3e 3d 36  ;.  if( nFrag>=6
a8d0: 30 20 7c 7c 20 63 65 6c 6c 4f 66 66 73 65 74 20  0 || cellOffset 
a8e0: 2b 20 32 2a 6e 43 65 6c 6c 20 3e 20 74 6f 70 20  + 2*nCell > top 
a8f0: 2d 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 69  - nByte ){.    i
a900: 66 28 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67  f( defragmentPag
a910: 65 28 70 50 61 67 65 29 20 29 20 72 65 74 75 72  e(pPage) ) retur
a920: 6e 20 30 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67  n 0;.    top = g
a930: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
a940: 72 2b 35 5d 29 3b 0a 20 20 7d 0a 20 20 74 6f 70  r+5]);.  }.  top
a950: 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 61 73 73   -= nByte;.  ass
a960: 65 72 74 28 20 63 65 6c 6c 4f 66 66 73 65 74 20  ert( cellOffset 
a970: 2b 20 32 2a 6e 43 65 6c 6c 20 3c 3d 20 74 6f 70  + 2*nCell <= top
a980: 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   );.  put2byte(&
a990: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70  data[hdr+5], top
a9a0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 74 6f 70 3b  );.  return top;
a9b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
a9c0: 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68   a section of th
a9d0: 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74  e pPage->aData t
a9e0: 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  o the freelist..
a9f0: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74  ** The first byt
aa00: 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65  e of the new fre
aa10: 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65  e block is pPage
aa20: 2d 3e 61 44 69 73 6b 5b 73 74 61 72 74 5d 0a 2a  ->aDisk[start].*
aa30: 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  * and the size o
aa40: 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 22  f the block is "
aa50: 73 69 7a 65 22 20 62 79 74 65 73 2e 0a 2a 2a 0a  size" bytes..**.
aa60: 2a 2a 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 65  ** Most of the e
aa70: 66 66 6f 72 74 20 68 65 72 65 20 69 73 20 69 6e  ffort here is in
aa80: 76 6f 6c 76 65 64 20 69 6e 20 63 6f 61 6c 65 73  volved in coales
aa90: 69 6e 67 20 61 64 6a 61 63 65 6e 74 0a 2a 2a 20  ing adjacent.** 
aaa0: 66 72 65 65 20 62 6c 6f 63 6b 73 20 69 6e 74 6f  free blocks into
aab0: 20 61 20 73 69 6e 67 6c 65 20 62 69 67 20 66 72   a single big fr
aac0: 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61  ee block..*/.sta
aad0: 74 69 63 20 76 6f 69 64 20 66 72 65 65 53 70 61  tic void freeSpa
aae0: 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ce(MemPage *pPag
aaf0: 65 2c 20 69 6e 74 20 73 74 61 72 74 2c 20 69 6e  e, int start, in
ab00: 74 20 73 69 7a 65 29 7b 0a 20 20 69 6e 74 20 61  t size){.  int a
ab10: 64 64 72 2c 20 70 62 65 67 69 6e 2c 20 68 64 72  ddr, pbegin, hdr
ab20: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
ab30: 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d  r *data = pPage-
ab40: 3e 61 44 61 74 61 3b 0a 0a 20 20 61 73 73 65 72  >aData;..  asser
ab50: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
ab60: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
ab70: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
ab80: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
ab90: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
aba0: 74 28 20 73 74 61 72 74 3e 3d 70 50 61 67 65 2d  t( start>=pPage-
abb0: 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 28 70 50  >hdrOffset+6+(pP
abc0: 61 67 65 2d 3e 6c 65 61 66 3f 30 3a 34 29 20 29  age->leaf?0:4) )
abd0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 73 74 61  ;.  assert( (sta
abe0: 72 74 20 2b 20 73 69 7a 65 29 3c 3d 70 50 61 67  rt + size)<=pPag
abf0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
ac00: 7a 65 20 29 3b 0a 20 20 69 66 28 20 73 69 7a 65  ze );.  if( size
ac10: 3c 34 20 29 20 73 69 7a 65 20 3d 20 34 3b 0a 0a  <4 ) size = 4;..
ac20: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45  #ifdef SQLITE_SE
ac30: 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a  CURE_DELETE.  /*
ac40: 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74   Overwrite delet
ac50: 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  ed information w
ac60: 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74  ith zeros when t
ac70: 68 65 20 53 45 43 55 52 45 5f 44 45 4c 45 54 45  he SECURE_DELETE
ac80: 20 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73   .  ** option is
ac90: 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70   enabled at comp
aca0: 69 6c 65 2d 74 69 6d 65 20 2a 2f 0a 20 20 6d 65  ile-time */.  me
acb0: 6d 73 65 74 28 26 64 61 74 61 5b 73 74 61 72 74  mset(&data[start
acc0: 5d 2c 20 30 2c 20 73 69 7a 65 29 3b 0a 23 65 6e  ], 0, size);.#en
acd0: 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68  dif..  /* Add th
ace0: 65 20 73 70 61 63 65 20 62 61 63 6b 20 69 6e 74  e space back int
acf0: 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  o the linked lis
ad00: 74 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 20  t of freeblocks 
ad10: 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  */.  hdr = pPage
ad20: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 61  ->hdrOffset;.  a
ad30: 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20  ddr = hdr + 1;. 
ad40: 20 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20   while( (pbegin 
ad50: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
ad60: 5b 61 64 64 72 5d 29 29 3c 73 74 61 72 74 20 26  [addr]))<start &
ad70: 26 20 70 62 65 67 69 6e 3e 30 20 29 7b 0a 20 20  & pbegin>0 ){.  
ad80: 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e    assert( pbegin
ad90: 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  <=pPage->pBt->us
ada0: 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20  ableSize-4 );.  
adb0: 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e    assert( pbegin
adc0: 3e 61 64 64 72 20 29 3b 0a 20 20 20 20 61 64 64  >addr );.    add
add0: 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20 7d 0a  r = pbegin;.  }.
ade0: 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e    assert( pbegin
adf0: 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  <=pPage->pBt->us
ae00: 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20  ableSize-4 );.  
ae10: 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61  assert( pbegin>a
ae20: 64 64 72 20 7c 7c 20 70 62 65 67 69 6e 3d 3d 30  ddr || pbegin==0
ae30: 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   );.  put2byte(&
ae40: 64 61 74 61 5b 61 64 64 72 5d 2c 20 73 74 61 72  data[addr], star
ae50: 74 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  t);.  put2byte(&
ae60: 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 70 62 65  data[start], pbe
ae70: 67 69 6e 29 3b 0a 20 20 70 75 74 32 62 79 74 65  gin);.  put2byte
ae80: 28 26 64 61 74 61 5b 73 74 61 72 74 2b 32 5d 2c  (&data[start+2],
ae90: 20 73 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d   size);.  pPage-
aea0: 3e 6e 46 72 65 65 20 2b 3d 20 73 69 7a 65 3b 0a  >nFree += size;.
aeb0: 0a 20 20 2f 2a 20 43 6f 61 6c 65 73 63 65 20 61  .  /* Coalesce a
aec0: 64 6a 61 63 65 6e 74 20 66 72 65 65 20 62 6c 6f  djacent free blo
aed0: 63 6b 73 20 2a 2f 0a 20 20 61 64 64 72 20 3d 20  cks */.  addr = 
aee0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
aef0: 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 28   + 1;.  while( (
af00: 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74  pbegin = get2byt
af10: 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3e  e(&data[addr]))>
af20: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 6e 65  0 ){.    int pne
af30: 78 74 2c 20 70 73 69 7a 65 3b 0a 20 20 20 20 61  xt, psize;.    a
af40: 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64  ssert( pbegin>ad
af50: 64 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  dr );.    assert
af60: 28 20 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d  ( pbegin<=pPage-
af70: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
af80: 2d 34 20 29 3b 0a 20 20 20 20 70 6e 65 78 74 20  -4 );.    pnext 
af90: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
afa0: 5b 70 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70  [pbegin]);.    p
afb0: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
afc0: 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29  &data[pbegin+2])
afd0: 3b 0a 20 20 20 20 69 66 28 20 70 62 65 67 69 6e  ;.    if( pbegin
afe0: 20 2b 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20   + psize + 3 >= 
aff0: 70 6e 65 78 74 20 26 26 20 70 6e 65 78 74 3e 30  pnext && pnext>0
b000: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 72   ){.      int fr
b010: 61 67 20 3d 20 70 6e 65 78 74 20 2d 20 28 70 62  ag = pnext - (pb
b020: 65 67 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20  egin+psize);.   
b030: 20 20 20 61 73 73 65 72 74 28 20 66 72 61 67 3c     assert( frag<
b040: 3d 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  =data[pPage->hdr
b050: 4f 66 66 73 65 74 2b 37 5d 20 29 3b 0a 20 20 20  Offset+7] );.   
b060: 20 20 20 64 61 74 61 5b 70 50 61 67 65 2d 3e 68     data[pPage->h
b070: 64 72 4f 66 66 73 65 74 2b 37 5d 20 2d 3d 20 66  drOffset+7] -= f
b080: 72 61 67 3b 0a 20 20 20 20 20 20 70 75 74 32 62  rag;.      put2b
b090: 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e  yte(&data[pbegin
b0a0: 5d 2c 20 67 65 74 32 62 79 74 65 28 26 64 61 74  ], get2byte(&dat
b0b0: 61 5b 70 6e 65 78 74 5d 29 29 3b 0a 20 20 20 20  a[pnext]));.    
b0c0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
b0d0: 5b 70 62 65 67 69 6e 2b 32 5d 2c 20 70 6e 65 78  [pbegin+2], pnex
b0e0: 74 2b 67 65 74 32 62 79 74 65 28 26 64 61 74 61  t+get2byte(&data
b0f0: 5b 70 6e 65 78 74 2b 32 5d 29 2d 70 62 65 67 69  [pnext+2])-pbegi
b100: 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
b110: 20 20 20 20 20 61 64 64 72 20 3d 20 70 62 65 67       addr = pbeg
b120: 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  in;.    }.  }.. 
b130: 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20   /* If the cell 
b140: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 62 65 67  content area beg
b150: 69 6e 73 20 77 69 74 68 20 61 20 66 72 65 65 62  ins with a freeb
b160: 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69 74 2e  lock, remove it.
b170: 20 2a 2f 0a 20 20 69 66 28 20 64 61 74 61 5b 68   */.  if( data[h
b180: 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64 72 2b  dr+1]==data[hdr+
b190: 35 5d 20 26 26 20 64 61 74 61 5b 68 64 72 2b 32  5] && data[hdr+2
b1a0: 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d 20 29  ]==data[hdr+6] )
b1b0: 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 0a 20  {.    int top;. 
b1c0: 20 20 20 70 62 65 67 69 6e 20 3d 20 67 65 74 32     pbegin = get2
b1d0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31  byte(&data[hdr+1
b1e0: 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ]);.    memcpy(&
b1f0: 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26 64 61  data[hdr+1], &da
b200: 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29 3b 0a  ta[pbegin], 2);.
b210: 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
b220: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
b230: 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
b240: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70  data[hdr+5], top
b250: 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74   + get2byte(&dat
b260: 61 5b 70 62 65 67 69 6e 2b 32 5d 29 29 3b 0a 20  a[pbegin+2]));. 
b270: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f   }.}../*.** Deco
b280: 64 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74  de the flags byt
b290: 65 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74  e (the first byt
b2a0: 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 29  e of the header)
b2b0: 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61   for a page.** a
b2c0: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69  nd initialize fi
b2d0: 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50  elds of the MemP
b2e0: 61 67 65 20 73 74 72 75 63 74 75 72 65 20 61 63  age structure ac
b2f0: 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 73 74  cordingly..*/.st
b300: 61 74 69 63 20 76 6f 69 64 20 64 65 63 6f 64 65  atic void decode
b310: 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70  Flags(MemPage *p
b320: 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79  Page, int flagBy
b330: 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  te){.  BtShared 
b340: 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63  *pBt;     /* A c
b350: 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42  opy of pPage->pB
b360: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
b370: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
b380: 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  ==(pPage->pgno==
b390: 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a  1 ? 100 : 0) );.
b3a0: 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20    pPage->intKey 
b3b0: 3d 20 28 66 6c 61 67 42 79 74 65 20 26 20 28 50  = (flagByte & (P
b3c0: 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
b3d0: 41 46 44 41 54 41 29 29 21 3d 30 3b 0a 20 20 70  AFDATA))!=0;.  p
b3e0: 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61 20 3d  Page->zeroData =
b3f0: 20 28 66 6c 61 67 42 79 74 65 20 26 20 50 54 46   (flagByte & PTF
b400: 5f 5a 45 52 4f 44 41 54 41 29 21 3d 30 3b 0a 20  _ZERODATA)!=0;. 
b410: 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28   pPage->leaf = (
b420: 66 6c 61 67 42 79 74 65 20 26 20 50 54 46 5f 4c  flagByte & PTF_L
b430: 45 41 46 29 21 3d 30 3b 0a 20 20 70 50 61 67 65  EAF)!=0;.  pPage
b440: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d  ->childPtrSize =
b450: 20 34 2a 28 70 50 61 67 65 2d 3e 6c 65 61 66 3d   4*(pPage->leaf=
b460: 3d 30 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61  =0);.  pBt = pPa
b470: 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 66  ge->pBt;.  if( f
b480: 6c 61 67 42 79 74 65 20 26 20 50 54 46 5f 4c 45  lagByte & PTF_LE
b490: 41 46 44 41 54 41 20 29 7b 0a 20 20 20 20 70 50  AFDATA ){.    pP
b4a0: 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 3d 20  age->leafData = 
b4b0: 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  1;.    pPage->ma
b4c0: 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61  xLocal = pBt->ma
b4d0: 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65  xLeaf;.    pPage
b4e0: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
b4f0: 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c  ->minLeaf;.  }el
b500: 73 65 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6c  se{.    pPage->l
b510: 65 61 66 44 61 74 61 20 3d 20 30 3b 0a 20 20 20  eafData = 0;.   
b520: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
b530: 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c   = pBt->maxLocal
b540: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
b550: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
b560: 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61  Local;.  }.  pPa
b570: 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 21 28  ge->hasData = !(
b580: 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61 20  pPage->zeroData 
b590: 7c 7c 20 28 21 70 50 61 67 65 2d 3e 6c 65 61 66  || (!pPage->leaf
b5a0: 20 26 26 20 70 50 61 67 65 2d 3e 6c 65 61 66 44   && pPage->leafD
b5b0: 61 74 61 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ata));.}../*.** 
b5c0: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61  Initialize the a
b5d0: 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61  uxiliary informa
b5e0: 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20  tion for a disk 
b5f0: 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  block..**.** The
b600: 20 70 50 61 72 65 6e 74 20 70 61 72 61 6d 65 74   pParent paramet
b610: 65 72 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69  er must be a poi
b620: 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50  nter to the MemP
b630: 61 67 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  age which.** is 
b640: 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 74 68  the parent of th
b650: 65 20 70 61 67 65 20 62 65 69 6e 67 20 69 6e 69  e page being ini
b660: 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 72  tialized.  The r
b670: 6f 6f 74 20 6f 66 20 61 0a 2a 2a 20 42 54 72 65  oot of a.** BTre
b680: 65 20 68 61 73 20 6e 6f 20 70 61 72 65 6e 74 20  e has no parent 
b690: 61 6e 64 20 73 6f 20 66 6f 72 20 74 68 61 74 20  and so for that 
b6a0: 70 61 67 65 2c 20 70 50 61 72 65 6e 74 3d 3d 4e  page, pParent==N
b6b0: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ULL..**.** Retur
b6c0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
b6d0: 75 63 63 65 73 73 2e 20 20 49 66 20 77 65 20 73  uccess.  If we s
b6e0: 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ee that the page
b6f0: 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e   does.** not con
b700: 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d  tain a well-form
b710: 65 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ed database page
b720: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a  , then return .*
b730: 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  * SQLITE_CORRUPT
b740: 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72  .  Note that a r
b750: 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f  eturn of SQLITE_
b760: 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67  OK does not.** g
b770: 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68  uarantee that th
b780: 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66  e page is well-f
b790: 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20  ormed.  It only 
b7a0: 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65  shows that.** we
b7b0: 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63   failed to detec
b7c0: 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e  t any corruption
b7d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b7e0: 69 6e 69 74 50 61 67 65 28 0a 20 20 4d 65 6d 50  initPage(.  MemP
b7f0: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
b800: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
b810: 6f 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  o be initialized
b820: 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
b830: 50 61 72 65 6e 74 20 20 20 20 20 20 20 2f 2a 20  Parent       /* 
b840: 54 68 65 20 70 61 72 65 6e 74 2e 20 20 4d 69 67  The parent.  Mig
b850: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  ht be NULL */.){
b860: 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20  .  int pc;      
b870: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
b880: 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20   of a freeblock 
b890: 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44  within pPage->aD
b8a0: 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 68  ata[] */.  int h
b8b0: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  dr;           /*
b8c0: 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e   Offset to begin
b8d0: 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65 61  ning of page hea
b8e0: 64 65 72 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  der */.  u8 *dat
b8f0: 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  a;          /* E
b900: 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61  qual to pPage->a
b910: 44 61 74 61 20 2a 2f 0a 20 20 42 74 53 68 61 72  Data */.  BtShar
b920: 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20  ed *pBt;        
b930: 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65  /* The main btre
b940: 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  e structure */. 
b950: 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
b960: 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66      /* Amount of
b970: 20 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e   usable space on
b980: 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20   each page */.  
b990: 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  int cellOffset; 
b9a0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f     /* Offset fro
b9b0: 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67 65 20  m start of page 
b9c0: 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f  to first cell po
b9d0: 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  inter */.  int n
b9e0: 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Free;         /*
b9f0: 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65   Number of unuse
ba00: 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70  d bytes on the p
ba10: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70  age */.  int top
ba20: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
ba30: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
ba40: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
ba50: 65 61 20 2a 2f 0a 0a 20 20 70 42 74 20 3d 20 70  ea */..  pBt = p
ba60: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73  Page->pBt;.  ass
ba70: 65 72 74 28 20 70 42 74 21 3d 30 20 29 3b 0a 20  ert( pBt!=0 );. 
ba80: 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
ba90: 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e  ==0 || pParent->
baa0: 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 61 73  pBt==pBt );.  as
bab0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e  sert( pPage->pgn
bac0: 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50  o==sqlite3PagerP
bad0: 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d  agenumber(pPage-
bae0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
baf0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44  ssert( pPage->aD
bb00: 61 74 61 20 3d 3d 20 26 28 28 75 6e 73 69 67 6e  ata == &((unsign
bb10: 65 64 20 63 68 61 72 2a 29 70 50 61 67 65 29 5b  ed char*)pPage)[
bb20: 2d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 20  -pBt->pageSize] 
bb30: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
bb40: 70 50 61 72 65 6e 74 21 3d 70 50 61 72 65 6e 74  pParent!=pParent
bb50: 20 26 26 20 28 70 50 61 67 65 2d 3e 70 50 61 72   && (pPage->pPar
bb60: 65 6e 74 21 3d 30 20 7c 7c 20 70 50 61 67 65 2d  ent!=0 || pPage-
bb70: 3e 69 73 49 6e 69 74 29 20 29 7b 0a 20 20 20 20  >isInit) ){.    
bb80: 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 70 61  /* The parent pa
bb90: 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  ge should never 
bba0: 63 68 61 6e 67 65 20 75 6e 6c 65 73 73 20 74 68  change unless th
bbb0: 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70  e file is corrup
bbc0: 74 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  t */.    return 
bbd0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
bbe0: 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  KPT;.  }.  if( p
bbf0: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 20 72  Page->isInit ) r
bc00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
bc10: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 50  .  if( pPage->pP
bc20: 61 72 65 6e 74 3d 3d 30 20 26 26 20 70 50 61 72  arent==0 && pPar
bc30: 65 6e 74 21 3d 30 20 29 7b 0a 20 20 20 20 70 50  ent!=0 ){.    pP
bc40: 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70  age->pParent = p
bc50: 50 61 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69  Parent;.    sqli
bc60: 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61 72  te3PagerRef(pPar
bc70: 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ent->pDbPage);. 
bc80: 20 7d 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65   }.  hdr = pPage
bc90: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 64  ->hdrOffset;.  d
bca0: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
bcb0: 74 61 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67  ta;.  decodeFlag
bcc0: 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64  s(pPage, data[hd
bcd0: 72 5d 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f  r]);.  pPage->nO
bce0: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 70  verflow = 0;.  p
bcf0: 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d  Page->idxShift =
bd00: 20 30 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65   0;.  usableSize
bd10: 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
bd20: 7a 65 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c  ze;.  pPage->cel
bd30: 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66  lOffset = cellOf
bd40: 66 73 65 74 20 3d 20 68 64 72 20 2b 20 31 32 20  fset = hdr + 12 
bd50: 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b  - 4*pPage->leaf;
bd60: 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74  .  top = get2byt
bd70: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
bd80: 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  .  pPage->nCell 
bd90: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
bda0: 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 69 66 28 20  [hdr+3]);.  if( 
bdb0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f  pPage->nCell>MX_
bdc0: 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20  CELL(pBt) ){.   
bdd0: 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c   /* To many cell
bde0: 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70  s for a single p
bdf0: 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d  age.  The page m
be00: 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a  ust be corrupt *
be10: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
be20: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
be30: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
be40: 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 70  e->nCell==0 && p
be50: 50 61 72 65 6e 74 21 3d 30 20 26 26 20 70 50 61  Parent!=0 && pPa
be60: 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 7b  rent->pgno!=1 ){
be70: 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 70 61 67 65  .    /* All page
be80: 73 20 6d 75 73 74 20 68 61 76 65 20 61 74 20 6c  s must have at l
be90: 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c 2c 20 65  east one cell, e
bea0: 78 63 65 70 74 20 66 6f 72 20 72 6f 6f 74 20 70  xcept for root p
beb0: 61 67 65 73 20 2a 2f 0a 20 20 20 20 72 65 74 75  ages */.    retu
bec0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
bed0: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
bee0: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f  * Compute the to
bef0: 74 61 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f  tal free space o
bf00: 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  n the page */.  
bf10: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
bf20: 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 6e  ata[hdr+1]);.  n
bf30: 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b  Free = data[hdr+
bf40: 37 5d 20 2b 20 74 6f 70 20 2d 20 28 63 65 6c 6c  7] + top - (cell
bf50: 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65  Offset + 2*pPage
bf60: 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 77 68 69 6c  ->nCell);.  whil
bf70: 65 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 69  e( pc>0 ){.    i
bf80: 6e 74 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20  nt next, size;. 
bf90: 20 20 20 69 66 28 20 70 63 3e 75 73 61 62 6c 65     if( pc>usable
bfa0: 53 69 7a 65 2d 34 20 29 7b 0a 20 20 20 20 20 20  Size-4 ){.      
bfb0: 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 20 69 73  /* Free block is
bfc0: 20 6f 66 66 20 74 68 65 20 70 61 67 65 20 2a 2f   off the page */
bfd0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
bfe0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
bff0: 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 6e 65  T; .    }.    ne
c000: 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  xt = get2byte(&d
c010: 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 73 69  ata[pc]);.    si
c020: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ze = get2byte(&d
c030: 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20  ata[pc+2]);.    
c040: 69 66 28 20 6e 65 78 74 3e 30 20 26 26 20 6e 65  if( next>0 && ne
c050: 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29 7b  xt<=pc+size+3 ){
c060: 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62  .      /* Free b
c070: 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e  locks must be in
c080: 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   accending order
c090: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
c0a0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
c0b0: 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20  BKPT; .    }.   
c0c0: 20 6e 46 72 65 65 20 2b 3d 20 73 69 7a 65 3b 0a   nFree += size;.
c0d0: 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20      pc = next;. 
c0e0: 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65   }.  pPage->nFre
c0f0: 65 20 3d 20 6e 46 72 65 65 3b 0a 20 20 69 66 28  e = nFree;.  if(
c100: 20 6e 46 72 65 65 3e 3d 75 73 61 62 6c 65 53 69   nFree>=usableSi
c110: 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 46 72 65  ze ){.    /* Fre
c120: 65 20 73 70 61 63 65 20 63 61 6e 6e 6f 74 20 65  e space cannot e
c130: 78 63 65 65 64 20 74 6f 74 61 6c 20 70 61 67 65  xceed total page
c140: 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 72 65 74   size */.    ret
c150: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
c160: 50 54 5f 42 4b 50 54 3b 20 0a 20 20 7d 0a 0a 20  PT_BKPT; .  }.. 
c170: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
c180: 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   1;.  return SQL
c190: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
c1a0: 20 53 65 74 20 75 70 20 61 20 72 61 77 20 70 61   Set up a raw pa
c1b0: 67 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f  ge so that it lo
c1c0: 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62  oks like a datab
c1d0: 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67  ase page holding
c1e0: 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a  .** no entries..
c1f0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a  */.static void z
c200: 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20  eroPage(MemPage 
c210: 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67  *pPage, int flag
c220: 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  s){.  unsigned c
c230: 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67  har *data = pPag
c240: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68  e->aData;.  BtSh
c250: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
c260: 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 68 64  e->pBt;.  int hd
c270: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
c280: 66 73 65 74 3b 0a 20 20 69 6e 74 20 66 69 72 73  fset;.  int firs
c290: 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  t;..  assert( sq
c2a0: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
c2b0: 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50  mber(pPage->pDbP
c2c0: 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e  age)==pPage->pgn
c2d0: 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 26  o );.  assert( &
c2e0: 64 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69  data[pBt->pageSi
c2f0: 7a 65 5d 20 3d 3d 20 28 75 6e 73 69 67 6e 65 64  ze] == (unsigned
c300: 20 63 68 61 72 2a 29 70 50 61 67 65 20 29 3b 0a   char*)pPage );.
c310: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
c320: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
c330: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
c340: 29 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  ) );.  memset(&d
c350: 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74  ata[hdr], 0, pBt
c360: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68  ->usableSize - h
c370: 64 72 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 5d  dr);.  data[hdr]
c380: 20 3d 20 66 6c 61 67 73 3b 0a 20 20 66 69 72 73   = flags;.  firs
c390: 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 34 2a  t = hdr + 8 + 4*
c3a0: 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46  ((flags&PTF_LEAF
c3b0: 29 3d 3d 30 29 3b 0a 20 20 6d 65 6d 73 65 74 28  )==0);.  memset(
c3c0: 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c  &data[hdr+1], 0,
c3d0: 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b   4);.  data[hdr+
c3e0: 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79  7] = 0;.  put2by
c3f0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
c400: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
c410: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
c420: 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
c430: 69 7a 65 20 2d 20 66 69 72 73 74 3b 0a 20 20 64  ize - first;.  d
c440: 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65  ecodeFlags(pPage
c450: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50 61 67  , flags);.  pPag
c460: 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 68  e->hdrOffset = h
c470: 64 72 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c  dr;.  pPage->cel
c480: 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b  lOffset = first;
c490: 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  .  pPage->nOverf
c4a0: 6c 6f 77 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  low = 0;.  pPage
c4b0: 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 30 3b 0a  ->idxShift = 0;.
c4c0: 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d    pPage->nCell =
c4d0: 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49   0;.  pPage->isI
c4e0: 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  nit = 1;.}../*.*
c4f0: 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f  * Get a page fro
c500: 6d 20 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e  m the pager.  In
c510: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d  itialize the Mem
c520: 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20  Page.pBt and.** 
c530: 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c  MemPage.aData el
c540: 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64  ements if needed
c550: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c560: 67 65 74 50 61 67 65 28 42 74 53 68 61 72 65 64  getPage(BtShared
c570: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
c580: 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61  , MemPage **ppPa
c590: 67 65 2c 20 69 6e 74 20 63 6c 72 46 6c 61 67 29  ge, int clrFlag)
c5a0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
c5b0: 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
c5c0: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
c5d0: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
c5e0: 50 61 67 65 72 41 63 71 75 69 72 65 28 70 42 74  PagerAcquire(pBt
c5f0: 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  ->pPager, pgno, 
c600: 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61  (DbPage**)&pDbPa
c610: 67 65 2c 20 63 6c 72 46 6c 61 67 29 3b 0a 20 20  ge, clrFlag);.  
c620: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
c630: 72 63 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d  rc;.  pPage = (M
c640: 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33  emPage *)sqlite3
c650: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
c660: 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d  bPage);.  pPage-
c670: 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33  >aData = sqlite3
c680: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
c690: 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e  Page);.  pPage->
c6a0: 70 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67  pDbPage = pDbPag
c6b0: 65 3b 0a 20 20 70 50 61 67 65 2d 3e 70 42 74 20  e;.  pPage->pBt 
c6c0: 3d 20 70 42 74 3b 0a 20 20 70 50 61 67 65 2d 3e  = pBt;.  pPage->
c6d0: 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70  pgno = pgno;.  p
c6e0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20  Page->hdrOffset 
c6f0: 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31  = pPage->pgno==1
c700: 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20 2a 70   ? 100 : 0;.  *p
c710: 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20  pPage = pPage;. 
c720: 20 69 66 28 20 63 6c 72 46 6c 61 67 20 29 7b 0a   if( clrFlag ){.
c730: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
c740: 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 70 50 61  DontRollback(pPa
c750: 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
c760: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
c770: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  E_OK;.}../*.** G
c780: 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  et a page from t
c790: 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69  he pager and ini
c7a0: 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54 68 69  tialize it.  Thi
c7b0: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  s routine.** is 
c7c0: 6a 75 73 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e  just a convenien
c7d0: 63 65 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e  ce wrapper aroun
c7e0: 64 20 73 65 70 61 72 61 74 65 20 63 61 6c 6c 73  d separate calls
c7f0: 20 74 6f 0a 2a 2a 20 67 65 74 50 61 67 65 28 29   to.** getPage()
c800: 20 61 6e 64 20 69 6e 69 74 50 61 67 65 28 29 2e   and initPage().
c810: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
c820: 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20  etAndInitPage(. 
c830: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
c840: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
c850: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
c860: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
c870: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
c880: 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f  r of the page to
c890: 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67   get */.  MemPag
c8a0: 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
c8b0: 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65  * Write the page
c8c0: 20 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f   pointer here */
c8d0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  .  MemPage *pPar
c8e0: 65 6e 74 20 20 20 20 20 2f 2a 20 50 61 72 65 6e  ent     /* Paren
c8f0: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f  t of the page */
c900: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
c910: 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20  if( pgno==0 ){. 
c920: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c930: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
c940: 20 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 50 61    }.  rc = getPa
c950: 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70  ge(pBt, pgno, pp
c960: 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  Page, 0);.  if( 
c970: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
c980: 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e   (*ppPage)->isIn
c990: 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  it==0 ){.    rc 
c9a0: 3d 20 69 6e 69 74 50 61 67 65 28 2a 70 70 50 61  = initPage(*ppPa
c9b0: 67 65 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20  ge, pParent);.  
c9c0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
c9d0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
c9e0: 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73  a MemPage.  This
c9f0: 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65   should be calle
ca00: 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  d once for each 
ca10: 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f  prior.** call to
ca20: 20 67 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61   getPage..*/.sta
ca30: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
ca40: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
ca50: 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67  age){.  if( pPag
ca60: 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
ca70: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b   pPage->aData );
ca80: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
ca90: 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20 61  ge->pBt );.    a
caa0: 73 73 65 72 74 28 20 26 70 50 61 67 65 2d 3e 61  ssert( &pPage->a
cab0: 44 61 74 61 5b 70 50 61 67 65 2d 3e 70 42 74 2d  Data[pPage->pBt-
cac0: 3e 70 61 67 65 53 69 7a 65 5d 3d 3d 28 75 6e 73  >pageSize]==(uns
cad0: 69 67 6e 65 64 20 63 68 61 72 2a 29 70 50 61 67  igned char*)pPag
cae0: 65 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  e );.    sqlite3
caf0: 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65  PagerUnref(pPage
cb00: 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a  ->pDbPage);.  }.
cb10: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
cb20: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
cb30: 77 68 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e  when the referen
cb40: 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70  ce count for a p
cb50: 61 67 65 0a 2a 2a 20 72 65 61 63 68 65 73 20 7a  age.** reaches z
cb60: 65 72 6f 2e 20 20 57 65 20 6e 65 65 64 20 74 6f  ero.  We need to
cb70: 20 75 6e 72 65 66 20 74 68 65 20 70 50 61 72 65   unref the pPare
cb80: 6e 74 20 70 6f 69 6e 74 65 72 20 77 68 65 6e 20  nt pointer when 
cb90: 74 68 61 74 0a 2a 2a 20 68 61 70 70 65 6e 73 2e  that.** happens.
cba0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
cbb0: 70 61 67 65 44 65 73 74 72 75 63 74 6f 72 28 44  pageDestructor(D
cbc0: 62 50 61 67 65 20 2a 70 44 61 74 61 2c 20 69 6e  bPage *pData, in
cbd0: 74 20 70 61 67 65 53 69 7a 65 29 7b 0a 20 20 4d  t pageSize){.  M
cbe0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
cbf0: 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69   assert( (pageSi
cc00: 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20  ze & 7)==0 );.  
cc10: 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65  pPage = (MemPage
cc20: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
cc30: 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a  etExtra(pData);.
cc40: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61    if( pPage->pPa
cc50: 72 65 6e 74 20 29 7b 0a 20 20 20 20 4d 65 6d 50  rent ){.    MemP
cc60: 61 67 65 20 2a 70 50 61 72 65 6e 74 20 3d 20 70  age *pParent = p
cc70: 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20  Page->pParent;. 
cc80: 20 20 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e     pPage->pParen
cc90: 74 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61  t = 0;.    relea
cca0: 73 65 50 61 67 65 28 70 50 61 72 65 6e 74 29 3b  sePage(pParent);
ccb0: 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 69 73  .  }.  pPage->is
ccc0: 49 6e 69 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Init = 0;.}../*.
ccd0: 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c  ** During a roll
cce0: 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70  back, when the p
ccf0: 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66  ager reloads inf
cd00: 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68  ormation into th
cd10: 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68  e cache.** so th
cd20: 61 74 20 74 68 65 20 63 61 63 68 65 20 69 73 20  at the cache is 
cd30: 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
cd40: 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61  original state a
cd50: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a  t the start of.*
cd60: 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * the transactio
cd70: 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  n, for each page
cd80: 20 72 65 73 74 6f 72 65 64 20 74 68 69 73 20 72   restored this r
cd90: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
cda0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
cdb0: 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65  tine needs to re
cdc0: 73 65 74 20 74 68 65 20 65 78 74 72 61 20 64 61  set the extra da
cdd0: 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68  ta section at th
cde0: 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  e end of the.** 
cdf0: 70 61 67 65 20 74 6f 20 61 67 72 65 65 20 77 69  page to agree wi
ce00: 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64 20  th the restored 
ce10: 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  data..*/.static 
ce20: 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69 74 28  void pageReinit(
ce30: 44 62 50 61 67 65 20 2a 70 44 61 74 61 2c 20 69  DbPage *pData, i
ce40: 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a 20 20  nt pageSize){.  
ce50: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
ce60: 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53    assert( (pageS
ce70: 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20  ize & 7)==0 );. 
ce80: 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67   pPage = (MemPag
ce90: 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  e *)sqlite3Pager
cea0: 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b  GetExtra(pData);
ceb0: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73  .  if( pPage->is
cec0: 49 6e 69 74 20 29 7b 0a 20 20 20 20 70 50 61 67  Init ){.    pPag
ced0: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  e->isInit = 0;. 
cee0: 20 20 20 69 6e 69 74 50 61 67 65 28 70 50 61 67     initPage(pPag
cef0: 65 2c 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e  e, pPage->pParen
cf00: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
cf10: 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65   Open a database
cf20: 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46   file..** .** zF
cf30: 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e  ilename is the n
cf40: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
cf50: 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a 46  ase file.  If zF
cf60: 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a  ilename is NULL.
cf70: 2a 2a 20 61 20 6e 65 77 20 64 61 74 61 62 61 73  ** a new databas
cf80: 65 20 77 69 74 68 20 61 20 72 61 6e 64 6f 6d 20  e with a random 
cf90: 6e 61 6d 65 20 69 73 20 63 72 65 61 74 65 64 2e  name is created.
cfa0: 20 20 54 68 69 73 20 72 61 6e 64 6f 6d 6c 79 20    This randomly 
cfb0: 6e 61 6d 65 64 0a 2a 2a 20 64 61 74 61 62 61 73  named.** databas
cfc0: 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64  e file will be d
cfd0: 65 6c 65 74 65 64 20 77 68 65 6e 20 73 71 6c 69  eleted when sqli
cfe0: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 29 20  te3BtreeClose() 
cff0: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 69 6e  is called..*/.in
d000: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70  t sqlite3BtreeOp
d010: 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  en(.  const char
d020: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a   *zFilename,  /*
d030: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
d040: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
d050: 20 42 54 72 65 65 20 64 61 74 61 62 61 73 65 20   BTree database 
d060: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 70 53  */.  sqlite3 *pS
d070: 71 6c 69 74 65 2c 20 20 20 20 20 20 20 2f 2a 20  qlite,       /* 
d080: 41 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62  Associated datab
d090: 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
d0a0: 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c  Btree **ppBtree,
d0b0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
d0c0: 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20  er to new Btree 
d0d0: 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68  object written h
d0e0: 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ere */.  int fla
d0f0: 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  gs              
d100: 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 29   /* Options */.)
d110: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
d120: 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  t;          /* S
d130: 68 61 72 65 64 20 70 61 72 74 20 6f 66 20 62 74  hared part of bt
d140: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
d150: 0a 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20  .  Btree *p;    
d160: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
d170: 6e 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  ndle to return *
d180: 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  /.  int rc;.  in
d190: 74 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 75 6e  t nReserve;.  un
d1a0: 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48  signed char zDbH
d1b0: 65 61 64 65 72 5b 31 30 30 5d 3b 0a 23 69 66 20  eader[100];.#if 
d1c0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
d1d0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
d1e0: 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
d1f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
d200: 4f 29 0a 20 20 63 6f 6e 73 74 20 54 68 72 65 61  O).  const Threa
d210: 64 44 61 74 61 20 2a 70 54 73 64 72 6f 3b 0a 23  dData *pTsdro;.#
d220: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20  endif..  /* Set 
d230: 74 68 65 20 76 61 72 69 61 62 6c 65 20 69 73 4d  the variable isM
d240: 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f 72  emdb to true for
d250: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
d260: 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a  tabase, or .  **
d270: 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69 6c   false for a fil
d280: 65 2d 62 61 73 65 64 20 64 61 74 61 62 61 73 65  e-based database
d290: 2e 20 54 68 69 73 20 73 79 6d 62 6f 6c 20 69 73  . This symbol is
d2a0: 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 64 20 69   only required i
d2b0: 66 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 6f 66  f.  ** either of
d2c0: 20 74 68 65 20 73 68 61 72 65 64 2d 64 61 74 61   the shared-data
d2d0: 20 6f 72 20 61 75 74 6f 76 61 63 75 75 6d 20 66   or autovacuum f
d2e0: 65 61 74 75 72 65 73 20 61 72 65 20 63 6f 6d 70  eatures are comp
d2f0: 69 6c 65 64 20 0a 20 20 2a 2a 20 69 6e 74 6f 20  iled .  ** into 
d300: 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 20 20 2a  the library..  *
d310: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
d320: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
d330: 44 5f 43 41 43 48 45 29 20 7c 7c 20 21 64 65 66  D_CACHE) || !def
d340: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
d350: 5f 41 55 54 4f 56 41 43 55 55 4d 29 0a 20 20 23  _AUTOVACUUM).  #
d360: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
d370: 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 63  T_MEMORYDB.    c
d380: 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62  onst int isMemdb
d390: 20 3d 20 30 3b 0a 20 20 23 65 6c 73 65 0a 20 20   = 0;.  #else.  
d3a0: 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65    const int isMe
d3b0: 6d 64 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 20  mdb = zFilename 
d3c0: 26 26 20 21 73 74 72 63 6d 70 28 7a 46 69 6c 65  && !strcmp(zFile
d3d0: 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22  name, ":memory:"
d3e0: 29 3b 0a 20 20 23 65 6e 64 69 66 0a 23 65 6e 64  );.  #endif.#end
d3f0: 69 66 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  if..  p = sqlite
d400: 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 42 74  Malloc(sizeof(Bt
d410: 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20  ree));.  if( !p 
d420: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
d430: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
d440: 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
d450: 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e  RANS_NONE;.  p->
d460: 70 53 71 6c 69 74 65 20 3d 20 70 53 71 6c 69 74  pSqlite = pSqlit
d470: 65 3b 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20  e;..  /* Try to 
d480: 66 69 6e 64 20 61 6e 20 65 78 69 73 74 69 6e 67  find an existing
d490: 20 42 74 72 65 65 20 73 74 72 75 63 74 75 72 65   Btree structure
d4a0: 20 6f 70 65 6e 65 64 20 6f 6e 20 7a 46 69 6c 65   opened on zFile
d4b0: 6e 61 6d 65 2e 20 2a 2f 0a 23 69 66 20 21 64 65  name. */.#if !de
d4c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
d4d0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
d4e0: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
d4f0: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
d500: 20 20 70 54 73 64 72 6f 20 3d 20 73 71 6c 69 74    pTsdro = sqlit
d510: 65 33 54 68 72 65 61 64 44 61 74 61 52 65 61 64  e3ThreadDataRead
d520: 4f 6e 6c 79 28 29 3b 0a 20 20 69 66 28 20 70 54  Only();.  if( pT
d530: 73 64 72 6f 2d 3e 75 73 65 53 68 61 72 65 64 44  sdro->useSharedD
d540: 61 74 61 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ata && zFilename
d550: 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a   && !isMemdb ){.
d560: 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50      char *zFullP
d570: 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
d580: 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  3OsFullPathname(
d590: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
d5a0: 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61  if( !zFullPathna
d5b0: 6d 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  me ){.      sqli
d5c0: 74 65 46 72 65 65 28 70 29 3b 0a 20 20 20 20 20  teFree(p);.     
d5d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
d5e0: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
d5f0: 66 6f 72 28 70 42 74 3d 70 54 73 64 72 6f 2d 3e  for(pBt=pTsdro->
d600: 70 42 74 72 65 65 3b 20 70 42 74 3b 20 70 42 74  pBtree; pBt; pBt
d610: 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  =pBt->pNext){.  
d620: 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
d630: 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20  >nRef>0 );.     
d640: 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a   if( 0==strcmp(z
d650: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71  FullPathname, sq
d660: 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61  lite3PagerFilena
d670: 6d 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29  me(pBt->pPager))
d680: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70   ){.        p->p
d690: 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20  Bt = pBt;.      
d6a0: 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a    *ppBtree = p;.
d6b0: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65          pBt->nRe
d6c0: 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  f++;.        sql
d6d0: 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74  iteFree(zFullPat
d6e0: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  hname);.        
d6f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d700: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
d710: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
d720: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
d730: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a   }.#endif..  /*.
d740: 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
d750: 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65 20  ng asserts make 
d760: 73 75 72 65 20 74 68 61 74 20 73 74 72 75 63 74  sure that struct
d770: 75 72 65 73 20 75 73 65 64 20 62 79 20 74 68 65  ures used by the
d780: 20 62 74 72 65 65 20 61 72 65 0a 20 20 2a 2a 20   btree are.  ** 
d790: 74 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20  the right size. 
d7a0: 20 54 68 69 73 20 69 73 20 74 6f 20 67 75 61 72   This is to guar
d7b0: 64 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63  d against size c
d7c0: 68 61 6e 67 65 73 20 74 68 61 74 20 72 65 73 75  hanges that resu
d7d0: 6c 74 0a 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d  lt.  ** when com
d7e0: 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66  piling on a diff
d7f0: 65 72 65 6e 74 20 61 72 63 68 69 74 65 63 74 75  erent architectu
d800: 72 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  re..  */.  asser
d810: 74 28 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d  t( sizeof(i64)==
d820: 38 20 7c 7c 20 73 69 7a 65 6f 66 28 69 36 34 29  8 || sizeof(i64)
d830: 3d 3d 34 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==4 );.  assert(
d840: 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20   sizeof(u64)==8 
d850: 7c 7c 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d  || sizeof(u64)==
d860: 34 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  4 );.  assert( s
d870: 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b  izeof(u32)==4 );
d880: 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f  .  assert( sizeo
d890: 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 61  f(u16)==2 );.  a
d8a0: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 50 67  ssert( sizeof(Pg
d8b0: 6e 6f 29 3d 3d 34 20 29 3b 0a 0a 20 20 70 42 74  no)==4 );..  pBt
d8c0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
d8d0: 20 73 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b   sizeof(*pBt) );
d8e0: 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b  .  if( pBt==0 ){
d8f0: 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20  .    *ppBtree = 
d900: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  0;.    sqliteFre
d910: 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e(p);.    return
d920: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
d930: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
d940: 33 50 61 67 65 72 4f 70 65 6e 28 26 70 42 74 2d  3PagerOpen(&pBt-
d950: 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61  >pPager, zFilena
d960: 6d 65 2c 20 45 58 54 52 41 5f 53 49 5a 45 2c 20  me, EXTRA_SIZE, 
d970: 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63  flags);.  if( rc
d980: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
d990: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
d9a0: 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64  agerReadFilehead
d9b0: 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73  er(pBt->pPager,s
d9c0: 69 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29  izeof(zDbHeader)
d9d0: 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20 7d  ,zDbHeader);.  }
d9e0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
d9f0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
da00: 70 42 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20  pBt->pPager ){. 
da10: 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
da20: 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67  rClose(pBt->pPag
da30: 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  er);.    }.    s
da40: 71 6c 69 74 65 46 72 65 65 28 70 42 74 29 3b 0a  qliteFree(pBt);.
da50: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
da60: 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20  );.    *ppBtree 
da70: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
da80: 72 63 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 42 74  rc;.  }.  p->pBt
da90: 20 3d 20 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74   = pBt;..  sqlit
daa0: 65 33 50 61 67 65 72 53 65 74 44 65 73 74 72 75  e3PagerSetDestru
dab0: 63 74 6f 72 28 70 42 74 2d 3e 70 50 61 67 65 72  ctor(pBt->pPager
dac0: 2c 20 70 61 67 65 44 65 73 74 72 75 63 74 6f 72  , pageDestructor
dad0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
dae0: 72 53 65 74 52 65 69 6e 69 74 65 72 28 70 42 74  rSetReiniter(pBt
daf0: 2d 3e 70 50 61 67 65 72 2c 20 70 61 67 65 52 65  ->pPager, pageRe
db00: 69 6e 69 74 29 3b 0a 20 20 70 42 74 2d 3e 70 43  init);.  pBt->pC
db10: 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 70 42 74  ursor = 0;.  pBt
db20: 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
db30: 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20  pBt->readOnly = 
db40: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65  sqlite3PagerIsre
db50: 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67  adonly(pBt->pPag
db60: 65 72 29 3b 0a 20 20 70 42 74 2d 3e 70 61 67 65  er);.  pBt->page
db70: 53 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  Size = get2byte(
db80: 26 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 29 3b  &zDbHeader[16]);
db90: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65  .  if( pBt->page
dba0: 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d  Size<512 || pBt-
dbb0: 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45  >pageSize>SQLITE
dbc0: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20  _MAX_PAGE_SIZE. 
dbd0: 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e        || ((pBt->
dbe0: 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d  pageSize-1)&pBt-
dbf0: 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b  >pageSize)!=0 ){
dc00: 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69  .    pBt->pageSi
dc10: 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  ze = SQLITE_DEFA
dc20: 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20  ULT_PAGE_SIZE;. 
dc30: 20 20 20 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64     pBt->maxEmbed
dc40: 46 72 61 63 20 3d 20 36 34 3b 20 20 20 2f 2a 20  Frac = 64;   /* 
dc50: 32 35 25 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e  25% */.    pBt->
dc60: 6d 69 6e 45 6d 62 65 64 46 72 61 63 20 3d 20 33  minEmbedFrac = 3
dc70: 32 3b 20 20 20 2f 2a 20 31 32 2e 35 25 20 2a 2f  2;   /* 12.5% */
dc80: 0a 20 20 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  .    pBt->minLea
dc90: 66 46 72 61 63 20 3d 20 33 32 3b 20 20 20 20 2f  fFrac = 32;    /
dca0: 2a 20 31 32 2e 35 25 20 2a 2f 0a 23 69 66 6e 64  * 12.5% */.#ifnd
dcb0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
dcc0: 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 2f 2a  UTOVACUUM.    /*
dcd0: 20 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61   If the magic na
dce0: 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69  me ":memory:" wi
dcf0: 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d  ll create an in-
dd00: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
dd10: 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 64 6f 20   then.    ** do 
dd20: 6e 6f 74 20 73 65 74 20 74 68 65 20 61 75 74 6f  not set the auto
dd30: 2d 76 61 63 75 75 6d 20 66 6c 61 67 2c 20 65 76  -vacuum flag, ev
dd40: 65 6e 20 69 66 20 53 51 4c 49 54 45 5f 44 45 46  en if SQLITE_DEF
dd50: 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  AULT_AUTOVACUUM.
dd60: 20 20 20 20 2a 2a 20 69 73 20 74 72 75 65 2e 20      ** is true. 
dd70: 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
dd80: 64 2c 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  d, if SQLITE_OMI
dd90: 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62  T_MEMORYDB has b
dda0: 65 65 6e 20 64 65 66 69 6e 65 64 2c 0a 20 20 20  een defined,.   
ddb0: 20 2a 2a 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72   ** then ":memor
ddc0: 79 3a 22 20 69 73 20 6a 75 73 74 20 61 20 72 65  y:" is just a re
ddd0: 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e  gular file-name.
dde0: 20 52 65 73 70 65 63 74 20 74 68 65 20 61 75 74   Respect the aut
ddf0: 6f 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a 20  o-vacuum.    ** 
de00: 64 65 66 61 75 6c 74 20 69 6e 20 74 68 69 73 20  default in this 
de10: 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  case..    */.   
de20: 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
de30: 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20  & !isMemdb ){.  
de40: 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
de50: 75 75 6d 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  uum = SQLITE_DEF
de60: 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3b  AULT_AUTOVACUUM;
de70: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
de80: 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a    nReserve = 0;.
de90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 52 65    }else{.    nRe
dea0: 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65  serve = zDbHeade
deb0: 72 5b 32 30 5d 3b 0a 20 20 20 20 70 42 74 2d 3e  r[20];.    pBt->
dec0: 6d 61 78 45 6d 62 65 64 46 72 61 63 20 3d 20 7a  maxEmbedFrac = z
ded0: 44 62 48 65 61 64 65 72 5b 32 31 5d 3b 0a 20 20  DbHeader[21];.  
dee0: 20 20 70 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46    pBt->minEmbedF
def0: 72 61 63 20 3d 20 7a 44 62 48 65 61 64 65 72 5b  rac = zDbHeader[
df00: 32 32 5d 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 69  22];.    pBt->mi
df10: 6e 4c 65 61 66 46 72 61 63 20 3d 20 7a 44 62 48  nLeafFrac = zDbH
df20: 65 61 64 65 72 5b 32 33 5d 3b 0a 20 20 20 20 70  eader[23];.    p
df30: 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
df40: 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53  d = 1;.#ifndef S
df50: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
df60: 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61  ACUUM.    pBt->a
df70: 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74  utoVacuum = (get
df80: 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72  4byte(&zDbHeader
df90: 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29  [36 + 4*4])?1:0)
dfa0: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70  ;.#endif.  }.  p
dfb0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
dfc0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
dfd0: 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 61 73 73   nReserve;.  ass
dfe0: 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53  ert( (pBt->pageS
dff0: 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20  ize & 7)==0 );  
e000: 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d  /* 8-byte alignm
e010: 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20  ent of pageSize 
e020: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  */.  sqlite3Page
e030: 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74  rSetPagesize(pBt
e040: 2d 3e 70 50 61 67 65 72 2c 20 70 42 74 2d 3e 70  ->pPager, pBt->p
e050: 61 67 65 53 69 7a 65 29 3b 0a 0a 23 69 66 20 21  ageSize);..#if !
e060: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
e070: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
e080: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
e090: 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
e0a0: 29 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e  ).  /* Add the n
e0b0: 65 77 20 62 74 72 65 65 20 74 6f 20 74 68 65 20  ew btree to the 
e0c0: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72  linked list star
e0d0: 74 69 6e 67 20 61 74 20 54 68 72 65 61 64 44 61  ting at ThreadDa
e0e0: 74 61 2e 70 42 74 72 65 65 2e 0a 20 20 2a 2a 20  ta.pBtree..  ** 
e0f0: 54 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e  There is no chan
e100: 63 65 20 74 68 61 74 20 61 20 6d 61 6c 6c 6f 63  ce that a malloc
e110: 28 29 20 6d 61 79 20 66 61 69 6c 20 69 6e 73 69  () may fail insi
e120: 64 65 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20  de of the .  ** 
e130: 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
e140: 61 28 29 20 63 61 6c 6c 2c 20 61 73 20 74 68 65  a() call, as the
e150: 20 54 68 72 65 61 64 44 61 74 61 20 73 74 72 75   ThreadData stru
e160: 63 74 75 72 65 20 6d 75 73 74 20 68 61 76 65 20  cture must have 
e170: 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62 65 65  already.  ** bee
e180: 6e 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  n allocated for 
e190: 70 54 73 64 72 6f 2d 3e 75 73 65 53 68 61 72 65  pTsdro->useShare
e1a0: 64 44 61 74 61 20 74 6f 20 62 65 20 6e 6f 6e 2d  dData to be non-
e1b0: 7a 65 72 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  zero..  */.  if(
e1c0: 20 70 54 73 64 72 6f 2d 3e 75 73 65 53 68 61 72   pTsdro->useShar
e1d0: 65 64 44 61 74 61 20 26 26 20 7a 46 69 6c 65 6e  edData && zFilen
e1e0: 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20  ame && !isMemdb 
e1f0: 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 4e 65 78  ){.    pBt->pNex
e200: 74 20 3d 20 70 54 73 64 72 6f 2d 3e 70 42 74 72  t = pTsdro->pBtr
e210: 65 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  ee;.    sqlite3T
e220: 68 72 65 61 64 44 61 74 61 28 29 2d 3e 70 42 74  hreadData()->pBt
e230: 72 65 65 20 3d 20 70 42 74 3b 0a 20 20 7d 0a 23  ree = pBt;.  }.#
e240: 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e 6e 52 65  endif.  pBt->nRe
e250: 66 20 3d 20 31 3b 0a 20 20 2a 70 70 42 74 72 65  f = 1;.  *ppBtre
e260: 65 20 3d 20 70 3b 0a 20 20 72 65 74 75 72 6e 20  e = p;.  return 
e270: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
e280: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65  .** Close an ope
e290: 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69  n database and i
e2a0: 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 75  nvalidate all cu
e2b0: 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rsors..*/.int sq
e2c0: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
e2d0: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
e2e0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
e2f0: 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20  pBt;.  BtCursor 
e300: 2a 70 43 75 72 3b 0a 0a 23 69 66 6e 64 65 66 20  *pCur;..#ifndef 
e310: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
e320: 45 44 5f 43 41 43 48 45 0a 20 20 54 68 72 65 61  ED_CACHE.  Threa
e330: 64 44 61 74 61 20 2a 70 54 73 64 3b 0a 23 65 6e  dData *pTsd;.#en
e340: 64 69 66 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20  dif..  /* Close 
e350: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
e360: 65 64 20 76 69 61 20 74 68 69 73 20 68 61 6e 64  ed via this hand
e370: 6c 65 2e 20 20 2a 2f 0a 20 20 70 43 75 72 20 3d  le.  */.  pCur =
e380: 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20   pBt->pCursor;. 
e390: 20 77 68 69 6c 65 28 20 70 43 75 72 20 29 7b 0a   while( pCur ){.
e3a0: 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70 54      BtCursor *pT
e3b0: 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20 20 70  mp = pCur;.    p
e3c0: 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  Cur = pCur->pNex
e3d0: 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d 70 2d  t;.    if( pTmp-
e3e0: 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20  >pBtree==p ){.  
e3f0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
e400: 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54 6d 70  CloseCursor(pTmp
e410: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
e420: 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20  /* Rollback any 
e430: 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
e440: 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68 65 20  on and free the 
e450: 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75 72 65  handle structure
e460: 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20  ..  ** The call 
e470: 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  to sqlite3BtreeR
e480: 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70 73 20  ollback() drops 
e490: 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20  any table-locks 
e4a0: 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68 69  held by.  ** thi
e4b0: 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20  s handle..  */. 
e4c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
e4d0: 6c 62 61 63 6b 28 70 29 3b 0a 20 20 73 71 6c 69  lback(p);.  sqli
e4e0: 74 65 46 72 65 65 28 70 29 3b 0a 0a 23 69 66 6e  teFree(p);..#ifn
e4f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e500: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
e510: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 73  * If there are s
e520: 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74  till other outst
e530: 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
e540: 73 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d  s to the shared-
e550: 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63  btree.  ** struc
e560: 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77  ture, return now
e570: 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20  . The remainder 
e580: 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  of this procedur
e590: 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75  e cleans .  ** u
e5a0: 70 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  p the shared-btr
e5b0: 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ee..  */.  asser
e5c0: 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29  t( pBt->nRef>0 )
e5d0: 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b  ;.  pBt->nRef--;
e5e0: 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66  .  if( pBt->nRef
e5f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
e600: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
e610: 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73   /* Remove the s
e620: 68 61 72 65 64 2d 62 74 72 65 65 20 66 72 6f 6d  hared-btree from
e630: 20 74 68 65 20 74 68 72 65 61 64 20 77 69 64 65   the thread wide
e640: 20 6c 69 73 74 2e 20 43 61 6c 6c 20 0a 20 20 2a   list. Call .  *
e650: 2a 20 54 68 72 65 61 64 44 61 74 61 52 65 61 64  * ThreadDataRead
e660: 4f 6e 6c 79 28 29 20 61 6e 64 20 74 68 65 6e 20  Only() and then 
e670: 63 61 73 74 20 61 77 61 79 20 74 68 65 20 63 6f  cast away the co
e680: 6e 73 74 20 70 72 6f 70 65 72 74 79 20 6f 66 20  nst property of 
e690: 74 68 65 20 0a 20 20 2a 2a 20 70 6f 69 6e 74 65  the .  ** pointe
e6a0: 72 20 74 6f 20 61 76 6f 69 64 20 61 6c 6c 6f 63  r to avoid alloc
e6b0: 61 74 69 6e 67 20 74 68 72 65 61 64 20 64 61 74  ating thread dat
e6c0: 61 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 72  a if it is not r
e6d0: 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 0a  eally required..
e6e0: 20 20 2a 2f 0a 20 20 70 54 73 64 20 3d 20 28 54    */.  pTsd = (T
e6f0: 68 72 65 61 64 44 61 74 61 20 2a 29 73 71 6c 69  hreadData *)sqli
e700: 74 65 33 54 68 72 65 61 64 44 61 74 61 52 65 61  te3ThreadDataRea
e710: 64 4f 6e 6c 79 28 29 3b 0a 20 20 69 66 28 20 70  dOnly();.  if( p
e720: 54 73 64 2d 3e 70 42 74 72 65 65 3d 3d 70 42 74  Tsd->pBtree==pBt
e730: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
e740: 70 54 73 64 3d 3d 73 71 6c 69 74 65 33 54 68 72  pTsd==sqlite3Thr
e750: 65 61 64 44 61 74 61 28 29 20 29 3b 0a 20 20 20  eadData() );.   
e760: 20 70 54 73 64 2d 3e 70 42 74 72 65 65 20 3d 20   pTsd->pBtree = 
e770: 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65  pBt->pNext;.  }e
e780: 6c 73 65 7b 0a 20 20 20 20 42 74 53 68 61 72 65  lse{.    BtShare
e790: 64 20 2a 70 50 72 65 76 3b 0a 20 20 20 20 66 6f  d *pPrev;.    fo
e7a0: 72 28 70 50 72 65 76 3d 70 54 73 64 2d 3e 70 42  r(pPrev=pTsd->pB
e7b0: 74 72 65 65 3b 20 70 50 72 65 76 20 26 26 20 70  tree; pPrev && p
e7c0: 50 72 65 76 2d 3e 70 4e 65 78 74 21 3d 70 42 74  Prev->pNext!=pBt
e7d0: 3b 20 70 50 72 65 76 3d 70 50 72 65 76 2d 3e 70  ; pPrev=pPrev->p
e7e0: 4e 65 78 74 29 7b 7d 0a 20 20 20 20 69 66 28 20  Next){}.    if( 
e7f0: 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 61  pPrev ){.      a
e800: 73 73 65 72 74 28 20 70 54 73 64 3d 3d 73 71 6c  ssert( pTsd==sql
e810: 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29  ite3ThreadData()
e820: 20 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76 2d   );.      pPrev-
e830: 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e  >pNext = pBt->pN
e840: 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ext;.    }.  }.#
e850: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6c 6f 73  endif..  /* Clos
e860: 65 20 74 68 65 20 70 61 67 65 72 20 61 6e 64 20  e the pager and 
e870: 66 72 65 65 20 74 68 65 20 73 68 61 72 65 64 2d  free the shared-
e880: 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
e890: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 42  */.  assert( !pB
e8a0: 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20  t->pCursor );.  
e8b0: 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
e8c0: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  e(pBt->pPager);.
e8d0: 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65 65    if( pBt->xFree
e8e0: 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e 70  Schema && pBt->p
e8f0: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 70 42  Schema ){.    pB
e900: 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 28 70  t->xFreeSchema(p
e910: 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Bt->pSchema);.  
e920: 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
e930: 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Bt->pSchema);.  
e940: 73 71 6c 69 74 65 46 72 65 65 28 70 42 74 29 3b  sqliteFree(pBt);
e950: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
e960: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  _OK;.}../*.** Ch
e970: 61 6e 67 65 20 74 68 65 20 62 75 73 79 20 68 61  ange the busy ha
e980: 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 66  ndler callback f
e990: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  unction..*/.int 
e9a0: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 42  sqlite3BtreeSetB
e9b0: 75 73 79 48 61 6e 64 6c 65 72 28 42 74 72 65 65  usyHandler(Btree
e9c0: 20 2a 70 2c 20 42 75 73 79 48 61 6e 64 6c 65 72   *p, BusyHandler
e9d0: 20 2a 70 48 61 6e 64 6c 65 72 29 7b 0a 20 20 42   *pHandler){.  B
e9e0: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
e9f0: 2d 3e 70 42 74 3b 0a 20 20 70 42 74 2d 3e 70 42  ->pBt;.  pBt->pB
ea00: 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 70 48 61  usyHandler = pHa
ea10: 6e 64 6c 65 72 3b 0a 20 20 73 71 6c 69 74 65 33  ndler;.  sqlite3
ea20: 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64  PagerSetBusyhand
ea30: 6c 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ler(pBt->pPager,
ea40: 20 70 48 61 6e 64 6c 65 72 29 3b 0a 20 20 72 65   pHandler);.  re
ea50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ea60: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
ea70: 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65  the limit on the
ea80: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
ea90: 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65 20   allowed in the 
eaa0: 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  cache..**.** The
eab0: 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
eac0: 6f 66 20 63 61 63 68 65 20 70 61 67 65 73 20 69  of cache pages i
ead0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 61 62 73  s set to the abs
eae0: 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20 6f  olute.** value o
eaf0: 66 20 6d 78 50 61 67 65 2e 20 20 49 66 20 6d 78  f mxPage.  If mx
eb00: 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76 65  Page is negative
eb10: 2c 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c  , the pager will
eb20: 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61 73 79 6e  .** operate asyn
eb30: 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74 20  chronously - it 
eb40: 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74 6f  will not stop to
eb50: 20 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a 20   do fsync()s.** 
eb60: 74 6f 20 69 6e 73 75 72 65 20 64 61 74 61 20 69  to insure data i
eb70: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
eb80: 20 64 69 73 6b 20 73 75 72 66 61 63 65 20 62 65   disk surface be
eb90: 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69  fore.** continui
eba0: 6e 67 2e 20 20 54 72 61 6e 73 61 63 74 69 6f 6e  ng.  Transaction
ebb0: 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66 20  s still work if 
ebc0: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f  synchronous is o
ebd0: 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64  ff,.** and the d
ebe0: 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62  atabase cannot b
ebf0: 65 20 63 6f 72 72 75 70 74 65 64 20 69 66 20 74  e corrupted if t
ec00: 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 63  his program.** c
ec10: 72 61 73 68 65 73 2e 20 20 42 75 74 20 69 66 20  rashes.  But if 
ec20: 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
ec30: 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72 20  stem crashes or 
ec40: 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 61  there is.** an a
ec50: 62 72 75 70 74 20 70 6f 77 65 72 20 66 61 69 6c  brupt power fail
ec60: 75 72 65 20 77 68 65 6e 20 73 79 6e 63 68 72 6f  ure when synchro
ec70: 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20 74 68 65  nous is off, the
ec80: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 75   database.** cou
ec90: 6c 64 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e  ld be left in an
eca0: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e   inconsistent an
ecb0: 64 20 75 6e 72 65 63 6f 76 65 72 61 62 6c 65 20  d unrecoverable 
ecc0: 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68 72  state..** Synchr
ecd0: 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79 20 64  onous is on by d
ece0: 65 66 61 75 6c 74 20 73 6f 20 64 61 74 61 62 61  efault so databa
ecf0: 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73  se corruption is
ed00: 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79   not.** normally
ed10: 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74   a worry..*/.int
ed20: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
ed30: 43 61 63 68 65 53 69 7a 65 28 42 74 72 65 65 20  CacheSize(Btree 
ed40: 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  *p, int mxPage){
ed50: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
ed60: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
ed70: 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
ed80: 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
ed90: 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 72 65  r, mxPage);.  re
eda0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
edb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
edc0: 74 68 65 20 77 61 79 20 64 61 74 61 20 69 73 20  the way data is 
edd0: 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 69  synced to disk i
ede0: 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72 65  n order to incre
edf0: 61 73 65 20 6f 72 20 64 65 63 72 65 61 73 65 0a  ase or decrease.
ee00: 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65 20  ** how well the 
ee10: 64 61 74 61 62 61 73 65 20 72 65 73 69 73 74 73  database resists
ee20: 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f   damage due to O
ee30: 53 20 63 72 61 73 68 65 73 20 61 6e 64 20 70 6f  S crashes and po
ee40: 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e  wer.** failures.
ee50: 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68 65    Level 1 is the
ee60: 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68 72   same as asynchr
ee70: 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73 28  onous (no syncs(
ee80: 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74  ) occur and.** t
ee90: 68 65 72 65 20 69 73 20 61 20 68 69 67 68 20 70  here is a high p
eea0: 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
eeb0: 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20 69  mage)  Level 2 i
eec0: 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20  s the default.  
eed0: 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76 65  There.** is a ve
eee0: 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a  ry low but non-z
eef0: 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 20  ero probability 
ef00: 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76 65  of damage.  Leve
ef10: 6c 20 33 20 72 65 64 75 63 65 73 20 74 68 65 0a  l 3 reduces the.
ef20: 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  ** probability o
ef30: 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61 72  f damage to near
ef40: 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20 61   zero but with a
ef50: 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61 6e   write performan
ef60: 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f  ce reduction..*/
ef70: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
ef80: 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
ef90: 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  AS.int sqlite3Bt
efa0: 72 65 65 53 65 74 53 61 66 65 74 79 4c 65 76 65  reeSetSafetyLeve
efb0: 6c 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  l(Btree *p, int 
efc0: 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c 53  level, int fullS
efd0: 79 6e 63 29 7b 0a 20 20 42 74 53 68 61 72 65 64  ync){.  BtShared
efe0: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
eff0: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
f000: 74 53 61 66 65 74 79 4c 65 76 65 6c 28 70 42 74  tSafetyLevel(pBt
f010: 2d 3e 70 50 61 67 65 72 2c 20 6c 65 76 65 6c 2c  ->pPager, level,
f020: 20 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 72 65   fullSync);.  re
f030: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
f040: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
f050: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
f060: 68 65 20 67 69 76 65 6e 20 62 74 72 65 65 20 69  he given btree i
f070: 73 20 73 65 74 20 74 6f 20 73 61 66 65 74 79 20  s set to safety 
f080: 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68  level 1.  In oth
f090: 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74  er.** words, ret
f0a0: 75 72 6e 20 54 52 55 45 20 69 66 20 6e 6f 20 73  urn TRUE if no s
f0b0: 79 6e 63 28 29 20 6f 63 63 75 72 73 20 6f 6e 20  ync() occurs on 
f0c0: 74 68 65 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a  the disk files..
f0d0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
f0e0: 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28  reeSyncDisabled(
f0f0: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
f100: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
f110: 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  pBt;.  assert( p
f120: 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  Bt && pBt->pPage
f130: 72 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  r );.  return sq
f140: 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63  lite3PagerNosync
f150: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d  (pBt->pPager);.}
f160: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
f170: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
f180: 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65  _PRAGMAS) || !de
f190: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
f1a0: 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20  T_VACUUM)./*.** 
f1b0: 43 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75  Change the defau
f1c0: 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e  lt pages size an
f1d0: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
f1e0: 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70  reserved bytes p
f1f0: 65 72 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  er page..**.** T
f200: 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73  he page size mus
f210: 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  t be a power of 
f220: 32 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e  2 between 512 an
f230: 64 20 36 35 35 33 36 2e 20 20 49 66 20 74 68 65  d 65536.  If the
f240: 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75   page.** size su
f250: 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20  pplied does not 
f260: 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72  meet this constr
f270: 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61  aint then the pa
f280: 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a  ge size is not.*
f290: 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  * changed..**.**
f2a0: 20 50 61 67 65 20 73 69 7a 65 73 20 61 72 65 20   Page sizes are 
f2b0: 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62  constrained to b
f2c0: 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f  e a power of two
f2d0: 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 65 67   so that the reg
f2e0: 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  ion.** of the da
f2f0: 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65 64  tabase file used
f300: 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65   for locking (be
f310: 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49  ginning at PENDI
f320: 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20  NG_BYTE,.** the 
f330: 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  first byte past 
f340: 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79  the 1GB boundary
f350: 2c 20 30 78 34 30 30 30 30 30 30 30 29 20 6e 65  , 0x40000000) ne
f360: 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20  eds to occur.** 
f370: 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
f380: 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a   of a page..**.*
f390: 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e  * If parameter n
f3a0: 52 65 73 65 72 76 65 20 69 73 20 6c 65 73 73 20  Reserve is less 
f3b0: 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
f3c0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
f3d0: 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20  served.** bytes 
f3e0: 70 65 72 20 70 61 67 65 20 69 73 20 6c 65 66 74  per page is left
f3f0: 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69   unchanged..*/.i
f400: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
f410: 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65  etPageSize(Btree
f420: 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a   *p, int pageSiz
f430: 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29  e, int nReserve)
f440: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
f450: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66  t = p->pBt;.  if
f460: 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46  ( pBt->pageSizeF
f470: 69 78 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  ixed ){.    retu
f480: 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
f490: 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52  LY;.  }.  if( nR
f4a0: 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20  eserve<0 ){.    
f4b0: 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e  nReserve = pBt->
f4c0: 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e  pageSize - pBt->
f4d0: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a  usableSize;.  }.
f4e0: 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d    if( pageSize>=
f4f0: 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c  512 && pageSize<
f500: 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  =SQLITE_MAX_PAGE
f510: 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20  _SIZE &&.       
f520: 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70   ((pageSize-1)&p
f530: 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20  ageSize)==0 ){. 
f540: 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
f550: 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
f560: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
f570: 2d 3e 70 50 61 67 65 31 20 26 26 20 21 70 42 74  ->pPage1 && !pBt
f580: 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ->pCursor );.   
f590: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
f5a0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
f5b0: 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
f5c0: 61 67 65 72 2c 20 70 61 67 65 53 69 7a 65 29 3b  ager, pageSize);
f5d0: 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 75 73 61 62  .  }.  pBt->usab
f5e0: 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61  leSize = pBt->pa
f5f0: 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76  geSize - nReserv
f600: 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
f610: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
f620: 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  Return the curre
f630: 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67  ntly defined pag
f640: 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71  e size.*/.int sq
f650: 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
f660: 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b  eSize(Btree *p){
f670: 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74  .  return p->pBt
f680: 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 69 6e  ->pageSize;.}.in
f690: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
f6a0: 74 52 65 73 65 72 76 65 28 42 74 72 65 65 20 2a  tReserve(Btree *
f6b0: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  p){.  return p->
f6c0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
f6d0: 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  p->pBt->usableSi
f6e0: 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ze;.}.#endif /* 
f6f0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
f700: 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
f710: 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  AS) || !defined(
f720: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
f730: 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68  UM) */../*.** Ch
f740: 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76  ange the 'auto-v
f750: 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20  acuum' property 
f760: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
f770: 20 49 66 20 74 68 65 20 27 61 75 74 6f 56 61 63   If the 'autoVac
f780: 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65  uum'.** paramete
f790: 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
f7a0: 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  hen auto-vacuum 
f7b0: 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e  mode is enabled.
f7c0: 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20   If zero, it.** 
f7d0: 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65  is disabled. The
f7e0: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66   default value f
f7f0: 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  or the auto-vacu
f800: 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a  um property is .
f810: 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
f820: 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41   the SQLITE_DEFA
f830: 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d  ULT_AUTOVACUUM m
f840: 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  acro..*/.int sql
f850: 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f  ite3BtreeSetAuto
f860: 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c  Vacuum(Btree *p,
f870: 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29   int autoVacuum)
f880: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
f890: 74 20 3d 20 70 2d 3e 70 42 74 3b 3b 0a 23 69 66  t = p->pBt;;.#if
f8a0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f8b0: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74  AUTOVACUUM.  ret
f8c0: 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
f8d0: 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28  NLY;.#else.  if(
f8e0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69   pBt->pageSizeFi
f8f0: 78 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  xed ){.    retur
f900: 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
f910: 59 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 61 75  Y;.  }.  pBt->au
f920: 74 6f 56 61 63 75 75 6d 20 3d 20 28 61 75 74 6f  toVacuum = (auto
f930: 56 61 63 75 75 6d 3f 31 3a 30 29 3b 0a 20 20 72  Vacuum?1:0);.  r
f940: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
f950: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
f960: 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
f970: 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76  e of the 'auto-v
f980: 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e  acuum' property.
f990: 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   If auto-vacuum 
f9a0: 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31  is .** enabled 1
f9b0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
f9c0: 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e  herwise 0..*/.in
f9d0: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
f9e0: 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65  tAutoVacuum(Btre
f9f0: 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51  e *p){.#ifdef SQ
fa00: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
fa10: 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 30 3b  CUUM.  return 0;
fa20: 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20  .#else.  return 
fa30: 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  p->pBt->autoVacu
fa40: 75 6d 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f  um;.#endif.}.../
fa50: 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72  *.** Get a refer
fa60: 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f  ence to pPage1 o
fa70: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
fa80: 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a  ile.  This will.
fa90: 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20  ** also acquire 
faa0: 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68  a readlock on th
fab0: 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53  at file..**.** S
fac0: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
fad0: 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e  rned on success.
fae0: 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73    If the file is
faf0: 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66   not a.** well-f
fb00: 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 66  ormed database f
fb10: 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  ile, then SQLITE
fb20: 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74 75  _CORRUPT is retu
fb30: 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f  rned..** SQLITE_
fb40: 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
fb50: 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
fb60: 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c   is locked.  SQL
fb70: 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20  ITE_NOMEM.** is 
fb80: 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20 72  returned if we r
fb90: 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  un out of memory
fba0: 2e 20 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43  .  SQLITE_PROTOC
fbb0: 4f 4c 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  OL is returned.*
fbc0: 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  * if there is a 
fbd0: 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c  locking protocol
fbe0: 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 73   violation..*/.s
fbf0: 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74  tatic int lockBt
fc00: 72 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ree(BtShared *pB
fc10: 74 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 70 61  t){.  int rc, pa
fc20: 67 65 53 69 7a 65 3b 0a 20 20 4d 65 6d 50 61 67  geSize;.  MemPag
fc30: 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 66 28  e *pPage1;.  if(
fc40: 20 70 42 74 2d 3e 70 50 61 67 65 31 20 29 20 72   pBt->pPage1 ) r
fc50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
fc60: 0a 20 20 72 63 20 3d 20 67 65 74 50 61 67 65 28  .  rc = getPage(
fc70: 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c  pBt, 1, &pPage1,
fc80: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
fc90: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
fca0: 6e 20 72 63 3b 0a 20 20 0a 0a 20 20 2f 2a 20 44  n rc;.  ..  /* D
fcb0: 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20  o some checking 
fcc0: 74 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74  to help insure t
fcd0: 68 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65  he file we opene
fce0: 64 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a  d really is.  **
fcf0: 20 61 20 76 61 6c 69 64 20 64 61 74 61 62 61 73   a valid databas
fd00: 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20  e file. .  */.  
fd10: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41  rc = SQLITE_NOTA
fd20: 44 42 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  DB;.  if( sqlite
fd30: 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
fd40: 70 42 74 2d 3e 70 50 61 67 65 72 29 3e 30 20 29  pBt->pPager)>0 )
fd50: 7b 0a 20 20 20 20 75 38 20 2a 70 61 67 65 31 20  {.    u8 *page1 
fd60: 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b  = pPage1->aData;
fd70: 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  .    if( memcmp(
fd80: 70 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61  page1, zMagicHea
fd90: 64 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20  der, 16)!=0 ){. 
fda0: 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
fdb0: 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
fdc0: 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31   }.    if( page1
fdd0: 5b 31 38 5d 3e 31 20 7c 7c 20 70 61 67 65 31 5b  [18]>1 || page1[
fde0: 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 67  19]>1 ){.      g
fdf0: 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
fe00: 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
fe10: 20 70 61 67 65 53 69 7a 65 20 3d 20 67 65 74 32   pageSize = get2
fe20: 62 79 74 65 28 26 70 61 67 65 31 5b 31 36 5d 29  byte(&page1[16])
fe30: 3b 0a 20 20 20 20 69 66 28 20 28 28 70 61 67 65  ;.    if( ((page
fe40: 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65  Size-1)&pageSize
fe50: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  )!=0 ){.      go
fe60: 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
fe70: 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
fe80: 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a  assert( (pageSiz
fe90: 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20  e & 7)==0 );.   
fea0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
feb0: 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70   pageSize;.    p
fec0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
fed0: 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65   pageSize - page
fee0: 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 70  1[20];.    if( p
fef0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c 35  Bt->usableSize<5
ff00: 30 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  00 ){.      goto
ff10: 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
ff20: 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  ed;.    }.    pB
ff30: 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72 61 63 20  t->maxEmbedFrac 
ff40: 3d 20 70 61 67 65 31 5b 32 31 5d 3b 0a 20 20 20  = page1[21];.   
ff50: 20 70 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46 72   pBt->minEmbedFr
ff60: 61 63 20 3d 20 70 61 67 65 31 5b 32 32 5d 3b 0a  ac = page1[22];.
ff70: 20 20 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66      pBt->minLeaf
ff80: 46 72 61 63 20 3d 20 70 61 67 65 31 5b 32 33 5d  Frac = page1[23]
ff90: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
ffa0: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
ffb0: 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61  .    pBt->autoVa
ffc0: 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
ffd0: 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34  (&page1[36 + 4*4
ffe0: 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a  ])?1:0);.#endif.
fff0: 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63    }..  /* maxLoc
10000 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  al is the maximu
10010 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
10020 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63  oad to store loc
10030 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20  ally for.  ** a 
10040 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65  cell.  Make sure
10050 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f   it is small eno
10060 75 67 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c  ugh so that at l
10070 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20  east minFanout. 
10080 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69   ** cells can wi
10090 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61  ll fit on one pa
100a0 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61  ge.  We assume a
100b0 20 31 30 2d 62 79 74 65 20 70 61 67 65 20 68 65   10-byte page he
100c0 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64  ader..  ** Besid
100d0 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20  es the payload, 
100e0 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74  the cell must st
100f0 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d  ore:.  **     2-
10100 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20  byte pointer to 
10110 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20  the cell.  **   
10120 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70    4-byte child p
10130 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20  ointer.  **     
10140 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75  9-byte nKey valu
10150 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  e.  **     4-byt
10160 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20  e nData value.  
10170 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76  **     4-byte ov
10180 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e  erflow page poin
10190 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65  ter.  ** So a ce
101a0 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ll consists of a
101b0 20 32 2d 62 79 74 65 20 70 6f 69 6e 65 72 2c 20   2-byte poiner, 
101c0 61 20 68 65 61 64 65 72 20 77 68 69 63 68 20 69  a header which i
101d0 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a  s as much as.  *
101e0 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c  * 17 bytes long,
101f0 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66   0 to N bytes of
10200 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e   payload, and an
10210 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65   optional 4 byte
10220 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70   overflow.  ** p
10230 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a  age pointer..  *
10240 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  /.  pBt->maxLoca
10250 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65  l = (pBt->usable
10260 53 69 7a 65 2d 31 32 29 2a 70 42 74 2d 3e 6d 61  Size-12)*pBt->ma
10270 78 45 6d 62 65 64 46 72 61 63 2f 32 35 35 20 2d  xEmbedFrac/255 -
10280 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c   23;.  pBt->minL
10290 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61  ocal = (pBt->usa
102a0 62 6c 65 53 69 7a 65 2d 31 32 29 2a 70 42 74 2d  bleSize-12)*pBt-
102b0 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63 2f 32 35  >minEmbedFrac/25
102c0 35 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d  5 - 23;.  pBt->m
102d0 61 78 4c 65 61 66 20 3d 20 70 42 74 2d 3e 75 73  axLeaf = pBt->us
102e0 61 62 6c 65 53 69 7a 65 20 2d 20 33 35 3b 0a 20  ableSize - 35;. 
102f0 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20   pBt->minLeaf = 
10300 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
10310 2d 31 32 29 2a 70 42 74 2d 3e 6d 69 6e 4c 65 61  -12)*pBt->minLea
10320 66 46 72 61 63 2f 32 35 35 20 2d 20 32 33 3b 0a  fFrac/255 - 23;.
10330 20 20 69 66 28 20 70 42 74 2d 3e 6d 69 6e 4c 6f    if( pBt->minLo
10340 63 61 6c 3e 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  cal>pBt->maxLoca
10350 6c 20 7c 7c 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  l || pBt->maxLoc
10360 61 6c 3c 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f  al<0 ){.    goto
10370 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
10380 65 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ed;.  }.  assert
10390 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b  ( pBt->maxLeaf +
103a0 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53   23 <= MX_CELL_S
103b0 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42  IZE(pBt) );.  pB
103c0 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67  t->pPage1 = pPag
103d0 65 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e1;.  return SQL
103e0 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69  ITE_OK;..page1_i
103f0 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65  nit_failed:.  re
10400 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
10410 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31  );.  pBt->pPage1
10420 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
10430 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
10440 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c   routine works l
10450 69 6b 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20  ike lockBtree() 
10460 65 78 63 65 70 74 20 74 68 61 74 20 69 74 20 61  except that it a
10470 6c 73 6f 20 69 6e 76 6f 6b 65 73 20 74 68 65 0a  lso invokes the.
10480 2a 2a 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  ** busy callback
10490 20 69 66 20 74 68 65 72 65 20 69 73 20 6c 6f 63   if there is loc
104a0 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2e 0a 2a 2f  k contention..*/
104b0 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b  .static int lock
104c0 42 74 72 65 65 57 69 74 68 52 65 74 72 79 28 42  BtreeWithRetry(B
104d0 74 72 65 65 20 2a 70 52 65 66 29 7b 0a 20 20 69  tree *pRef){.  i
104e0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
104f0 4b 3b 0a 20 20 69 66 28 20 70 52 65 66 2d 3e 69  K;.  if( pRef->i
10500 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f  nTrans==TRANS_NO
10510 4e 45 20 29 7b 0a 20 20 20 20 75 38 20 69 6e 54  NE ){.    u8 inT
10520 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 52 65  ransaction = pRe
10530 66 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  f->pBt->inTransa
10540 63 74 69 6f 6e 3b 0a 20 20 20 20 62 74 72 65 65  ction;.    btree
10550 49 6e 74 65 67 72 69 74 79 28 70 52 65 66 29 3b  Integrity(pRef);
10560 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
10570 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
10580 28 70 52 65 66 2c 20 30 29 3b 0a 20 20 20 20 70  (pRef, 0);.    p
10590 52 65 66 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e  Ref->pBt->inTran
105a0 73 61 63 74 69 6f 6e 20 3d 20 69 6e 54 72 61 6e  saction = inTran
105b0 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20 70 52 65  saction;.    pRe
105c0 66 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  f->inTrans = TRA
105d0 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 69 66 28  NS_NONE;.    if(
105e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
105f0 7b 0a 20 20 20 20 20 20 70 52 65 66 2d 3e 70 42  {.      pRef->pB
10600 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d  t->nTransaction-
10610 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 74 72  -;.    }.    btr
10620 65 65 49 6e 74 65 67 72 69 74 79 28 70 52 65 66  eeIntegrity(pRef
10630 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
10640 72 63 3b 0a 7d 0a 20 20 20 20 20 20 20 0a 0a 2f  rc;.}.       ../
10650 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
10660 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
10670 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20   cursors and we 
10680 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d  are not in the m
10690 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72  iddle.** of a tr
106a0 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68  ansaction but th
106b0 65 72 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f  ere is a read lo
106c0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
106d0 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  se, then.** this
106e0 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20   routine unrefs 
106f0 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
10700 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
10710 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61  ile which .** ha
10720 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20  s the effect of 
10730 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65  releasing the re
10740 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ad lock..**.** I
10750 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
10760 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73  outstanding curs
10770 6f 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ors, this routin
10780 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  e is a no-op..**
10790 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20  .** If there is 
107a0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  a transaction in
107b0 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20   progress, this 
107c0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
107d0 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
107e0 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  id unlockBtreeIf
107f0 55 6e 75 73 65 64 28 42 74 53 68 61 72 65 64 20  Unused(BtShared 
10800 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 70 42 74  *pBt){.  if( pBt
10810 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
10820 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70  =TRANS_NONE && p
10830 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 30 20 26  Bt->pCursor==0 &
10840 26 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30  & pBt->pPage1!=0
10850 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
10860 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
10870 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3e 3d 31  (pBt->pPager)>=1
10880 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 42   ){.      if( pB
10890 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
108a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 4d  ==0 ){.        M
108b0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
108c0 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 20  pBt->pPage1;.   
108d0 20 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74       pPage->aDat
108e0 61 20 3d 20 26 28 28 75 38 2a 29 70 50 61 67 65  a = &((u8*)pPage
108f0 29 5b 2d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  )[-pBt->pageSize
10900 5d 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ];.        pPage
10910 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20  ->pBt = pBt;.   
10920 20 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f       pPage->pgno
10930 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
10940 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
10950 70 42 74 2d 3e 70 50 61 67 65 31 29 3b 0a 20 20  pBt->pPage1);.  
10960 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 50 61    }.    pBt->pPa
10970 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  ge1 = 0;.    pBt
10980 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
10990 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  }.}../*.** Creat
109a0 65 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  e a new database
109b0 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67   by initializing
109c0 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
109d0 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2e 0a  of the.** file..
109e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65  */.static int ne
109f0 77 44 61 74 61 62 61 73 65 28 42 74 53 68 61 72  wDatabase(BtShar
10a00 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50  ed *pBt){.  MemP
10a10 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69  age *pP1;.  unsi
10a20 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b  gned char *data;
10a30 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
10a40 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
10a50 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
10a60 65 72 29 3e 30 20 29 20 72 65 74 75 72 6e 20 53  er)>0 ) return S
10a70 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 31 20  QLITE_OK;.  pP1 
10a80 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20  = pBt->pPage1;. 
10a90 20 61 73 73 65 72 74 28 20 70 50 31 21 3d 30 20   assert( pP1!=0 
10aa0 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d  );.  data = pP1-
10ab0 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73  >aData;.  rc = s
10ac0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
10ad0 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  (pP1->pDbPage);.
10ae0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
10af0 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64  n rc;.  memcpy(d
10b00 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65  ata, zMagicHeade
10b10 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63  r, sizeof(zMagic
10b20 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65  Header));.  asse
10b30 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69  rt( sizeof(zMagi
10b40 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a  cHeader)==16 );.
10b50 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
10b60 5b 31 36 5d 2c 20 70 42 74 2d 3e 70 61 67 65 53  [16], pBt->pageS
10b70 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d  ize);.  data[18]
10b80 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d   = 1;.  data[19]
10b90 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 32 30 5d   = 1;.  data[20]
10ba0 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
10bb0 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   - pBt->usableSi
10bc0 7a 65 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d  ze;.  data[21] =
10bd0 20 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72   pBt->maxEmbedFr
10be0 61 63 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d  ac;.  data[22] =
10bf0 20 70 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46 72   pBt->minEmbedFr
10c00 61 63 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d  ac;.  data[23] =
10c10 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61   pBt->minLeafFra
10c20 63 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  c;.  memset(&dat
10c30 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34  a[24], 0, 100-24
10c40 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50  );.  zeroPage(pP
10c50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  1, PTF_INTKEY|PT
10c60 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44  F_LEAF|PTF_LEAFD
10c70 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 70 61  ATA );.  pBt->pa
10c80 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b  geSizeFixed = 1;
10c90 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10ca0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
10cb0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
10cc0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 70 75 74  acuum ){.    put
10cd0 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b  4byte(&data[36 +
10ce0 20 34 2a 34 5d 2c 20 31 29 3b 0a 20 20 7d 0a 23   4*4], 1);.  }.#
10cf0 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
10d00 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
10d10 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74  ** Attempt to st
10d20 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61  art a new transa
10d30 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74  ction. A write-t
10d40 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73  ransaction.** is
10d50 20 73 74 61 72 74 65 64 20 69 66 20 74 68 65 20   started if the 
10d60 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
10d70 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65  is nonzero, othe
10d80 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a  rwise a read-.**
10d90 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49   transaction.  I
10da0 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
10db0 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f  ument is 2 or mo
10dc0 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65  re and exclusive
10dd0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
10de0 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e  is started, mean
10df0 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  ing that no othe
10e00 72 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c  r process is all
10e10 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73  owed.** to acces
10e20 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  s the database. 
10e30 20 41 20 70 72 65 65 78 69 73 74 69 6e 67 20 74   A preexisting t
10e40 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e  ransaction may n
10e50 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65  ot be.** upgrade
10e60 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62  d to exclusive b
10e70 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  y calling this r
10e80 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20  outine a second 
10e90 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78  time - the.** ex
10ea0 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f  clusivity flag o
10eb0 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20  nly works for a 
10ec0 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  new transaction.
10ed0 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74  .**.** A write-t
10ee0 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
10ef0 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72  be started befor
10f00 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79  e attempting any
10f10 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20   .** changes to 
10f20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e  the database.  N
10f30 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
10f40 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a  wing routines .*
10f50 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65  * will work unle
10f60 73 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ss a transaction
10f70 20 69 73 20 73 74 61 72 74 65 64 20 66 69 72 73   is started firs
10f80 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71  t:.**.**      sq
10f90 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65  lite3BtreeCreate
10fa0 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
10fb0 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61  sqlite3BtreeCrea
10fc0 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20  teIndex().**    
10fd0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
10fe0 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20  earTable().**   
10ff0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44     sqlite3BtreeD
11000 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20  ropTable().**   
11010 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49     sqlite3BtreeI
11020 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20  nsert().**      
11030 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65  sqlite3BtreeDele
11040 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  te().**      sql
11050 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d  ite3BtreeUpdateM
11060 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61  eta().**.** If a
11070 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70  n initial attemp
11080 74 20 74 6f 20 61 63 71 75 69 72 65 20 74 68 65  t to acquire the
11090 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61   lock fails beca
110a0 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74  use of lock cont
110b0 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68  ention.** and th
110c0 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20 70  e database was p
110d0 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b  reviously unlock
110e0 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20  ed, then invoke 
110f0 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
11100 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20  .** if there is 
11110 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68 65  one.  But if the
11120 72 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  re was previousl
11130 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64  y a read-lock, d
11140 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20  o not.** invoke 
11150 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
11160 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53   - just return S
11170 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c  QLITE_BUSY.  SQL
11180 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20  ITE_BUSY is .** 
11190 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68  returned when th
111a0 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
111b0 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72   read-lock in or
111c0 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64  der to avoid a d
111d0 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53  eadlock..**.** S
111e0 75 70 70 6f 73 65 20 74 68 65 72 65 20 61 72 65  uppose there are
111f0 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41   two processes A
11200 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61   and B.  A has a
11210 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42   read lock and B
11220 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76   has.** a reserv
11230 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65  ed lock.  B trie
11240 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20  s to promote to 
11250 65 78 63 6c 75 73 69 76 65 20 62 75 74 20 69 73  exclusive but is
11260 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65   blocked because
11270 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20  .** of A's read 
11280 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74  lock.  A tries t
11290 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73  o promote to res
112a0 65 72 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f  erved but is blo
112b0 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e  cked by B..** On
112c0 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f  e or the other o
112d0 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73  f the two proces
112e0 73 65 73 20 6d 75 73 74 20 67 69 76 65 20 77 61  ses must give wa
112f0 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62  y or there can b
11300 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73  e.** no progress
11310 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20  .  By returning 
11320 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20  SQLITE_BUSY and 
11330 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65  not invoking the
11340 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a   busy callback.*
11350 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79  * when A already
11360 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b   has a read lock
11370 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41  , we encourage A
11380 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20   to give up and 
11390 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64  let B.** proceed
113a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
113b0 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28  BtreeBeginTrans(
113c0 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72  Btree *p, int wr
113d0 66 6c 61 67 29 7b 0a 20 20 42 74 53 68 61 72 65  flag){.  BtShare
113e0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
113f0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
11400 54 45 5f 4f 4b 3b 0a 0a 20 20 62 74 72 65 65 49  TE_OK;..  btreeI
11410 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
11420 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65 65 20  /* If the btree 
11430 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20  is already in a 
11440 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
11450 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73  n, or it.  ** is
11460 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65   already in a re
11470 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ad-transaction a
11480 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  nd a read-transa
11490 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65  ction.  ** is re
114a0 71 75 65 73 74 65 64 2c 20 74 68 69 73 20 69 73  quested, this is
114b0 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20   a no-op..  */. 
114c0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
114d0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20  =TRANS_WRITE || 
114e0 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41  (p->inTrans==TRA
114f0 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c  NS_READ && !wrfl
11500 61 67 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ag) ){.    retur
11510 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
11520 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61  ..  /* Write tra
11530 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f  nsactions are no
11540 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20  t possible on a 
11550 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61  read-only databa
11560 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  se */.  if( pBt-
11570 3e 72 65 61 64 4f 6e 6c 79 20 26 26 20 77 72 66  >readOnly && wrf
11580 6c 61 67 20 29 7b 0a 20 20 20 20 72 65 74 75 72  lag ){.    retur
11590 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
115a0 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  Y;.  }..  /* If 
115b0 61 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  another database
115c0 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65   handle has alre
115d0 61 64 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69  ady opened a wri
115e0 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a  te transaction .
115f0 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61    ** on this sha
11600 72 65 64 2d 62 74 72 65 65 20 73 74 72 75 63 74  red-btree struct
11610 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64  ure and a second
11620 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
11630 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65 71 75 65  on is.  ** reque
11640 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c  sted, return SQL
11650 49 54 45 5f 42 55 53 59 2e 0a 20 20 2a 2f 0a 20  ITE_BUSY..  */. 
11660 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e   if( pBt->inTran
11670 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
11680 52 49 54 45 20 26 26 20 77 72 66 6c 61 67 20 29  RITE && wrflag )
11690 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
116a0 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20  ITE_BUSY;.  }.. 
116b0 20 64 6f 20 7b 0a 20 20 20 20 69 66 28 20 70 42   do {.    if( pB
116c0 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 7b 0a  t->pPage1==0 ){.
116d0 20 20 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 42        rc = lockB
116e0 74 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20 7d  tree(pBt);.    }
116f0 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  .  .    if( rc==
11700 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66  SQLITE_OK && wrf
11710 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20  lag ){.      rc 
11720 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  = sqlite3PagerBe
11730 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 31 2d  gin(pBt->pPage1-
11740 3e 70 44 62 50 61 67 65 2c 20 77 72 66 6c 61 67  >pDbPage, wrflag
11750 3e 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  >1);.      if( r
11760 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
11770 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77          rc = new
11780 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20  Database(pBt);. 
11790 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
117a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
117b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
117c0 66 28 20 77 72 66 6c 61 67 20 29 20 70 42 74 2d  f( wrflag ) pBt-
117d0 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  >inStmt = 0;.   
117e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 6e   }else{.      un
117f0 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
11800 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  d(pBt);.    }.  
11810 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
11820 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e  TE_BUSY && pBt->
11830 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
11840 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20  RANS_NONE &&.   
11850 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 6e         sqlite3In
11860 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
11870 70 42 74 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  pBt->pBusyHandle
11880 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  r) );..  if( rc=
11890 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
118a0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
118b0 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  ==TRANS_NONE ){.
118c0 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e        pBt->nTran
118d0 73 61 63 74 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d  saction++;.    }
118e0 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
118f0 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f  = (wrflag?TRANS_
11900 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44  WRITE:TRANS_READ
11910 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  );.    if( p->in
11920 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61  Trans>pBt->inTra
11930 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  nsaction ){.    
11940 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
11950 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e  tion = p->inTran
11960 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  s;.    }.  }..  
11970 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
11980 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
11990 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
119a0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
119b0 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  M../*.** Set the
119c0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
119d0 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69  ries for all chi
119e0 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50  ldren of page pP
119f0 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a  age. Also, if.**
11a00 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20   pPage contains 
11a10 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74  cells that point
11a20 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   to overflow pag
11a30 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e  es, set the poin
11a40 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69  ter.** map entri
11a50 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  es for the overf
11a60 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77 65 6c  low pages as wel
11a70 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
11a80 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
11a90 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
11aa0 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
11ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ac0 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65         /* Counte
11ad0 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
11ae0 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20  int nCell;      
11af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b00 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
11b10 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50  cells in page pP
11b20 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  age */.  int rc 
11b30 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
11b40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
11b50 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
11b60 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
11b70 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e  pPage->pBt;.  in
11b80 74 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70  t isInitOrig = p
11b90 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20  Page->isInit;.  
11ba0 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67  Pgno pgno = pPag
11bb0 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 69 6e 69 74  e->pgno;..  init
11bc0 50 61 67 65 28 70 50 61 67 65 2c 20 30 29 3b 0a  Page(pPage, 0);.
11bd0 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d    nCell = pPage-
11be0 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69  >nCell;..  for(i
11bf0 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
11c00 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  ){.    u8 *pCell
11c10 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
11c20 65 2c 20 69 29 3b 0a 0a 20 20 20 20 72 63 20 3d  e, i);..    rc =
11c30 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
11c40 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b  r(pPage, pCell);
11c50 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
11c60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11c70 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70  goto set_child_p
11c80 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 20 20  trmaps_out;.    
11c90 7d 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  }..    if( !pPag
11ca0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
11cb0 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20   Pgno childPgno 
11cc0 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  = get4byte(pCell
11cd0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74  );.      rc = pt
11ce0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69  rmapPut(pBt, chi
11cf0 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ldPgno, PTRMAP_B
11d00 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  TREE, pgno);.   
11d10 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
11d20 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 65 74 5f  E_OK ) goto set_
11d30 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75  child_ptrmaps_ou
11d40 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
11d50 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
11d60 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69   ){.    Pgno chi
11d70 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  ldPgno = get4byt
11d80 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
11d90 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
11da0 2b 38 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  +8]);.    rc = p
11db0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68  trmapPut(pBt, ch
11dc0 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  ildPgno, PTRMAP_
11dd0 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20 20  BTREE, pgno);.  
11de0 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72  }..set_child_ptr
11df0 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67  maps_out:.  pPag
11e00 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e  e->isInit = isIn
11e10 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e  itOrig;.  return
11e20 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f   rc;.}../*.** So
11e30 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65  mewhere on pPage
11e40 2c 20 77 68 69 63 68 20 69 73 20 67 75 61 72 65  , which is guare
11e50 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20 62 74  nteed to be a bt
11e60 72 65 65 20 70 61 67 65 2c 20 6e 6f 74 20 61 6e  ree page, not an
11e70 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67   overflow.** pag
11e80 65 2c 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  e, is a pointer 
11e90 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 4d  to page iFrom. M
11ea0 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74  odify this point
11eb0 65 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  er so that it po
11ec0 69 6e 74 73 20 74 6f 0a 2a 2a 20 69 54 6f 2e 20  ints to.** iTo. 
11ed0 50 61 72 61 6d 65 74 65 72 20 65 54 79 70 65 20  Parameter eType 
11ee0 64 65 73 63 72 69 62 65 73 20 74 68 65 20 74 79  describes the ty
11ef0 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f  pe of pointer to
11f00 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73   be modified, as
11f10 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a   .** follows:.**
11f20 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45  .** PTRMAP_BTREE
11f30 3a 20 20 20 20 20 70 50 61 67 65 20 69 73 20 61  :     pPage is a
11f40 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65   btree-page. The
11f50 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
11f60 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20  at a child .**  
11f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f80 20 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a   page of pPage..
11f90 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45  **.** PTRMAP_OVE
11fa0 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73  RFLOW1: pPage is
11fb0 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54   a btree-page. T
11fc0 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  he pointer point
11fd0 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77  s at an overflow
11fe0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
11ff0 20 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74        page point
12000 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20  ed to by one of 
12010 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61  the cells on pPa
12020 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ge..**.** PTRMAP
12030 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67  _OVERFLOW2: pPag
12040 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77  e is an overflow
12050 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74  -page. The point
12060 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65  er points at the
12070 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20   next.**        
12080 20 20 20 20 20 20 20 20 20 20 20 6f 76 65 72 66             overf
12090 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
120a0 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
120b0 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f  int modifyPagePo
120c0 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70  inter(MemPage *p
120d0 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d  Page, Pgno iFrom
120e0 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65  , Pgno iTo, u8 e
120f0 54 79 70 65 29 7b 0a 20 20 69 66 28 20 65 54 79  Type){.  if( eTy
12100 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
12110 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54  LOW2 ){.    /* T
12120 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61 6c  he pointer is al
12130 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20 34  ways the first 4
12140 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 70 61   bytes of the pa
12150 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ge in this case.
12160 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74    */.    if( get
12170 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
12180 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  ta)!=iFrom ){.  
12190 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
121a0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
121b0 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79      }.    put4by
121c0 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  te(pPage->aData,
121d0 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a   iTo);.  }else{.
121e0 20 20 20 20 69 6e 74 20 69 73 49 6e 69 74 4f 72      int isInitOr
121f0 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e  ig = pPage->isIn
12200 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  it;.    int i;. 
12210 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20     int nCell;.. 
12220 20 20 20 69 6e 69 74 50 61 67 65 28 70 50 61 67     initPage(pPag
12230 65 2c 20 30 29 3b 0a 20 20 20 20 6e 43 65 6c 6c  e, 0);.    nCell
12240 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
12250 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ..    for(i=0; i
12260 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
12270 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20      u8 *pCell = 
12280 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
12290 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54  i);.      if( eT
122a0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
122b0 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20  FLOW1 ){.       
122c0 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
122d0 20 20 20 20 20 20 20 20 70 61 72 73 65 43 65 6c          parseCel
122e0 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
122f0 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20  l, &info);.     
12300 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65     if( info.iOve
12310 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  rflow ){.       
12320 20 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65     if( iFrom==ge
12330 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
12340 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 20 29  fo.iOverflow]) )
12350 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  {.            pu
12360 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
12370 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69  fo.iOverflow], i
12380 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  To);.           
12390 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
123a0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
123b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
123c0 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28     if( get4byte(
123d0 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b  pCell)==iFrom ){
123e0 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
123f0 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b  yte(pCell, iTo);
12400 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
12410 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12420 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
12430 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b   if( i==nCell ){
12440 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
12450 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c  !=PTRMAP_BTREE |
12460 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67 65 74  | .          get
12470 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
12480 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
12490 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20  fset+8])!=iFrom 
124a0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
124b0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
124c0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  _BKPT;.      }. 
124d0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
124e0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
124f0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  e->hdrOffset+8],
12500 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20   iTo);.    }..  
12510 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
12520 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20  = isInitOrig;.  
12530 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
12540 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
12550 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61  Move the open da
12560 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50  tabase page pDbP
12570 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20  age to location 
12580 69 46 72 65 65 50 61 67 65 20 69 6e 20 74 68 65  iFreePage in the
12590 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54   .** database. T
125a0 68 65 20 70 44 62 50 61 67 65 20 72 65 66 65 72  he pDbPage refer
125b0 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c  ence remains val
125c0 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  id..*/.static in
125d0 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a  t relocatePage(.
125e0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
125f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
12600 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ree */.  MemPage
12610 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20 20   *pDbPage,      
12620 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74    /* Open page t
12630 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65  o move */.  u8 e
12640 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  Type,           
12650 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
12660 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74 72 79  map 'type' entry
12670 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a   for pDbPage */.
12680 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c    Pgno iPtrPage,
12690 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
126a0 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d  inter map 'page-
126b0 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44  no' entry for pD
126c0 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
126d0 69 46 72 65 65 50 61 67 65 20 20 20 20 20 20 20  iFreePage       
126e0 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74      /* The locat
126f0 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50  ion to move pDbP
12700 61 67 65 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 4d  age to */.){.  M
12710 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67 65  emPage *pPtrPage
12720 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20  ;   /* The page 
12730 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  that contains a 
12740 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61  pointer to pDbPa
12750 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62  ge */.  Pgno iDb
12760 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e  Page = pDbPage->
12770 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70  pgno;.  Pager *p
12780 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61  Pager = pBt->pPa
12790 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ger;.  int rc;..
127a0 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
127b0 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
127c0 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  2 || eType==PTRM
127d0 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20  AP_OVERFLOW1 || 
127e0 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54  .      eType==PT
127f0 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54  RMAP_BTREE || eT
12800 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
12810 50 41 47 45 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f  PAGE );..  /* Mo
12820 76 65 20 70 61 67 65 20 69 44 62 50 61 67 65 20  ve page iDbPage 
12830 66 72 6f 6d 20 69 74 27 73 20 63 75 72 72 65 6e  from it's curren
12840 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61  t location to pa
12850 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50  ge number iFreeP
12860 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28  age */.  TRACE((
12870 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76  "AUTOVACUUM: Mov
12880 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20 70  ing %d to free p
12890 61 67 65 20 25 64 20 28 70 74 72 20 70 61 67 65  age %d (ptr page
128a0 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c   %d type %d)\n",
128b0 20 0a 20 20 20 20 20 20 69 44 62 50 61 67 65 2c   .      iDbPage,
128c0 20 69 46 72 65 65 50 61 67 65 2c 20 69 50 74 72   iFreePage, iPtr
128d0 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20  Page, eType));. 
128e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
128f0 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65  erMovepage(pPage
12900 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50  r, pDbPage->pDbP
12910 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 29 3b  age, iFreePage);
12920 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
12930 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
12940 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62  rn rc;.  }.  pDb
12950 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72  Page->pgno = iFr
12960 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66  eePage;..  /* If
12970 20 70 44 62 50 61 67 65 20 77 61 73 20 61 20 62   pDbPage was a b
12980 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20  tree-page, then 
12990 69 74 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c  it may have chil
129a0 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63  d pages and/or c
129b0 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70  ells.  ** that p
129c0 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77  oint to overflow
129d0 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e   pages. The poin
129e0 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20  ter map entries 
129f0 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20  for all these.  
12a00 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f  ** pages need to
12a10 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a   be changed..  *
12a20 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67  *.  ** If pDbPag
12a30 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77  e is an overflow
12a40 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
12a50 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6d 61  first 4 bytes ma
12a60 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70  y store a.  ** p
12a70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73  ointer to a subs
12a80 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20  equent overflow 
12a90 70 61 67 65 2e 20 49 66 20 74 68 69 73 20 69 73  page. If this is
12aa0 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a   the case, then.
12ab0 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72    ** the pointer
12ac0 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65   map needs to be
12ad0 20 75 70 64 61 74 65 64 20 66 6f 72 20 74 68 65   updated for the
12ae0 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72   subsequent over
12af0 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  flow page..  */.
12b00 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
12b10 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79  MAP_BTREE || eTy
12b20 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
12b30 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  AGE ){.    rc = 
12b40 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
12b50 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
12b60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12b70 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
12b80 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  rc;.    }.  }els
12b90 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74  e{.    Pgno next
12ba0 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  Ovfl = get4byte(
12bb0 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b  pDbPage->aData);
12bc0 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66  .    if( nextOvf
12bd0 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  l!=0 ){.      rc
12be0 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
12bf0 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d  , nextOvfl, PTRM
12c00 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46  AP_OVERFLOW2, iF
12c10 72 65 65 50 61 67 65 29 3b 0a 20 20 20 20 20 20  reePage);.      
12c20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12c30 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
12c40 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
12c50 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
12c60 46 69 78 20 74 68 65 20 64 61 74 61 62 61 73 65  Fix the database
12c70 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65   pointer on page
12c80 20 69 50 74 72 50 61 67 65 20 74 68 61 74 20 70   iPtrPage that p
12c90 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50 61 67  ointed at iDbPag
12ca0 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69  e so.  ** that i
12cb0 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65  t points at iFre
12cc0 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20  ePage. Also fix 
12cd0 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
12ce0 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69  entry for.  ** i
12cf0 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  PtrPage..  */.  
12d00 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41  if( eType!=PTRMA
12d10 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
12d20 20 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70    rc = getPage(p
12d30 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70  Bt, iPtrPage, &p
12d40 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20  PtrPage, 0);.   
12d50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12d60 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
12d70 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
12d80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
12d90 65 72 57 72 69 74 65 28 70 50 74 72 50 61 67 65  erWrite(pPtrPage
12da0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
12db0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12dc0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
12dd0 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29  sePage(pPtrPage)
12de0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
12df0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
12e00 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e  = modifyPagePoin
12e10 74 65 72 28 70 50 74 72 50 61 67 65 2c 20 69 44  ter(pPtrPage, iD
12e20 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
12e30 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65  , eType);.    re
12e40 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61  leasePage(pPtrPa
12e50 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
12e60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12e70 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
12e80 75 74 28 70 42 74 2c 20 69 46 72 65 65 50 61 67  ut(pBt, iFreePag
12e90 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61  e, eType, iPtrPa
12ea0 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ge);.    }.  }. 
12eb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
12ec0 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
12ed0 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62  ation required b
12ee0 79 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d  y autoVacuumComm
12ef0 69 74 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20  it(). */.static 
12f00 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  int allocateBtre
12f10 65 50 61 67 65 28 42 74 53 68 61 72 65 64 20 2a  ePage(BtShared *
12f20 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67  , MemPage **, Pg
12f30 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b  no *, Pgno, u8);
12f40 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
12f50 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70  tine is called p
12f60 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50  rior to sqlite3P
12f70 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20  agerCommit when 
12f80 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  a transaction.**
12f90 20 69 73 20 63 6f 6d 6d 69 74 65 64 20 66 6f 72   is commited for
12fa0 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
12fb0 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61  database..*/.sta
12fc0 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75  tic int autoVacu
12fd0 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65  umCommit(BtShare
12fe0 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 2a 6e 54  d *pBt, Pgno *nT
12ff0 72 75 6e 63 29 7b 0a 20 20 50 61 67 65 72 20 2a  runc){.  Pager *
13000 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50  pPager = pBt->pP
13010 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 46 72  ager;.  Pgno nFr
13020 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  eeList;         
13030 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
13040 70 61 67 65 73 20 72 65 6d 61 69 6e 69 6e 67 20  pages remaining 
13050 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
13060 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 74 72 4d  . */.  int nPtrM
13070 61 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ap;             
13080 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
13090 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73  ointer-map pages
130a0 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a   deallocated */.
130b0 20 20 50 67 6e 6f 20 6f 72 69 67 53 69 7a 65 3b    Pgno origSize;
130c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
130d0 50 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  Pages in the dat
130e0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
130f0 50 67 6e 6f 20 66 69 6e 53 69 7a 65 3b 20 20 20  Pgno finSize;   
13100 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
13110 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
13120 61 73 65 20 66 69 6c 65 20 61 66 74 65 72 20 74  ase file after t
13130 72 75 6e 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  runcation */.  i
13140 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
13150 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
13160 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 38  urn code */.  u8
13170 20 65 54 79 70 65 3b 0a 20 20 69 6e 74 20 70 67   eType;.  int pg
13180 73 7a 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  sz = pBt->pageSi
13190 7a 65 3b 20 20 2f 2a 20 50 61 67 65 20 73 69 7a  ze;  /* Page siz
131a0 65 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62  e for this datab
131b0 61 73 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44  ase */.  Pgno iD
131c0 62 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  bPage;          
131d0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
131e0 61 73 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  ase page to move
131f0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
13200 44 62 4d 65 6d 50 61 67 65 20 3d 20 30 3b 20 20  DbMemPage = 0;  
13210 20 2f 2a 20 22 22 20 2a 2f 0a 20 20 50 67 6e 6f   /* "" */.  Pgno
13220 20 69 50 74 72 50 61 67 65 3b 20 20 20 20 20 20   iPtrPage;      
13230 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
13240 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
13250 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 44   a pointer to iD
13260 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
13270 69 46 72 65 65 50 61 67 65 3b 20 20 20 20 20 20  iFreePage;      
13280 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 72 65        /* The fre
13290 65 2d 6c 69 73 74 20 70 61 67 65 20 74 6f 20 6d  e-list page to m
132a0 6f 76 65 20 69 44 62 50 61 67 65 20 74 6f 20 2a  ove iDbPage to *
132b0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72  /.  MemPage *pFr
132c0 65 65 4d 65 6d 50 61 67 65 20 3d 20 30 3b 20 2f  eeMemPage = 0; /
132d0 2a 20 22 22 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  * "" */..#ifndef
132e0 20 4e 44 45 42 55 47 0a 20 20 69 6e 74 20 6e 52   NDEBUG.  int nR
132f0 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ef = sqlite3Page
13300 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72  rRefcount(pPager
13310 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  );.#endif..  ass
13320 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
13330 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 50 54  cuum );.  if( PT
13340 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
13350 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
13360 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 29 20  ecount(pPager)) 
13370 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
13380 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
13390 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67  T;.  }..  /* Fig
133a0 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
133b0 20 66 72 65 65 2d 70 61 67 65 73 20 61 72 65 20   free-pages are 
133c0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
133d0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
133e0 0a 20 20 2a 2a 20 66 72 65 65 20 70 61 67 65 73  .  ** free pages
133f0 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75  , then auto-vacu
13400 75 6d 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  um is a no-op.. 
13410 20 2a 2f 0a 20 20 6e 46 72 65 65 4c 69 73 74 20   */.  nFreeList 
13420 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d  = get4byte(&pBt-
13430 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
13440 36 5d 29 3b 0a 20 20 69 66 28 20 6e 46 72 65 65  6]);.  if( nFree
13450 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2a  List==0 ){.    *
13460 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 20 20 20 20  nTrunc = 0;.    
13470 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13480 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73  ;.  }..  /* This
13490 20 62 6c 6f 63 6b 20 66 69 67 75 72 65 73 20 6f   block figures o
134a0 75 74 20 68 6f 77 20 6d 61 6e 79 20 70 61 67 65  ut how many page
134b0 73 20 74 68 65 72 65 20 61 72 65 20 69 6e 20 74  s there are in t
134c0 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  he database.  **
134d0 20 6e 6f 77 20 28 76 61 72 69 61 62 6c 65 20 6f   now (variable o
134e0 72 69 67 53 69 7a 65 29 2c 20 61 6e 64 20 68 6f  rigSize), and ho
134f0 77 20 6d 61 6e 79 20 74 68 65 72 65 20 77 69 6c  w many there wil
13500 6c 20 62 65 20 61 66 74 65 72 20 74 68 65 0a 20  l be after the. 
13510 20 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20 28   ** truncation (
13520 76 61 72 69 61 62 6c 65 20 66 69 6e 53 69 7a 65  variable finSize
13530 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  )..  **.  ** The
13540 20 66 69 6e 61 6c 20 73 69 7a 65 20 69 73 20 74   final size is t
13550 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  he original size
13560 2c 20 6c 65 73 73 20 74 68 65 20 6e 75 6d 62 65  , less the numbe
13570 72 20 6f 66 20 66 72 65 65 20 70 61 67 65 73 0a  r of free pages.
13580 20 20 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61    ** in the data
13590 62 61 73 65 2c 20 6c 65 73 73 20 61 6e 79 20 70  base, less any p
135a0 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73  ointer-map pages
135b0 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f 20 6c 6f   that will no lo
135c0 6e 67 65 72 0a 20 20 2a 2a 20 62 65 20 72 65 71  nger.  ** be req
135d0 75 69 72 65 64 2c 20 6c 65 73 73 20 31 20 69 66  uired, less 1 if
135e0 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 62 79 74   the pending-byt
135f0 65 20 70 61 67 65 20 77 61 73 20 70 61 72 74 20  e page was part 
13600 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
13610 20 20 2a 2a 20 62 75 74 20 69 73 20 6e 6f 74 20    ** but is not 
13620 61 66 74 65 72 20 74 68 65 20 74 72 75 6e 63 61  after the trunca
13630 74 69 6f 6e 2e 0a 20 20 2a 2a 2f 0a 20 20 6f 72  tion..  **/.  or
13640 69 67 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  igSize = sqlite3
13650 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
13660 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 6f 72  Pager);.  if( or
13670 69 67 53 69 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f  igSize==PENDING_
13680 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
13690 7b 0a 20 20 20 20 6f 72 69 67 53 69 7a 65 2d 2d  {.    origSize--
136a0 3b 0a 20 20 7d 0a 20 20 6e 50 74 72 4d 61 70 20  ;.  }.  nPtrMap 
136b0 3d 20 28 6e 46 72 65 65 4c 69 73 74 2d 6f 72 69  = (nFreeList-ori
136c0 67 53 69 7a 65 2b 50 54 52 4d 41 50 5f 50 41 47  gSize+PTRMAP_PAG
136d0 45 4e 4f 28 70 42 74 2c 20 6f 72 69 67 53 69 7a  ENO(pBt, origSiz
136e0 65 29 2b 70 67 73 7a 2f 35 29 2f 28 70 67 73 7a  e)+pgsz/5)/(pgsz
136f0 2f 35 29 3b 0a 20 20 66 69 6e 53 69 7a 65 20 3d  /5);.  finSize =
13700 20 6f 72 69 67 53 69 7a 65 20 2d 20 6e 46 72 65   origSize - nFre
13710 65 4c 69 73 74 20 2d 20 6e 50 74 72 4d 61 70 3b  eList - nPtrMap;
13720 0a 20 20 69 66 28 20 6f 72 69 67 53 69 7a 65 3e  .  if( origSize>
13730 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
13740 45 28 70 42 74 29 20 26 26 20 66 69 6e 53 69 7a  E(pBt) && finSiz
13750 65 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  e<=PENDING_BYTE_
13760 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
13770 20 66 69 6e 53 69 7a 65 2d 2d 3b 0a 20 20 7d 0a   finSize--;.  }.
13780 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f    while( PTRMAP_
13790 49 53 50 41 47 45 28 70 42 74 2c 20 66 69 6e 53  ISPAGE(pBt, finS
137a0 69 7a 65 29 20 7c 7c 20 66 69 6e 53 69 7a 65 3d  ize) || finSize=
137b0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
137c0 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 66  GE(pBt) ){.    f
137d0 69 6e 53 69 7a 65 2d 2d 3b 0a 20 20 7d 0a 20 20  inSize--;.  }.  
137e0 54 52 41 43 45 28 28 22 41 55 54 4f 56 41 43 55  TRACE(("AUTOVACU
137f0 55 4d 3a 20 42 65 67 69 6e 20 28 64 62 20 73 69  UM: Begin (db si
13800 7a 65 20 25 64 2d 3e 25 64 29 5c 6e 22 2c 20 6f  ze %d->%d)\n", o
13810 72 69 67 53 69 7a 65 2c 20 66 69 6e 53 69 7a 65  rigSize, finSize
13820 29 29 3b 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62  ));..  /* Variab
13830 6c 65 20 27 66 69 6e 53 69 7a 65 27 20 77 69 6c  le 'finSize' wil
13840 6c 20 62 65 20 74 68 65 20 73 69 7a 65 20 6f 66  l be the size of
13850 20 74 68 65 20 66 69 6c 65 20 69 6e 20 70 61 67   the file in pag
13860 65 73 20 61 66 74 65 72 0a 20 20 2a 2a 20 74 68  es after.  ** th
13870 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 68 61  e auto-vacuum ha
13880 73 20 63 6f 6d 70 6c 65 74 65 64 20 28 74 68 65  s completed (the
13890 20 63 75 72 72 65 6e 74 20 66 69 6c 65 20 73 69   current file si
138a0 7a 65 20 6d 69 6e 75 73 20 74 68 65 20 6e 75 6d  ze minus the num
138b0 62 65 72 0a 20 20 2a 2a 20 6f 66 20 70 61 67 65  ber.  ** of page
138c0 73 20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c 69  s on the free li
138d0 73 74 29 2e 20 4c 6f 6f 70 20 74 68 72 6f 75 67  st). Loop throug
138e0 68 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74  h the pages that
138f0 20 6c 69 65 20 62 65 79 6f 6e 64 0a 20 20 2a 2a   lie beyond.  **
13900 20 74 68 69 73 20 6d 61 72 6b 2c 20 61 6e 64 20   this mark, and 
13910 69 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20  if they are not 
13920 61 6c 72 65 61 64 79 20 6f 6e 20 74 68 65 20 66  already on the f
13930 72 65 65 20 6c 69 73 74 2c 20 6d 6f 76 65 20 74  ree list, move t
13940 68 65 6d 0a 20 20 2a 2a 20 74 6f 20 61 20 66 72  hem.  ** to a fr
13950 65 65 20 70 61 67 65 20 65 61 72 6c 69 65 72 20  ee page earlier 
13960 69 6e 20 74 68 65 20 66 69 6c 65 20 28 73 6f 6d  in the file (som
13970 65 77 68 65 72 65 20 62 65 66 6f 72 65 20 66 69  ewhere before fi
13980 6e 53 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 66  nSize)..  */.  f
13990 6f 72 28 20 69 44 62 50 61 67 65 3d 66 69 6e 53  or( iDbPage=finS
139a0 69 7a 65 2b 31 3b 20 69 44 62 50 61 67 65 3c 3d  ize+1; iDbPage<=
139b0 6f 72 69 67 53 69 7a 65 3b 20 69 44 62 50 61 67  origSize; iDbPag
139c0 65 2b 2b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  e++ ){.    /* If
139d0 20 69 44 62 50 61 67 65 20 69 73 20 61 20 70 6f   iDbPage is a po
139e0 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 2c 20  inter map page, 
139f0 6f 72 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 62  or the pending-b
13a00 79 74 65 20 70 61 67 65 2c 20 73 6b 69 70 20 69  yte page, skip i
13a10 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 50 54  t. */.    if( PT
13a20 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
13a30 20 69 44 62 50 61 67 65 29 20 7c 7c 20 69 44 62   iDbPage) || iDb
13a40 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Page==PENDING_BY
13a50 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
13a60 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
13a70 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20      }..    rc = 
13a80 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69  ptrmapGet(pBt, i
13a90 44 62 50 61 67 65 2c 20 26 65 54 79 70 65 2c 20  DbPage, &eType, 
13aa0 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  &iPtrPage);.    
13ab0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
13ac0 4b 20 29 20 67 6f 74 6f 20 61 75 74 6f 76 61 63  K ) goto autovac
13ad0 75 75 6d 5f 6f 75 74 3b 0a 20 20 20 20 69 66 28  uum_out;.    if(
13ae0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
13af0 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 20  OOTPAGE ){.     
13b00 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
13b10 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
13b20 20 67 6f 74 6f 20 61 75 74 6f 76 61 63 75 75 6d   goto autovacuum
13b30 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _out;.    }..   
13b40 20 2f 2a 20 49 66 20 69 44 62 50 61 67 65 20 69   /* If iDbPage i
13b50 73 20 66 72 65 65 2c 20 64 6f 20 6e 6f 74 20 73  s free, do not s
13b60 77 61 70 20 69 74 2e 20 20 2a 2f 0a 20 20 20 20  wap it.  */.    
13b70 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
13b80 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20  P_FREEPAGE ){.  
13b90 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
13ba0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 67 65 74    }.    rc = get
13bb0 50 61 67 65 28 70 42 74 2c 20 69 44 62 50 61 67  Page(pBt, iDbPag
13bc0 65 2c 20 26 70 44 62 4d 65 6d 50 61 67 65 2c 20  e, &pDbMemPage, 
13bd0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
13be0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
13bf0 20 61 75 74 6f 76 61 63 75 75 6d 5f 6f 75 74 3b   autovacuum_out;
13c00 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68  ..    /* Find th
13c10 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
13c20 68 65 20 66 72 65 65 2d 6c 69 73 74 20 74 68 61  he free-list tha
13c30 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
13c40 20 61 74 20 74 68 65 20 65 6e 64 20 0a 20 20 20   at the end .   
13c50 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 2e   ** of the file.
13c60 20 41 20 70 61 67 65 20 63 61 6e 20 62 65 20 70   A page can be p
13c70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72  ulled off the fr
13c80 65 65 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68  ee list using th
13c90 65 20 0a 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61  e .    ** alloca
13ca0 74 65 42 74 72 65 65 50 61 67 65 28 29 20 72 6f  teBtreePage() ro
13cb0 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  utine..    */.  
13cc0 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20    do{.      if( 
13cd0 70 46 72 65 65 4d 65 6d 50 61 67 65 20 29 7b 0a  pFreeMemPage ){.
13ce0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
13cf0 61 67 65 28 70 46 72 65 65 4d 65 6d 50 61 67 65  age(pFreeMemPage
13d00 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72 65 65  );.        pFree
13d10 4d 65 6d 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  MemPage = 0;.   
13d20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
13d30 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
13d40 65 28 70 42 74 2c 20 26 70 46 72 65 65 4d 65 6d  e(pBt, &pFreeMem
13d50 50 61 67 65 2c 20 26 69 46 72 65 65 50 61 67 65  Page, &iFreePage
13d60 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 0, 0);.      i
13d70 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
13d80 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
13d90 61 73 65 50 61 67 65 28 70 44 62 4d 65 6d 50 61  asePage(pDbMemPa
13da0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  ge);.        got
13db0 6f 20 61 75 74 6f 76 61 63 75 75 6d 5f 6f 75 74  o autovacuum_out
13dc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13dd0 61 73 73 65 72 74 28 20 69 46 72 65 65 50 61 67  assert( iFreePag
13de0 65 3c 3d 6f 72 69 67 53 69 7a 65 20 29 3b 0a 20  e<=origSize );. 
13df0 20 20 20 7d 77 68 69 6c 65 28 20 69 46 72 65 65     }while( iFree
13e00 50 61 67 65 3e 66 69 6e 53 69 7a 65 20 29 3b 0a  Page>finSize );.
13e10 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
13e20 70 46 72 65 65 4d 65 6d 50 61 67 65 29 3b 0a 20  pFreeMemPage);. 
13e30 20 20 20 70 46 72 65 65 4d 65 6d 50 61 67 65 20     pFreeMemPage 
13e40 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6c  = 0;..    /* Rel
13e50 6f 63 61 74 65 20 74 68 65 20 70 61 67 65 20 69  ocate the page i
13e60 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20  nto the body of 
13e70 74 68 65 20 66 69 6c 65 2e 20 4e 6f 74 65 20 74  the file. Note t
13e80 68 61 74 20 61 6c 74 68 6f 75 67 68 20 74 68 65  hat although the
13e90 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 68 61   .    ** page ha
13ea0 73 20 6d 6f 76 65 64 20 77 69 74 68 69 6e 20 74  s moved within t
13eb0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
13ec0 2c 20 74 68 65 20 70 44 62 4d 65 6d 50 61 67 65  , the pDbMemPage
13ed0 20 70 6f 69 6e 74 65 72 20 0a 20 20 20 20 2a 2a   pointer .    **
13ee0 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 20   remains valid. 
13ef0 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
13f00 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61  this function ca
13f10 6e 20 72 75 6e 20 77 69 74 68 6f 75 74 0a 20 20  n run without.  
13f20 20 20 2a 2a 20 69 6e 76 61 6c 69 64 61 74 69 6e    ** invalidatin
13f30 67 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  g cursors open o
13f40 6e 20 74 68 65 20 62 74 72 65 65 2e 20 54 68 69  n the btree. Thi
13f50 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69  s is important i
13f60 6e 20 0a 20 20 20 20 2a 2a 20 73 68 61 72 65 64  n .    ** shared
13f70 2d 63 61 63 68 65 20 6d 6f 64 65 2e 0a 20 20 20  -cache mode..   
13f80 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 6c   */.    rc = rel
13f90 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70  ocatePage(pBt, p
13fa0 44 62 4d 65 6d 50 61 67 65 2c 20 65 54 79 70 65  DbMemPage, eType
13fb0 2c 20 69 50 74 72 50 61 67 65 2c 20 69 46 72 65  , iPtrPage, iFre
13fc0 65 50 61 67 65 29 3b 0a 20 20 20 20 72 65 6c 65  ePage);.    rele
13fd0 61 73 65 50 61 67 65 28 70 44 62 4d 65 6d 50 61  asePage(pDbMemPa
13fe0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
13ff0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
14000 6f 20 61 75 74 6f 76 61 63 75 75 6d 5f 6f 75 74  o autovacuum_out
14010 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
14020 65 6e 74 69 72 65 20 66 72 65 65 2d 6c 69 73 74  entire free-list
14030 20 68 61 73 20 62 65 65 6e 20 73 77 61 70 70 65   has been swappe
14040 64 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  d to the end of 
14050 74 68 65 20 66 69 6c 65 2e 20 53 6f 0a 20 20 2a  the file. So.  *
14060 2a 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 64  * truncate the d
14070 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
14080 66 69 6e 53 69 7a 65 20 70 61 67 65 73 20 61 6e  finSize pages an
14090 64 20 63 6f 6e 73 69 64 65 72 20 74 68 65 0a 20  d consider the. 
140a0 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 65 6d   ** free-list em
140b0 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  pty..  */.  rc =
140c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
140d0 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
140e0 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
140f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
14100 67 6f 74 6f 20 61 75 74 6f 76 61 63 75 75 6d 5f  goto autovacuum_
14110 6f 75 74 3b 0a 20 20 70 75 74 34 62 79 74 65 28  out;.  put4byte(
14120 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
14130 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 70  ata[32], 0);.  p
14140 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
14150 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
14160 20 30 29 3b 0a 20 20 2a 6e 54 72 75 6e 63 20 3d   0);.  *nTrunc =
14170 20 66 69 6e 53 69 7a 65 3b 0a 20 20 61 73 73 65   finSize;.  asse
14180 72 74 28 20 66 69 6e 53 69 7a 65 21 3d 50 45 4e  rt( finSize!=PEN
14190 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
141a0 42 74 29 20 29 3b 0a 0a 61 75 74 6f 76 61 63 75  Bt) );..autovacu
141b0 75 6d 5f 6f 75 74 3a 0a 20 20 61 73 73 65 72 74  um_out:.  assert
141c0 28 20 6e 52 65 66 3d 3d 73 71 6c 69 74 65 33 50  ( nRef==sqlite3P
141d0 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61  agerRefcount(pPa
141e0 67 65 72 29 20 29 3b 0a 20 20 69 66 28 20 72 63  ger) );.  if( rc
141f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
14200 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
14210 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
14220 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
14230 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
14240 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  * Commit the tra
14250 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74  nsaction current
14260 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a  ly in progress..
14270 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20  **.** This will 
14280 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74  release the writ
14290 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
142a0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
142b0 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
142c0 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c   active cursors,
142d0 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65   it also release
142e0 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  s the read lock.
142f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
14300 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65  treeCommit(Btree
14310 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
14320 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
14330 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
14340 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  y(p);..  /* If t
14350 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20  he handle has a 
14360 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
14370 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74  n open, commit t
14380 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 73  he shared-btrees
14390 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69   .  ** transacti
143a0 6f 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20 73  on and set the s
143b0 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54  hared state to T
143c0 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a  RANS_READ..  */.
143d0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
143e0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
143f0 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
14400 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
14410 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
14420 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20  NS_WRITE );.    
14430 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72  assert( pBt->nTr
14440 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20  ansaction>0 );. 
14450 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
14460 61 67 65 72 43 6f 6d 6d 69 74 28 70 42 74 2d 3e  agerCommit(pBt->
14470 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
14480 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14490 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
144a0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74  c;.    }.    pBt
144b0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
144c0 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
144d0 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20    pBt->inStmt = 
144e0 30 3b 0a 20 20 7d 0a 20 20 75 6e 6c 6f 63 6b 41  0;.  }.  unlockA
144f0 6c 6c 54 61 62 6c 65 73 28 70 29 3b 0a 0a 20 20  llTables(p);..  
14500 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65  /* If the handle
14510 20 68 61 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66   has any kind of
14520 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
14530 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65  n, decrement the
14540 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a   transaction.  *
14550 2a 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73  * count of the s
14560 68 61 72 65 64 20 62 74 72 65 65 2e 20 49 66 20  hared btree. If 
14570 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
14580 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 30 2c  count reaches 0,
14590 20 73 65 74 0a 20 20 2a 2a 20 74 68 65 20 73 68   set.  ** the sh
145a0 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52  ared state to TR
145b0 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e  ANS_NONE. The un
145c0 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
145d0 64 28 29 20 63 61 6c 6c 20 62 65 6c 6f 77 0a 20  d() call below. 
145e0 20 2a 2a 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20   ** will unlock 
145f0 74 68 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a  the pager..  */.
14600 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
14610 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  !=TRANS_NONE ){.
14620 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61      pBt->nTransa
14630 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 69 66 28  ction--;.    if(
14640 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61   0==pBt->nTransa
14650 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70  ction ){.      p
14660 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
14670 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  n = TRANS_NONE;.
14680 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
14690 53 65 74 20 74 68 65 20 68 61 6e 64 6c 65 73 20  Set the handles 
146a0 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
146b0 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41  ion state to TRA
146c0 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f  NS_NONE and unlo
146d0 63 6b 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  ck.  ** the page
146e0 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63  r if this call c
146f0 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72  losed the only r
14700 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
14710 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  nsaction..  */. 
14720 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
14730 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 75 6e 6c 6f  ANS_NONE;.  unlo
14740 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
14750 70 42 74 29 3b 0a 0a 20 20 62 74 72 65 65 49 6e  pBt);..  btreeIn
14760 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 72 65  tegrity(p);.  re
14770 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14780 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  }..#ifndef NDEBU
14790 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  G./*.** Return t
147a0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 77 72 69  he number of wri
147b0 74 65 2d 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  te-cursors open 
147c0 6f 6e 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20  on this handle. 
147d0 54 68 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a  This is for use.
147e0 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 65  ** in assert() e
147f0 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69  xpressions, so i
14800 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c  t is only compil
14810 65 64 20 69 66 20 4e 44 45 42 55 47 20 69 73 20  ed if NDEBUG is 
14820 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a  not.** defined..
14830 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
14840 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73 28  untWriteCursors(
14850 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
14860 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
14870 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20  ;.  int r = 0;. 
14880 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70   for(pCur=pBt->p
14890 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43  Cursor; pCur; pC
148a0 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b  ur=pCur->pNext){
148b0 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 77  .    if( pCur->w
148c0 72 46 6c 61 67 20 29 20 72 2b 2b 3b 20 0a 20 20  rFlag ) r++; .  
148d0 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a  }.  return r;.}.
148e0 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
148f0 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
14900 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
14910 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20  TE_DEBUG)./*.** 
14920 50 72 69 6e 74 20 64 65 62 75 67 67 69 6e 67 20  Print debugging 
14930 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
14940 74 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 74 6f  t all cursors to
14950 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75 74   standard output
14960 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
14970 33 42 74 72 65 65 43 75 72 73 6f 72 4c 69 73 74  3BtreeCursorList
14980 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
14990 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20  Cursor *pCur;.  
149a0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
149b0 70 2d 3e 70 42 74 3b 0a 20 20 66 6f 72 28 70 43  p->pBt;.  for(pC
149c0 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  ur=pBt->pCursor;
149d0 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72   pCur; pCur=pCur
149e0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 4d 65  ->pNext){.    Me
149f0 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
14a00 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20  Cur->pPage;.    
14a10 63 68 61 72 20 2a 7a 4d 6f 64 65 20 3d 20 70 43  char *zMode = pC
14a20 75 72 2d 3e 77 72 46 6c 61 67 20 3f 20 22 72 77  ur->wrFlag ? "rw
14a30 22 20 3a 20 22 72 6f 22 3b 0a 20 20 20 20 73 71  " : "ro";.    sq
14a40 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
14a50 28 22 43 55 52 53 4f 52 20 25 70 20 72 6f 6f 74  ("CURSOR %p root
14a60 65 64 20 61 74 20 25 34 64 28 25 73 29 20 63 75  ed at %4d(%s) cu
14a70 72 72 65 6e 74 6c 79 20 61 74 20 25 64 2e 25 64  rrently at %d.%d
14a80 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 43  %s\n",.       pC
14a90 75 72 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  ur, pCur->pgnoRo
14aa0 6f 74 2c 20 7a 4d 6f 64 65 2c 0a 20 20 20 20 20  ot, zMode,.     
14ab0 20 20 70 50 61 67 65 20 3f 20 70 50 61 67 65 2d    pPage ? pPage-
14ac0 3e 70 67 6e 6f 20 3a 20 30 2c 20 70 43 75 72 2d  >pgno : 0, pCur-
14ad0 3e 69 64 78 2c 0a 20 20 20 20 20 20 20 28 70 43  >idx,.       (pC
14ae0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
14af0 4f 52 5f 56 41 4c 49 44 29 20 3f 20 22 22 20 3a  OR_VALID) ? "" :
14b00 20 22 20 65 6f 66 22 0a 20 20 20 20 29 3b 0a 20   " eof".    );. 
14b10 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
14b20 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ** Rollback the 
14b30 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70  transaction in p
14b40 72 6f 67 72 65 73 73 2e 20 20 41 6c 6c 20 63 75  rogress.  All cu
14b50 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 0a 2a 2a  rsors will be.**
14b60 20 69 6e 76 61 6c 69 64 65 64 20 62 79 20 74 68   invalided by th
14b70 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41  is operation.  A
14b80 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
14b90 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 74 68  e a cursor.** th
14ba0 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74 20 74  at was open at t
14bb0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
14bc0 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 77  this operation w
14bd0 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e  ill result.** in
14be0 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a   an error..**.**
14bf0 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61   This will relea
14c00 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  se the write loc
14c10 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
14c20 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  e file.  If ther
14c30 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69  e.** are no acti
14c40 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61  ve cursors, it a
14c50 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65  lso releases the
14c60 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69   read lock..*/.i
14c70 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  nt sqlite3BtreeR
14c80 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70  ollback(Btree *p
14c90 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
14ca0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
14cb0 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65  ->pBt;.  MemPage
14cc0 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 72 63 20   *pPage1;..  rc 
14cd0 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
14ce0 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 23 69 66  (pBt, 0, 0);.#if
14cf0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14d00 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
14d10 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
14d20 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  K ){.    /* This
14d30 20 69 73 20 61 20 68 6f 72 72 69 62 6c 65 20 73   is a horrible s
14d40 69 74 75 61 74 69 6f 6e 2e 20 41 6e 20 49 4f 20  ituation. An IO 
14d50 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f  or malloc() erro
14d60 72 20 6f 63 63 75 72 65 64 20 77 68 69 6c 73 74  r occured whilst
14d70 0a 20 20 20 20 2a 2a 20 74 72 79 69 6e 67 20 74  .    ** trying t
14d80 6f 20 73 61 76 65 20 63 75 72 73 6f 72 20 70 6f  o save cursor po
14d90 73 69 74 69 6f 6e 73 2e 20 49 66 20 74 68 69 73  sitions. If this
14da0 20 69 73 20 61 6e 20 61 75 74 6f 6d 61 74 69 63   is an automatic
14db0 20 72 6f 6c 6c 62 61 63 6b 20 28 61 73 0a 20 20   rollback (as.  
14dc0 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20    ** the result 
14dd0 6f 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c  of a constraint,
14de0 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72   malloc() failur
14df0 65 20 6f 72 20 49 4f 20 65 72 72 6f 72 29 20 74  e or IO error) t
14e00 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  hen .    ** the 
14e10 63 61 63 68 65 20 6d 61 79 20 62 65 20 69 6e 74  cache may be int
14e20 65 72 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73  ernally inconsis
14e30 74 65 6e 74 20 28 6e 6f 74 20 63 6f 6e 74 61 69  tent (not contai
14e40 6e 20 76 61 6c 69 64 20 74 72 65 65 73 29 20 73  n valid trees) s
14e50 6f 0a 20 20 20 20 2a 2a 20 77 65 20 63 61 6e 6e  o.    ** we cann
14e60 6f 74 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  ot simply return
14e70 20 74 68 65 20 65 72 72 6f 72 20 74 6f 20 74 68   the error to th
14e80 65 20 63 61 6c 6c 65 72 2e 20 49 6e 73 74 65 61  e caller. Instea
14e90 64 2c 20 61 62 6f 72 74 20 0a 20 20 20 20 2a 2a  d, abort .    **
14ea0 20 61 6c 6c 20 71 75 65 72 69 65 73 20 74 68 61   all queries tha
14eb0 74 20 6d 61 79 20 62 65 20 75 73 69 6e 67 20 61  t may be using a
14ec0 6e 79 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72  ny of the cursor
14ed0 73 20 74 68 61 74 20 66 61 69 6c 65 64 20 74 6f  s that failed to
14ee0 20 73 61 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   save..    */.  
14ef0 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 43    while( pBt->pC
14f00 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 73  ursor ){.      s
14f10 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 42 74  qlite3 *db = pBt
14f20 2d 3e 70 43 75 72 73 6f 72 2d 3e 70 42 74 72 65  ->pCursor->pBtre
14f30 65 2d 3e 70 53 71 6c 69 74 65 3b 0a 20 20 20 20  e->pSqlite;.    
14f40 20 20 69 66 28 20 64 62 20 29 7b 0a 20 20 20 20    if( db ){.    
14f50 20 20 20 20 73 71 6c 69 74 65 33 41 62 6f 72 74      sqlite3Abort
14f60 4f 74 68 65 72 41 63 74 69 76 65 56 64 62 65 73  OtherActiveVdbes
14f70 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  (db, 0);.      }
14f80 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
14f90 66 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  f.  btreeIntegri
14fa0 74 79 28 70 29 3b 0a 20 20 75 6e 6c 6f 63 6b 41  ty(p);.  unlockA
14fb0 6c 6c 54 61 62 6c 65 73 28 70 29 3b 0a 0a 20 20  llTables(p);..  
14fc0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
14fd0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
14fe0 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20     int rc2;..   
14ff0 20 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57   assert( TRANS_W
15000 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61  RITE==pBt->inTra
15010 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20  nsaction );.    
15020 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67  rc2 = sqlite3Pag
15030 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e  erRollback(pBt->
15040 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
15050 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2!=SQLITE_OK 
15060 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63  ){.      rc = rc
15070 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  2;.    }..    /*
15080 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61   The rollback ma
15090 79 20 68 61 76 65 20 64 65 73 74 72 6f 79 65 64  y have destroyed
150a0 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61   the pPage1->aDa
150b0 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20  ta value.  So.  
150c0 20 20 2a 2a 20 63 61 6c 6c 20 67 65 74 50 61 67    ** call getPag
150d0 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67  e() on page 1 ag
150e0 61 69 6e 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ain to make sure
150f0 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69   pPage1->aData i
15100 73 0a 20 20 20 20 2a 2a 20 73 65 74 20 63 6f 72  s.    ** set cor
15110 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69  rectly. */.    i
15120 66 28 20 67 65 74 50 61 67 65 28 70 42 74 2c 20  f( getPage(pBt, 
15130 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d  1, &pPage1, 0)==
15140 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15150 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
15160 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20  Page1);.    }.  
15170 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 57    assert( countW
15180 72 69 74 65 43 75 72 73 6f 72 73 28 70 42 74 29  riteCursors(pBt)
15190 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ==0 );.    pBt->
151a0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
151b0 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a  TRANS_READ;.  }.
151c0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
151d0 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s!=TRANS_NONE ){
151e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
151f0 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30  ->nTransaction>0
15200 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72   );.    pBt->nTr
15210 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20  ansaction--;.   
15220 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72   if( 0==pBt->nTr
15230 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ansaction ){.   
15240 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
15250 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f  ction = TRANS_NO
15260 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  NE;.    }.  }.. 
15270 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
15280 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 42 74 2d  ANS_NONE;.  pBt-
15290 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 75  >inStmt = 0;.  u
152a0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
152b0 65 64 28 70 42 74 29 3b 0a 0a 20 20 62 74 72 65  ed(pBt);..  btre
152c0 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20  eIntegrity(p);. 
152d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
152e0 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61  *.** Start a sta
152f0 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
15300 63 74 69 6f 6e 2e 20 20 54 68 65 20 73 75 62 74  ction.  The subt
15310 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 0a 2a  ransaction can.*
15320 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20  * can be rolled 
15330 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74  back independent
15340 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 74  ly of the main t
15350 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 59  ransaction..** Y
15360 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20 61 20  ou must start a 
15370 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f  transaction befo
15380 72 65 20 73 74 61 72 74 69 6e 67 20 61 20 73 75  re starting a su
15390 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a  btransaction..**
153a0 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74   The subtransact
153b0 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74  ion is ended aut
153c0 6f 6d 61 74 69 63 61 6c 6c 79 20 69 66 20 74 68  omatically if th
153d0 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69  e main transacti
153e0 6f 6e 0a 2a 2a 20 63 6f 6d 6d 69 74 73 20 6f 72  on.** commits or
153f0 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a   rolls back..**.
15400 2a 2a 20 4f 6e 6c 79 20 6f 6e 65 20 73 75 62 74  ** Only one subt
15410 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62  ransaction may b
15420 65 20 61 63 74 69 76 65 20 61 74 20 61 20 74 69  e active at a ti
15430 6d 65 2e 20 20 49 74 20 69 73 20 61 6e 20 65 72  me.  It is an er
15440 72 6f 72 20 74 6f 20 74 72 79 0a 2a 2a 20 74 6f  ror to try.** to
15450 20 73 74 61 72 74 20 61 20 6e 65 77 20 73 75 62   start a new sub
15460 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 61  transaction if a
15470 6e 6f 74 68 65 72 20 73 75 62 74 72 61 6e 73 61  nother subtransa
15480 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79  ction is already
15490 20 61 63 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 53   active..**.** S
154a0 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e  tatement subtran
154b0 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65  sactions are use
154c0 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64  d around individ
154d0 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ual SQL statemen
154e0 74 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63  ts.** that are c
154f0 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
15500 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54  a BEGIN...COMMIT
15510 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f   block.  If a co
15520 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f  nstraint.** erro
15530 72 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  r occurs within 
15540 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  the statement, t
15550 68 65 20 65 66 66 65 63 74 20 6f 66 20 74 68 61  he effect of tha
15560 74 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a  t one statement.
15570 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64  ** can be rolled
15580 20 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61   back without ha
15590 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  ving to rollback
155a0 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e   the entire tran
155b0 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  saction..*/.int 
155c0 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69  sqlite3BtreeBegi
155d0 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70 29 7b  nStmt(Btree *p){
155e0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
155f0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
15600 70 42 74 3b 0a 20 20 69 66 28 20 28 70 2d 3e 69  pBt;.  if( (p->i
15610 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52  nTrans!=TRANS_WR
15620 49 54 45 29 20 7c 7c 20 70 42 74 2d 3e 69 6e 53  ITE) || pBt->inS
15630 74 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  tmt ){.    retur
15640 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  n pBt->readOnly 
15650 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  ? SQLITE_READONL
15660 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  Y : SQLITE_ERROR
15670 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
15680 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
15690 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
156a0 29 3b 0a 20 20 72 63 20 3d 20 70 42 74 2d 3e 72  );.  rc = pBt->r
156b0 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45  eadOnly ? SQLITE
156c0 5f 4f 4b 20 3a 20 73 71 6c 69 74 65 33 50 61 67  _OK : sqlite3Pag
156d0 65 72 53 74 6d 74 42 65 67 69 6e 28 70 42 74 2d  erStmtBegin(pBt-
156e0 3e 70 50 61 67 65 72 29 3b 0a 20 20 70 42 74 2d  >pPager);.  pBt-
156f0 3e 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 20 20 72  >inStmt = 1;.  r
15700 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
15710 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 73  .** Commit the s
15720 74 61 74 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  tatment subtrans
15730 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79  action currently
15740 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20 49   in progress.  I
15750 66 20 6e 6f 0a 2a 2a 20 73 75 62 74 72 61 6e 73  f no.** subtrans
15760 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
15770 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  , this is a no-o
15780 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  p..*/.int sqlite
15790 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74  3BtreeCommitStmt
157a0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
157b0 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
157c0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
157d0 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 53 74 6d    if( pBt->inStm
157e0 74 20 26 26 20 21 70 42 74 2d 3e 72 65 61 64 4f  t && !pBt->readO
157f0 6e 6c 79 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nly ){.    rc = 
15800 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74  sqlite3PagerStmt
15810 43 6f 6d 6d 69 74 28 70 42 74 2d 3e 70 50 61 67  Commit(pBt->pPag
15820 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  er);.  }else{.  
15830 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
15840 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 69 6e 53  ;.  }.  pBt->inS
15850 74 6d 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  tmt = 0;.  retur
15860 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
15870 6f 6c 6c 62 61 63 6b 20 74 68 65 20 61 63 74 69  ollback the acti
15880 76 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62  ve statement sub
15890 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66  transaction.  If
158a0 20 6e 6f 20 73 75 62 74 72 61 6e 73 61 63 74 69   no subtransacti
158b0 6f 6e 0a 2a 2a 20 69 73 20 61 63 74 69 76 65 20  on.** is active 
158c0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
158d0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 41  a no-op..**.** A
158e0 6c 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20  ll cursors will 
158f0 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 62  be invalidated b
15900 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  y this operation
15910 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 0a 2a  .  Any attempt.*
15920 2a 20 74 6f 20 75 73 65 20 61 20 63 75 72 73 6f  * to use a curso
15930 72 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20  r that was open 
15940 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
15950 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74 69   of this operati
15960 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 72 65 73 75 6c  on.** will resul
15970 74 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  t in an error..*
15980 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
15990 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 28 42  eeRollbackStmt(B
159a0 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
159b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
159c0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
159d0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69  = p->pBt;.  sqli
159e0 74 65 33 4d 61 6c 6c 6f 63 44 69 73 61 6c 6c 6f  te3MallocDisallo
159f0 77 28 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  w();.  if( pBt->
15a00 69 6e 53 74 6d 74 20 26 26 20 21 70 42 74 2d 3e  inStmt && !pBt->
15a10 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
15a20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
15a30 72 53 74 6d 74 52 6f 6c 6c 62 61 63 6b 28 70 42  rStmtRollback(pB
15a40 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
15a50 61 73 73 65 72 74 28 20 63 6f 75 6e 74 57 72 69  assert( countWri
15a60 74 65 43 75 72 73 6f 72 73 28 70 42 74 29 3d 3d  teCursors(pBt)==
15a70 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  0 );.    pBt->in
15a80 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Stmt = 0;.  }.  
15a90 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 41 6c 6c  sqlite3MallocAll
15aa0 6f 77 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ow();.  return r
15ab0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61  c;.}../*.** Defa
15ac0 75 6c 74 20 6b 65 79 20 63 6f 6d 70 61 72 69 73  ult key comparis
15ad0 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62  on function to b
15ae0 65 20 75 73 65 64 20 69 66 20 6e 6f 20 63 6f 6d  e used if no com
15af0 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
15b00 0a 2a 2a 20 69 73 20 73 70 65 63 69 66 69 65 64  .** is specified
15b10 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65 33 42   on the sqlite3B
15b20 74 72 65 65 43 75 72 73 6f 72 28 29 20 63 61 6c  treeCursor() cal
15b30 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
15b40 20 64 66 6c 74 43 6f 6d 70 61 72 65 28 0a 20 20   dfltCompare(.  
15b50 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 20 20  void *NotUsed,  
15b60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
15b70 65 72 20 64 61 74 61 20 69 73 20 6e 6f 74 20 75  er data is not u
15b80 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 31 2c  sed */.  int n1,
15b90 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 31 2c   const void *p1,
15ba0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6b 65 79      /* First key
15bb0 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20   to compare */. 
15bc0 20 69 6e 74 20 6e 32 2c 20 63 6f 6e 73 74 20 76   int n2, const v
15bd0 6f 69 64 20 2a 70 32 20 20 20 20 20 2f 2a 20 53  oid *p2     /* S
15be0 65 63 6f 6e 64 20 6b 65 79 20 74 6f 20 63 6f 6d  econd key to com
15bf0 70 61 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  pare */.){.  int
15c00 20 63 3b 0a 20 20 63 20 3d 20 6d 65 6d 63 6d 70   c;.  c = memcmp
15c10 28 70 31 2c 20 70 32 2c 20 6e 31 3c 6e 32 20 3f  (p1, p2, n1<n2 ?
15c20 20 6e 31 20 3a 20 6e 32 29 3b 0a 20 20 69 66 28   n1 : n2);.  if(
15c30 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 63 20 3d   c==0 ){.    c =
15c40 20 6e 31 20 2d 20 6e 32 3b 0a 20 20 7d 0a 20 20   n1 - n2;.  }.  
15c50 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a  return c;.}../*.
15c60 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
15c70 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42  cursor for the B
15c80 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20  Tree whose root 
15c90 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a  is on the page.*
15ca0 2a 20 69 54 61 62 6c 65 2e 20 20 54 68 65 20 61  * iTable.  The a
15cb0 63 74 20 6f 66 20 61 63 71 75 69 72 69 6e 67 20  ct of acquiring 
15cc0 61 20 63 75 72 73 6f 72 20 67 65 74 73 20 61 20  a cursor gets a 
15cd0 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a  read lock on .**
15ce0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
15cf0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46  le..**.** If wrF
15d00 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65  lag==0, then the
15d10 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79   cursor can only
15d20 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61   be used for rea
15d30 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c  ding..** If wrFl
15d40 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20  ag==1, then the 
15d50 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75 73  cursor can be us
15d60 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f  ed for reading o
15d70 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67  r for.** writing
15d80 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74   if other condit
15d90 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67  ions for writing
15da0 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20   are also met.  
15db0 54 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68 65  These.** are the
15dc0 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74   conditions that
15dd0 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20   must be met in 
15de0 6f 72 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e  order for writin
15df0 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77  g to.** be allow
15e00 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68  ed:.**.** 1:  Th
15e10 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61  e cursor must ha
15e20 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77  ve been opened w
15e30 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a  ith wrFlag==1.**
15e40 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61  .** 2:  Other da
15e50 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
15e60 6e 73 20 74 68 61 74 20 73 68 61 72 65 20 74 68  ns that share th
15e70 65 20 73 61 6d 65 20 70 61 67 65 72 20 63 61 63  e same pager cac
15e80 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68  he.**     but wh
15e90 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74  ich are not in t
15ea0 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54  he READ_UNCOMMIT
15eb0 54 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f  TED state may no
15ec0 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75  t have.**     cu
15ed0 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20  rsors open with 
15ee0 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65  wrFlag==0 on the
15ef0 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74   same table.  Ot
15f00 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74  herwise.**     t
15f10 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20  he changes made 
15f20 62 79 20 74 68 69 73 20 77 72 69 74 65 20 63 75  by this write cu
15f30 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69  rsor would be vi
15f40 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20  sible to.**     
15f50 74 68 65 20 72 65 61 64 20 63 75 72 73 6f 72 73  the read cursors
15f60 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61   in the other da
15f70 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
15f80 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65  n..**.** 3:  The
15f90 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
15fa0 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20  e writable (not 
15fb0 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64  on read-only med
15fc0 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68  ia).**.** 4:  Th
15fd0 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61  ere must be an a
15fe0 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f  ctive transactio
15ff0 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63  n..**.** No chec
16000 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20  king is done to 
16010 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 70  make sure that p
16020 61 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c  age iTable reall
16030 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74  y is the.** root
16040 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65   page of a b-tre
16050 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74  e.  If it is not
16060 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
16070 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69  r acquired.** wi
16080 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72  ll not work corr
16090 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ectly..**.** The
160a0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
160b0 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6c 6f 67  tion must be log
160c0 69 63 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20  ically the same 
160d0 66 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f 72  for every cursor
160e0 0a 2a 2a 20 6f 6e 20 61 20 70 61 72 74 69 63 75  .** on a particu
160f0 6c 61 72 20 74 61 62 6c 65 2e 20 20 43 68 61 6e  lar table.  Chan
16100 67 69 6e 67 20 74 68 65 20 63 6f 6d 70 61 72 69  ging the compari
16110 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  son function wil
16120 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 69  l result.** in i
16130 6e 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69  ncorrect operati
16140 6f 6e 73 2e 20 20 49 66 20 74 68 65 20 63 6f 6d  ons.  If the com
16150 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
16160 20 69 73 20 4e 55 4c 4c 2c 20 61 0a 2a 2a 20 64   is NULL, a.** d
16170 65 66 61 75 6c 74 20 63 6f 6d 70 61 72 69 73 6f  efault compariso
16180 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  n function is us
16190 65 64 2e 20 20 54 68 65 20 63 6f 6d 70 61 72 69  ed.  The compari
161a0 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a  son function is.
161b0 2a 2a 20 61 6c 77 61 79 73 20 69 67 6e 6f 72 65  ** always ignore
161c0 64 20 66 6f 72 20 49 4e 54 4b 45 59 20 74 61 62  d for INTKEY tab
161d0 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  les..*/.int sqli
161e0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a  te3BtreeCursor(.
161f0 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
16200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16220 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
16230 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
16240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16250 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
16260 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c  oot page of tabl
16270 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
16280 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20  nt wrFlag,      
16290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
162b0 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64  to write. 0 read
162c0 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 28  -only */.  int (
162d0 2a 78 43 6d 70 29 28 76 6f 69 64 2a 2c 69 6e 74  *xCmp)(void*,int
162e0 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74  ,const void*,int
162f0 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 20 2f  ,const void*), /
16300 2a 20 4b 65 79 20 43 6f 6d 70 61 72 69 73 6f 6e  * Key Comparison
16310 20 66 75 6e 63 20 2a 2f 0a 20 20 76 6f 69 64 20   func */.  void 
16320 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20 20 20  *pArg,          
16330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16340 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
16350 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28  arg to xCompare(
16360 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  ) */.  BtCursor 
16370 2a 2a 70 70 43 75 72 20 20 20 20 20 20 20 20 20  **ppCur         
16380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16390 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20     /* Write new 
163a0 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29  cursor here */.)
163b0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
163c0 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20  Cursor *pCur;.  
163d0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
163e0 70 2d 3e 70 42 74 3b 0a 0a 20 20 2a 70 70 43 75  p->pBt;..  *ppCu
163f0 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 77 72 46  r = 0;.  if( wrF
16400 6c 61 67 20 29 7b 0a 20 20 20 20 69 66 28 20 70  lag ){.    if( p
16410 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  Bt->readOnly ){.
16420 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
16430 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
16440 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68 65 63    }.    if( chec
16450 6b 52 65 61 64 4c 6f 63 6b 73 28 70 2c 20 69 54  kReadLocks(p, iT
16460 61 62 6c 65 2c 20 30 29 20 29 7b 0a 20 20 20 20  able, 0) ){.    
16470 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16480 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 7d 0a 20 20  LOCKED;.    }.  
16490 7d 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 50  }..  if( pBt->pP
164a0 61 67 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72  age1==0 ){.    r
164b0 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 57 69 74  c = lockBtreeWit
164c0 68 52 65 74 72 79 28 70 29 3b 0a 20 20 20 20 69  hRetry(p);.    i
164d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
164e0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
164f0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   rc;.    }.  }. 
16500 20 70 43 75 72 20 3d 20 73 71 6c 69 74 65 4d 61   pCur = sqliteMa
16510 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43  lloc( sizeof(*pC
16520 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75  ur) );.  if( pCu
16530 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  r==0 ){.    rc =
16540 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
16550 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 63     goto create_c
16560 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b  ursor_exception;
16570 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70 67 6e  .  }.  pCur->pgn
16580 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54  oRoot = (Pgno)iT
16590 61 62 6c 65 3b 0a 20 20 69 66 28 20 69 54 61 62  able;.  if( iTab
165a0 6c 65 3d 3d 31 20 26 26 20 73 71 6c 69 74 65 33  le==1 && sqlite3
165b0 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
165c0 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 30 20 29  Bt->pPager)==0 )
165d0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
165e0 45 5f 45 4d 50 54 59 3b 0a 20 20 20 20 67 6f 74  E_EMPTY;.    got
165f0 6f 20 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f  o create_cursor_
16600 65 78 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20  exception;.  }. 
16610 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74   rc = getAndInit
16620 50 61 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e  Page(pBt, pCur->
16630 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d  pgnoRoot, &pCur-
16640 3e 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66  >pPage, 0);.  if
16650 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16660 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61  ){.    goto crea
16670 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74  te_cursor_except
16680 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  ion;.  }..  /* N
16690 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ow that no other
166a0 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75   errors can occu
166b0 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e  r, finish fillin
166c0 67 20 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f  g in the BtCurso
166d0 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73  r.  ** variables
166e0 2c 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f  , link the curso
166f0 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61  r into the BtSha
16700 72 65 64 20 6c 69 73 74 20 61 6e 64 20 73 65 74  red list and set
16710 20 2a 70 70 43 75 72 20 28 74 68 65 0a 20 20 2a   *ppCur (the.  *
16720 2a 20 6f 75 74 70 75 74 20 61 72 67 75 6d 65 6e  * output argumen
16730 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
16740 6f 6e 29 2e 0a 20 20 2a 2f 0a 20 20 70 43 75 72  on)..  */.  pCur
16750 2d 3e 78 43 6f 6d 70 61 72 65 20 3d 20 78 43 6d  ->xCompare = xCm
16760 70 20 3f 20 78 43 6d 70 20 3a 20 64 66 6c 74 43  p ? xCmp : dfltC
16770 6f 6d 70 61 72 65 3b 0a 20 20 70 43 75 72 2d 3e  ompare;.  pCur->
16780 70 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 70  pArg = pArg;.  p
16790 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b  Cur->pBtree = p;
167a0 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20  .  pCur->wrFlag 
167b0 3d 20 77 72 46 6c 61 67 3b 0a 20 20 70 43 75 72  = wrFlag;.  pCur
167c0 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  ->pNext = pBt->p
167d0 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70 43  Cursor;.  if( pC
167e0 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20  ur->pNext ){.   
167f0 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50   pCur->pNext->pP
16800 72 65 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d 0a  rev = pCur;.  }.
16810 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d    pBt->pCursor =
16820 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65   pCur;.  pCur->e
16830 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
16840 4e 56 41 4c 49 44 3b 0a 20 20 2a 70 70 43 75 72  NVALID;.  *ppCur
16850 20 3d 20 70 43 75 72 3b 0a 0a 20 20 72 65 74 75   = pCur;..  retu
16860 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 63 72  rn SQLITE_OK;.cr
16870 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65  eate_cursor_exce
16880 70 74 69 6f 6e 3a 0a 20 20 69 66 28 20 70 43 75  ption:.  if( pCu
16890 72 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  r ){.    release
168a0 50 61 67 65 28 70 43 75 72 2d 3e 70 50 61 67 65  Page(pCur->pPage
168b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
168c0 65 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 75  e(pCur);.  }.  u
168d0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
168e0 65 64 28 70 42 74 29 3b 0a 20 20 72 65 74 75 72  ed(pBt);.  retur
168f0 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 30 20 20  n rc;.}..#if 0  
16900 2f 2a 20 4e 6f 74 20 55 73 65 64 20 2a 2f 0a 2f  /* Not Used */./
16910 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
16920 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63 6f 6d  value of the com
16930 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
16940 20 75 73 65 64 20 62 79 20 61 20 63 75 72 73 6f   used by a curso
16950 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  r..*/.void sqlit
16960 65 33 42 74 72 65 65 53 65 74 43 6f 6d 70 61 72  e3BtreeSetCompar
16970 65 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  e(.  BtCursor *p
16980 43 75 72 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  Cur,     /* The 
16990 63 75 72 73 6f 72 20 74 6f 20 77 68 6f 73 65 20  cursor to whose 
169a0 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
169b0 69 6f 6e 20 69 73 20 63 68 61 6e 67 65 64 20 2a  ion is changed *
169c0 2f 0a 20 20 69 6e 74 28 2a 78 43 6d 70 29 28 76  /.  int(*xCmp)(v
169d0 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
169e0 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
169f0 6f 69 64 2a 29 2c 20 2f 2a 20 4e 65 77 20 63 6f  oid*), /* New co
16a00 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 20 2a 2f  mparison func */
16a10 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20  .  void *pArg   
16a20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
16a30 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6d 70  argument to xCmp
16a40 28 29 20 2a 2f 0a 29 7b 0a 20 20 70 43 75 72 2d  () */.){.  pCur-
16a50 3e 78 43 6f 6d 70 61 72 65 20 3d 20 78 43 6d 70  >xCompare = xCmp
16a60 20 3f 20 78 43 6d 70 20 3a 20 64 66 6c 74 43 6f   ? xCmp : dfltCo
16a70 6d 70 61 72 65 3b 0a 20 20 70 43 75 72 2d 3e 70  mpare;.  pCur->p
16a80 41 72 67 20 3d 20 70 41 72 67 3b 0a 7d 0a 23 65  Arg = pArg;.}.#e
16a90 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  ndif../*.** Clos
16aa0 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65  e a cursor.  The
16ab0 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
16ac0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
16ad0 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77  is released.** w
16ae0 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72  hen the last cur
16af0 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a  sor is closed..*
16b00 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
16b10 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74  eeCloseCursor(Bt
16b20 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
16b30 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
16b40 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70   pCur->pBtree->p
16b50 42 74 3b 0a 20 20 72 65 73 74 6f 72 65 4f 72 43  Bt;.  restoreOrC
16b60 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
16b70 6f 6e 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 69  on(pCur, 0);.  i
16b80 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76 20 29  f( pCur->pPrev )
16b90 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 50 72 65  {.    pCur->pPre
16ba0 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d  v->pNext = pCur-
16bb0 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b  >pNext;.  }else{
16bc0 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f  .    pBt->pCurso
16bd0 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  r = pCur->pNext;
16be0 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d  .  }.  if( pCur-
16bf0 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 43  >pNext ){.    pC
16c00 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76  ur->pNext->pPrev
16c10 20 3d 20 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a   = pCur->pPrev;.
16c20 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67    }.  releasePag
16c30 65 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a  e(pCur->pPage);.
16c40 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
16c50 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 73 71  nused(pBt);.  sq
16c60 6c 69 74 65 46 72 65 65 28 70 43 75 72 29 3b 0a  liteFree(pCur);.
16c70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16c80 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  OK;.}../*.** Mak
16c90 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63 75  e a temporary cu
16ca0 72 73 6f 72 20 62 79 20 66 69 6c 6c 69 6e 67 20  rsor by filling 
16cb0 69 6e 20 74 68 65 20 66 69 65 6c 64 73 20 6f 66  in the fields of
16cc0 20 70 54 65 6d 70 43 75 72 2e 0a 2a 2a 20 54 68   pTempCur..** Th
16cd0 65 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73  e temporary curs
16ce0 6f 72 20 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65  or is not on the
16cf0 20 63 75 72 73 6f 72 20 6c 69 73 74 20 66 6f 72   cursor list for
16d00 20 74 68 65 20 42 74 72 65 65 2e 0a 2a 2f 0a 73   the Btree..*/.s
16d10 74 61 74 69 63 20 76 6f 69 64 20 67 65 74 54 65  tatic void getTe
16d20 6d 70 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  mpCursor(BtCurso
16d30 72 20 2a 70 43 75 72 2c 20 42 74 43 75 72 73 6f  r *pCur, BtCurso
16d40 72 20 2a 70 54 65 6d 70 43 75 72 29 7b 0a 20 20  r *pTempCur){.  
16d50 6d 65 6d 63 70 79 28 70 54 65 6d 70 43 75 72 2c  memcpy(pTempCur,
16d60 20 70 43 75 72 2c 20 73 69 7a 65 6f 66 28 2a 70   pCur, sizeof(*p
16d70 43 75 72 29 29 3b 0a 20 20 70 54 65 6d 70 43 75  Cur));.  pTempCu
16d80 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  r->pNext = 0;.  
16d90 70 54 65 6d 70 43 75 72 2d 3e 70 50 72 65 76 20  pTempCur->pPrev 
16da0 3d 20 30 3b 0a 20 20 69 66 28 20 70 54 65 6d 70  = 0;.  if( pTemp
16db0 43 75 72 2d 3e 70 50 61 67 65 20 29 7b 0a 20 20  Cur->pPage ){.  
16dc0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65    sqlite3PagerRe
16dd0 66 28 70 54 65 6d 70 43 75 72 2d 3e 70 50 61 67  f(pTempCur->pPag
16de0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  e->pDbPage);.  }
16df0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
16e00 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72   a temporary cur
16e10 73 6f 72 20 73 75 63 68 20 61 73 20 77 61 73 20  sor such as was 
16e20 6d 61 64 65 20 62 79 20 74 68 65 20 43 72 65 61  made by the Crea
16e30 74 65 54 65 6d 70 6f 72 61 72 79 43 75 72 73 6f  teTemporaryCurso
16e40 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  r().** function 
16e50 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  above..*/.static
16e60 20 76 6f 69 64 20 72 65 6c 65 61 73 65 54 65 6d   void releaseTem
16e70 70 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72  pCursor(BtCursor
16e80 20 2a 70 43 75 72 29 7b 0a 20 20 69 66 28 20 70   *pCur){.  if( p
16e90 43 75 72 2d 3e 70 50 61 67 65 20 29 7b 0a 20 20  Cur->pPage ){.  
16ea0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
16eb0 72 65 66 28 70 43 75 72 2d 3e 70 50 61 67 65 2d  ref(pCur->pPage-
16ec0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d  >pDbPage);.  }.}
16ed0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
16ee0 65 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69  e the BtCursor.i
16ef0 6e 66 6f 20 66 69 65 6c 64 20 6f 66 20 74 68 65  nfo field of the
16f00 20 67 69 76 65 6e 20 63 75 72 73 6f 72 20 69 73   given cursor is
16f10 20 76 61 6c 69 64 2e 0a 2a 2a 20 49 66 20 69 74   valid..** If it
16f20 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
16f30 76 61 6c 69 64 2c 20 63 61 6c 6c 20 70 61 72 73  valid, call pars
16f40 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20  eCell() to fill 
16f50 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43  it in..**.** BtC
16f60 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20  ursor.info is a 
16f70 63 61 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66  cache of the inf
16f80 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  ormation in the 
16f90 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a  current cell..**
16fa0 20 55 73 69 6e 67 20 74 68 69 73 20 63 61 63 68   Using this cach
16fb0 65 20 72 65 64 75 63 65 73 20 74 68 65 20 6e 75  e reduces the nu
16fc0 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f  mber of calls to
16fd0 20 70 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2f   parseCell()..*/
16fe0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 74  .static void get
16ff0 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f  CellInfo(BtCurso
17000 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 66 28 20  r *pCur){.  if( 
17010 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
17020 3d 3d 30 20 29 7b 0a 20 20 20 20 70 61 72 73 65  ==0 ){.    parse
17030 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65  Cell(pCur->pPage
17040 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 26 70 43  , pCur->idx, &pC
17050 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d 65 6c  ur->info);.  }el
17060 73 65 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  se{.#ifndef NDEB
17070 55 47 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20  UG.    CellInfo 
17080 69 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74  info;.    memset
17090 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  (&info, 0, sizeo
170a0 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 70 61  f(info));.    pa
170b0 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50  rseCell(pCur->pP
170c0 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20  age, pCur->idx, 
170d0 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65  &info);.    asse
170e0 72 74 28 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f  rt( memcmp(&info
170f0 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73  , &pCur->info, s
17100 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20  izeof(info))==0 
17110 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a  );.#endif.  }.}.
17120 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a  ./*.** Set *pSiz
17130 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  e to the size of
17140 20 74 68 65 20 62 75 66 66 65 72 20 6e 65 65 64   the buffer need
17150 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 76  ed to hold the v
17160 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b  alue of.** the k
17170 65 79 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ey for the curre
17180 6e 74 20 65 6e 74 72 79 2e 20 20 49 66 20 74 68  nt entry.  If th
17190 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
171a0 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61  pointing.** to a
171b0 20 76 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70   valid entry, *p
171c0 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30  Size is set to 0
171d0 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74  . .**.** For a t
171e0 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 49 4e  able with the IN
171f0 54 4b 45 59 20 66 6c 61 67 20 73 65 74 2c 20 74  TKEY flag set, t
17200 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
17210 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69  rns the key.** i
17220 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e  tself, not the n
17230 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
17240 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e  n the key..*/.in
17250 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  t sqlite3BtreeKe
17260 79 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a  ySize(BtCursor *
17270 70 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a 65  pCur, i64 *pSize
17280 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 72 65  ){.  int rc = re
17290 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73  storeOrClearCurs
172a0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 2c  orPosition(pCur,
172b0 20 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   1);.  if( rc==S
172c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
172d0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
172e0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
172f0 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53  ALID || pCur->eS
17300 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
17310 49 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43  ID );.    if( pC
17320 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
17330 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
17340 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a      *pSize = 0;.
17350 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17360 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
17370 72 29 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65  r);.      *pSize
17380 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b   = pCur->info.nK
17390 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ey;.    }.  }.  
173a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
173b0 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74  .** Set *pSize t
173c0 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
173d0 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e  bytes of data in
173e0 20 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a   the entry the.*
173f0 2a 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74  * cursor current
17400 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41  ly points to.  A
17410 6c 77 61 79 73 20 72 65 74 75 72 6e 20 53 51 4c  lways return SQL
17420 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 61 69 6c 75  ITE_OK..** Failu
17430 72 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  re is not possib
17440 6c 65 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  le.  If the curs
17450 6f 72 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e  or is not curren
17460 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20  tly.** pointing 
17470 74 6f 20 61 6e 20 65 6e 74 72 79 20 28 77 68 69  to an entry (whi
17480 63 68 20 63 61 6e 20 68 61 70 70 65 6e 2c 20 66  ch can happen, f
17490 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a  or example, if.*
174a0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  * the database i
174b0 73 20 65 6d 70 74 79 29 20 74 68 65 6e 20 2a 70  s empty) then *p
174c0 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30  Size is set to 0
174d0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
174e0 42 74 72 65 65 44 61 74 61 53 69 7a 65 28 42 74  BtreeDataSize(Bt
174f0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
17500 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74  2 *pSize){.  int
17510 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43   rc = restoreOrC
17520 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
17530 6f 6e 28 70 43 75 72 2c 20 31 29 3b 0a 20 20 69  on(pCur, 1);.  i
17540 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
17550 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
17560 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
17570 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20  RSOR_INVALID || 
17580 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
17590 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
175a0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
175b0 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
175c0 49 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e  ID ){.      /* N
175d0 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ot pointing at a
175e0 20 76 61 6c 69 64 20 65 6e 74 72 79 20 2d 20 73   valid entry - s
175f0 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 30 2e 20  et *pSize to 0. 
17600 2a 2f 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20  */.      *pSize 
17610 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
17620 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66        getCellInf
17630 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a  o(pCur);.      *
17640 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e  pSize = pCur->in
17650 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20 7d 0a  fo.nData;.    }.
17660 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
17670 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70  .}../*.** Read p
17680 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69  ayload informati
17690 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72  on from the entr
176a0 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72 20  y that the pCur 
176b0 63 75 72 73 6f 72 20 69 73 0a 2a 2a 20 70 6f 69  cursor is.** poi
176c0 6e 74 69 6e 67 20 74 6f 2e 20 20 42 65 67 69 6e  nting to.  Begin
176d0 20 72 65 61 64 69 6e 67 20 74 68 65 20 70 61 79   reading the pay
176e0 6c 6f 61 64 20 61 74 20 22 6f 66 66 73 65 74 22  load at "offset"
176f0 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 61 20 74   and read.** a t
17700 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79  otal of "amt" by
17710 74 65 73 2e 20 20 50 75 74 20 74 68 65 20 72 65  tes.  Put the re
17720 73 75 6c 74 20 69 6e 20 7a 42 75 66 2e 0a 2a 2a  sult in zBuf..**
17730 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
17740 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 61   does not make a
17750 20 64 69 73 74 69 6e 63 74 69 6f 6e 20 62 65 74   distinction bet
17760 77 65 65 6e 20 6b 65 79 20 61 6e 64 20 64 61 74  ween key and dat
17770 61 2e 0a 2a 2a 20 49 74 20 6a 75 73 74 20 72 65  a..** It just re
17780 61 64 73 20 62 79 74 65 73 20 66 72 6f 6d 20 74  ads bytes from t
17790 68 65 20 70 61 79 6c 6f 61 64 20 61 72 65 61 2e  he payload area.
177a0 20 20 44 61 74 61 20 6d 69 67 68 74 20 61 70 70    Data might app
177b0 65 61 72 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 61  ear.** on the ma
177c0 69 6e 20 70 61 67 65 20 6f 72 20 62 65 20 73 63  in page or be sc
177d0 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d  attered out on m
177e0 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77  ultiple overflow
177f0 20 70 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69   pages..*/.stati
17800 63 20 69 6e 74 20 67 65 74 50 61 79 6c 6f 61 64  c int getPayload
17810 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
17820 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73  ur,      /* Curs
17830 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65  or pointing to e
17840 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f  ntry to read fro
17850 6d 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65  m */.  int offse
17860 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  t,          /* B
17870 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69  egin reading thi
17880 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f  s far into paylo
17890 61 64 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c  ad */.  int amt,
178a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
178b0 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62  Read this many b
178c0 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  ytes */.  unsign
178d0 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f  ed char *pBuf, /
178e0 2a 20 57 72 69 74 65 20 74 68 65 20 62 79 74 65  * Write the byte
178f0 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66  s into this buff
17900 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 73 6b 69  er */ .  int ski
17910 70 4b 65 79 20 20 20 20 20 20 20 20 20 20 2f 2a  pKey          /*
17920 20 6f 66 66 73 65 74 20 62 65 67 69 6e 73 20 61   offset begins a
17930 74 20 64 61 74 61 20 69 66 20 74 68 69 73 20 69  t data if this i
17940 73 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75  s true */.){.  u
17950 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50  nsigned char *aP
17960 61 79 6c 6f 61 64 3b 0a 20 20 50 67 6e 6f 20 6e  ayload;.  Pgno n
17970 65 78 74 50 61 67 65 3b 0a 20 20 69 6e 74 20 72  extPage;.  int r
17980 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  c;.  MemPage *pP
17990 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20  age;.  BtShared 
179a0 2a 70 42 74 3b 0a 20 20 69 6e 74 20 6f 76 66 6c  *pBt;.  int ovfl
179b0 53 69 7a 65 3b 0a 20 20 75 33 32 20 6e 4b 65 79  Size;.  u32 nKey
179c0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  ;..  assert( pCu
179d0 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 70 50  r!=0 && pCur->pP
179e0 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  age!=0 );.  asse
179f0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
17a00 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
17a10 3b 0a 20 20 70 42 74 20 3d 20 70 43 75 72 2d 3e  ;.  pBt = pCur->
17a20 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20 70  pBtree->pBt;.  p
17a30 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
17a40 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  ge;.  assert( pC
17a50 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43  ur->idx>=0 && pC
17a60 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e  ur->idx<pPage->n
17a70 43 65 6c 6c 20 29 3b 0a 20 20 67 65 74 43 65 6c  Cell );.  getCel
17a80 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61  lInfo(pCur);.  a
17a90 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e  Payload = pCur->
17aa0 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20 70 43 75  info.pCell + pCu
17ab0 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b  r->info.nHeader;
17ac0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
17ad0 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65 79  tKey ){.    nKey
17ae0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
17af0 20 20 20 6e 4b 65 79 20 3d 20 70 43 75 72 2d 3e     nKey = pCur->
17b00 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20  info.nKey;.  }. 
17b10 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e   assert( offset>
17b20 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 6b 69 70  =0 );.  if( skip
17b30 4b 65 79 20 29 7b 0a 20 20 20 20 6f 66 66 73 65  Key ){.    offse
17b40 74 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20  t += nKey;.  }. 
17b50 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20   if( offset+amt 
17b60 3e 20 6e 4b 65 79 2b 70 43 75 72 2d 3e 69 6e 66  > nKey+pCur->inf
17b70 6f 2e 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 72  o.nData ){.    r
17b80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
17b90 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 66  OR;.  }.  if( of
17ba0 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e  fset<pCur->info.
17bb0 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e  nLocal ){.    in
17bc0 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69  t a = amt;.    i
17bd0 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72  f( a+offset>pCur
17be0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  ->info.nLocal ){
17bf0 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d  .      a = pCur-
17c00 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f  >info.nLocal - o
17c10 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20  ffset;.    }.   
17c20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26 61   memcpy(pBuf, &a
17c30 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c  Payload[offset],
17c40 20 61 29 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d   a);.    if( a==
17c50 61 6d 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74  amt ){.      ret
17c60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
17c70 20 20 20 7d 0a 20 20 20 20 6f 66 66 73 65 74 20     }.    offset 
17c80 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d  = 0;.    pBuf +=
17c90 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61   a;.    amt -= a
17ca0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
17cb0 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69  ffset -= pCur->i
17cc0 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a  nfo.nLocal;.  }.
17cd0 20 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74    ovflSize = pBt
17ce0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
17cf0 3b 0a 20 20 69 66 28 20 61 6d 74 3e 30 20 29 7b  ;.  if( amt>0 ){
17d00 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20  .    nextPage = 
17d10 67 65 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f  get4byte(&aPaylo
17d20 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad[pCur->info.nL
17d30 6f 63 61 6c 5d 29 3b 0a 20 20 20 20 77 68 69 6c  ocal]);.    whil
17d40 65 28 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74  e( amt>0 && next
17d50 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 44 62  Page ){.      Db
17d60 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
17d70 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
17d80 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
17d90 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c  Pager, nextPage,
17da0 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20   &pDbPage);.    
17db0 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
17dc0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
17dd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17de0 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74  aPayload = sqlit
17df0 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
17e00 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 6e  DbPage);.      n
17e10 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79  extPage = get4by
17e20 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20  te(aPayload);.  
17e30 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3c 6f      if( offset<o
17e40 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  vflSize ){.     
17e50 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a     int a = amt;.
17e60 20 20 20 20 20 20 20 20 69 66 28 20 61 20 2b 20          if( a + 
17e70 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a  offset > ovflSiz
17e80 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  e ){.          a
17e90 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66   = ovflSize - of
17ea0 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  fset;.        }.
17eb0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
17ec0 42 75 66 2c 20 26 61 50 61 79 6c 6f 61 64 5b 6f  Buf, &aPayload[o
17ed0 66 66 73 65 74 2b 34 5d 2c 20 61 29 3b 0a 20 20  ffset+4], a);.  
17ee0 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30        offset = 0
17ef0 3b 0a 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d  ;.        amt -=
17f00 20 61 3b 0a 20 20 20 20 20 20 20 20 70 42 75 66   a;.        pBuf
17f10 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 7d 65 6c   += a;.      }el
17f20 73 65 7b 0a 20 20 20 20 20 20 20 20 6f 66 66 73  se{.        offs
17f30 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a  et -= ovflSize;.
17f40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
17f50 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
17f60 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  pDbPage);.    }.
17f70 20 20 7d 0a 0a 20 20 69 66 28 20 61 6d 74 3e 30    }..  if( amt>0
17f80 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
17f90 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
17fa0 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
17fb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
17fc0 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f  *.** Read part o
17fd0 66 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63 69  f the key associ
17fe0 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72  ated with cursor
17ff0 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a   pCur.  Exactly.
18000 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77  ** "amt" bytes w
18010 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65  ill be transfere
18020 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20  d into pBuf[].  
18030 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20  The transfer.** 
18040 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65  begins at "offse
18050 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  t"..**.** Return
18060 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
18070 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
18080 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69  r code if anythi
18090 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67  ng goes.** wrong
180a0 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72  .  An error is r
180b0 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73  eturned if "offs
180c0 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65  et+amt" is large
180d0 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76  r than.** the av
180e0 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e  ailable payload.
180f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
18100 74 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72  treeKey(BtCursor
18110 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73   *pCur, u32 offs
18120 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69  et, u32 amt, voi
18130 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20  d *pBuf){.  int 
18140 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c  rc = restoreOrCl
18150 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  earCursorPositio
18160 6e 28 70 43 75 72 2c 20 31 29 3b 0a 20 20 69 66  n(pCur, 1);.  if
18170 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18180 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
18190 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
181a0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
181b0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
181c0 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 20 20 69  Page!=0 );.    i
181d0 66 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  f( pCur->pPage->
181e0 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
181f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
18200 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
18210 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  }.    assert( pC
18220 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ur->pPage->intKe
18230 79 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  y==0 );.    asse
18240 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30  rt( pCur->idx>=0
18250 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 43   && pCur->idx<pC
18260 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
18270 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74   );.    rc = get
18280 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66  Payload(pCur, of
18290 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69  fset, amt, (unsi
182a0 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c  gned char*)pBuf,
182b0 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
182c0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
182d0 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ead part of the 
182e0 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20  data associated 
182f0 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72  with cursor pCur
18300 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61  .  Exactly.** "a
18310 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
18320 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74  e transfered int
18330 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74  o pBuf[].  The t
18340 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e  ransfer.** begin
18350 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  s at "offset"..*
18360 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
18370 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
18380 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
18390 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
183a0 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e  es.** wrong.  An
183b0 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
183c0 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d  ed if "offset+am
183d0 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  t" is larger tha
183e0 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62  n.** the availab
183f0 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69  le payload..*/.i
18400 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  nt sqlite3BtreeD
18410 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ata(BtCursor *pC
18420 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20  ur, u32 offset, 
18430 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70  u32 amt, void *p
18440 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Buf){.  int rc =
18450 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43   restoreOrClearC
18460 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
18470 75 72 2c 20 31 29 3b 0a 20 20 69 66 28 20 72 63  ur, 1);.  if( rc
18480 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18490 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
184a0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
184b0 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73  VALID );.    ass
184c0 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
184d0 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
184e0 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20  t( pCur->idx>=0 
184f0 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 43 75  && pCur->idx<pCu
18500 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  r->pPage->nCell 
18510 29 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 50  );.    rc = getP
18520 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66  ayload(pCur, off
18530 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20  set, amt, pBuf, 
18540 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  1);.  }.  return
18550 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
18560 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
18570 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d  o payload inform
18580 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65  ation from the e
18590 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a  ntry that the .*
185a0 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73  * pCur cursor is
185b0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54   pointing to.  T
185c0 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f  he pointer is to
185d0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
185e0 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20  f.** the key if 
185f0 73 6b 69 70 4b 65 79 3d 3d 30 20 61 6e 64 20 69  skipKey==0 and i
18600 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
18610 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74  beginning of dat
18620 61 20 69 66 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d  a if.** skipKey=
18630 3d 31 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20  =1.  The number 
18640 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69  of bytes of avai
18650 6c 61 62 6c 65 20 6b 65 79 2f 64 61 74 61 20 69  lable key/data i
18660 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
18670 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41  o *pAmt.  If *pA
18680 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20  mt==0, then the 
18690 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 77  value returned w
186a0 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 20  ill not be.** a 
186b0 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a  valid pointer..*
186c0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
186d0 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  e is an optimiza
186e0 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d  tion.  It is com
186f0 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69  mon for the enti
18700 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61  re key.** and da
18710 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65  ta to fit on the
18720 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20   local page and 
18730 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20  for there to be 
18740 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70  no overflow.** p
18750 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74  ages.  When that
18760 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75   is so, this rou
18770 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64  tine can be used
18780 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a   to access the.*
18790 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77  * key and data w
187a0 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20  ithout making a 
187b0 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65  copy.  If the ke
187c0 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70  y and/or data sp
187d0 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65  ills.** onto ove
187e0 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65  rflow pages, the
187f0 6e 20 67 65 74 50 61 79 6c 6f 61 64 28 29 20 6d  n getPayload() m
18800 75 73 74 20 62 65 20 75 73 65 64 20 74 6f 20 72  ust be used to r
18810 65 61 73 73 65 6d 62 6c 79 0a 2a 2a 20 74 68 65  eassembly.** the
18820 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f   key/data and co
18830 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65  py it into a pre
18840 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72  allocated buffer
18850 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e  ..**.** The poin
18860 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20  ter returned by 
18870 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f  this routine loo
18880 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f  ks directly into
18890 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70   the cached.** p
188a0 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
188b0 61 73 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d  ase.  The data m
188c0 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d  ight change or m
188d0 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d  ove the next tim
188e0 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72  e.** any btree r
188f0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
18900 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
18910 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
18920 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20  *fetchPayload(. 
18930 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
18940 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
18950 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72  pointing to entr
18960 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  y to read from *
18970 2f 0a 20 20 69 6e 74 20 2a 70 41 6d 74 2c 20 20  /.  int *pAmt,  
18980 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
18990 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
189a0 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20  available bytes 
189b0 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6b  here */.  int sk
189c0 69 70 4b 65 79 20 20 20 20 20 20 20 20 20 20 2f  ipKey          /
189d0 2a 20 72 65 61 64 20 62 65 67 69 6e 6e 69 6e 67  * read beginning
189e0 20 61 74 20 64 61 74 61 20 69 66 20 74 68 69 73   at data if this
189f0 20 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   is true */.){. 
18a00 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
18a10 61 50 61 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50  aPayload;.  MemP
18a20 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 75 33  age *pPage;.  u3
18a30 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4c  2 nKey;.  int nL
18a40 6f 63 61 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28  ocal;..  assert(
18a50 20 70 43 75 72 21 3d 30 20 26 26 20 70 43 75 72   pCur!=0 && pCur
18a60 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20  ->pPage!=0 );.  
18a70 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
18a80 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
18a90 49 44 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20  ID );.  pPage = 
18aa0 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61  pCur->pPage;.  a
18ab0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78  ssert( pCur->idx
18ac0 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78  >=0 && pCur->idx
18ad0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
18ae0 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  .  getCellInfo(p
18af0 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64  Cur);.  aPayload
18b00 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43   = pCur->info.pC
18b10 65 6c 6c 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20  ell;.  aPayload 
18b20 2b 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48  += pCur->info.nH
18b30 65 61 64 65 72 3b 0a 20 20 69 66 28 20 70 50 61  eader;.  if( pPa
18b40 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
18b50 20 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65    nKey = 0;.  }e
18b60 6c 73 65 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20  lse{.    nKey = 
18b70 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b  pCur->info.nKey;
18b80 0a 20 20 7d 0a 20 20 69 66 28 20 73 6b 69 70 4b  .  }.  if( skipK
18b90 65 79 20 29 7b 0a 20 20 20 20 61 50 61 79 6c 6f  ey ){.    aPaylo
18ba0 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20  ad += nKey;.    
18bb0 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69  nLocal = pCur->i
18bc0 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65  nfo.nLocal - nKe
18bd0 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  y;.  }else{.    
18be0 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69  nLocal = pCur->i
18bf0 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  nfo.nLocal;.    
18c00 69 66 28 20 6e 4c 6f 63 61 6c 3e 6e 4b 65 79 20  if( nLocal>nKey 
18c10 29 7b 0a 20 20 20 20 20 20 6e 4c 6f 63 61 6c 20  ){.      nLocal 
18c20 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20  = nKey;.    }.  
18c30 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63  }.  *pAmt = nLoc
18c40 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 50 61  al;.  return aPa
18c50 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  yload;.}.../*.**
18c60 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   For the entry t
18c70 68 61 74 20 63 75 72 73 6f 72 20 70 43 75 72 20  hat cursor pCur 
18c80 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74  is point to, ret
18c90 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62  urn as.** many b
18ca0 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20  ytes of the key 
18cb0 6f 72 20 64 61 74 61 20 61 73 20 61 72 65 20 61  or data as are a
18cc0 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20  vailable on the 
18cd0 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20  local.** b-tree 
18ce0 70 61 67 65 2e 20 20 57 72 69 74 65 20 74 68 65  page.  Write the
18cf0 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
18d00 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20  able bytes into 
18d10 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  *pAmt..**.** The
18d20 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
18d30 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20  d is ephemeral. 
18d40 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61   The key/data ma
18d50 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20  y move.** or be 
18d60 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65  destroyed on the
18d70 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e   next call to an
18d80 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2e  y Btree routine.
18d90 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75  .**.** These rou
18da0 74 69 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f  tines is used to
18db0 20 67 65 74 20 71 75 69 63 6b 20 61 63 63 65 73   get quick acces
18dc0 73 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74  s to key and dat
18dd0 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d  a.** in the comm
18de0 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f  on case where no
18df0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
18e00 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e  are used..*/.con
18e10 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  st void *sqlite3
18e20 42 74 72 65 65 4b 65 79 46 65 74 63 68 28 42 74  BtreeKeyFetch(Bt
18e30 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
18e40 74 20 2a 70 41 6d 74 29 7b 0a 20 20 69 66 28 20  t *pAmt){.  if( 
18e50 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
18e60 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
18e70 20 20 72 65 74 75 72 6e 20 28 63 6f 6e 73 74 20    return (const 
18e80 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f  void*)fetchPaylo
18e90 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 30  ad(pCur, pAmt, 0
18ea0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
18eb0 30 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20  0;.}.const void 
18ec0 2a 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74  *sqlite3BtreeDat
18ed0 61 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20  aFetch(BtCursor 
18ee0 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74  *pCur, int *pAmt
18ef0 29 7b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  ){.  if( pCur->e
18f00 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
18f10 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  LID ){.    retur
18f20 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66  n (const void*)f
18f30 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72  etchPayload(pCur
18f40 2c 20 70 41 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a  , pAmt, 1);.  }.
18f50 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a    return 0;.}...
18f60 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
18f70 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20  ursor down to a 
18f80 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20  new child page. 
18f90 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67   The newPgno arg
18fa0 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20  ument is the.** 
18fb0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
18fc0 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f  he child page to
18fd0 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2f 0a 73 74 61   move to..*/.sta
18fe0 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68  tic int moveToCh
18ff0 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ild(BtCursor *pC
19000 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29  ur, u32 newPgno)
19010 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
19020 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 67 65 3b  mPage *pNewPage;
19030 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64  .  MemPage *pOld
19040 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65 64  Page;.  BtShared
19050 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
19060 74 72 65 65 2d 3e 70 42 74 3b 0a 0a 20 20 61 73  tree->pBt;..  as
19070 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
19080 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
19090 20 29 3b 0a 20 20 72 63 20 3d 20 67 65 74 41 6e   );.  rc = getAn
190a0 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e  dInitPage(pBt, n
190b0 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67  ewPgno, &pNewPag
190c0 65 2c 20 70 43 75 72 2d 3e 70 50 61 67 65 29 3b  e, pCur->pPage);
190d0 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
190e0 72 6e 20 72 63 3b 0a 20 20 70 4e 65 77 50 61 67  rn rc;.  pNewPag
190f0 65 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d 20 70  e->idxParent = p
19100 43 75 72 2d 3e 69 64 78 3b 0a 20 20 70 4f 6c 64  Cur->idx;.  pOld
19110 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
19120 67 65 3b 0a 20 20 70 4f 6c 64 50 61 67 65 2d 3e  ge;.  pOldPage->
19130 69 64 78 53 68 69 66 74 20 3d 20 30 3b 0a 20 20  idxShift = 0;.  
19140 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f 6c 64  releasePage(pOld
19150 50 61 67 65 29 3b 0a 20 20 70 43 75 72 2d 3e 70  Page);.  pCur->p
19160 50 61 67 65 20 3d 20 70 4e 65 77 50 61 67 65 3b  Page = pNewPage;
19170 0a 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 30  .  pCur->idx = 0
19180 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
19190 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  Size = 0;.  if( 
191a0 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c  pNewPage->nCell<
191b0 31 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  1 ){.    return 
191c0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
191d0 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
191e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
191f0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
19200 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
19210 20 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f   the virtual roo
19220 74 20 6f 66 20 69 74 73 20 74 61 62 6c 65 2e 0a  t of its table..
19230 2a 2a 0a 2a 2a 20 54 68 65 20 76 69 72 74 75 61  **.** The virtua
19240 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 74  l root page is t
19250 68 65 20 72 6f 6f 74 20 70 61 67 65 20 66 6f 72  he root page for
19260 20 6d 6f 73 74 20 74 61 62 6c 65 73 2e 20 20 42   most tables.  B
19270 75 74 0a 2a 2a 20 66 6f 72 20 74 68 65 20 74 61  ut.** for the ta
19280 62 6c 65 20 72 6f 6f 74 65 64 20 6f 6e 20 70 61  ble rooted on pa
19290 67 65 20 31 2c 20 73 6f 6d 65 74 69 6d 65 20 74  ge 1, sometime t
192a0 68 65 20 72 65 61 6c 20 72 6f 6f 74 20 70 61 67  he real root pag
192b0 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 20 65 78  e.** is empty ex
192c0 63 65 70 74 20 66 6f 72 20 74 68 65 20 72 69 67  cept for the rig
192d0 68 74 2d 70 6f 69 6e 74 65 72 2e 20 20 49 6e 20  ht-pointer.  In 
192e0 73 75 63 68 20 63 61 73 65 73 20 74 68 65 0a 2a  such cases the.*
192f0 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  * virtual root p
19300 61 67 65 20 69 73 20 74 68 65 20 70 61 67 65 20  age is the page 
19310 74 68 61 74 20 74 68 65 20 72 69 67 68 74 2d 70  that the right-p
19320 6f 69 6e 74 65 72 20 6f 66 20 70 61 67 65 0a 2a  ointer of page.*
19330 2a 20 31 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  * 1 is pointing 
19340 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  to..*/.static in
19350 74 20 69 73 52 6f 6f 74 50 61 67 65 28 4d 65 6d  t isRootPage(Mem
19360 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
19370 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
19380 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e   = pPage->pParen
19390 74 3b 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74  t;.  if( pParent
193a0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
193b0 20 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e 70    if( pParent->p
193c0 67 6e 6f 3e 31 20 29 20 72 65 74 75 72 6e 20 30  gno>1 ) return 0
193d0 3b 0a 20 20 69 66 28 20 67 65 74 32 62 79 74 65  ;.  if( get2byte
193e0 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
193f0 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
19400 73 65 74 2b 33 5d 29 3d 3d 30 20 29 20 72 65 74  set+3])==0 ) ret
19410 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  urn 1;.  return 
19420 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  0;.}../*.** Move
19430 20 74 68 65 20 63 75 72 73 6f 72 20 75 70 20 74   the cursor up t
19440 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
19450 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69  e..**.** pCur->i
19460 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  dx is set to the
19470 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74   cell index that
19480 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f   contains the po
19490 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
194a0 70 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69  page we are comi
194b0 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20  ng from.  If we 
194c0 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20  are coming from 
194d0 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73  the.** right-mos
194e0 74 20 63 68 69 6c 64 20 70 61 67 65 20 74 68 65  t child page the
194f0 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73  n pCur->idx is s
19500 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74  et to one more t
19510 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65  han.** the large
19520 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a  st cell index..*
19530 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 6f  /.static void mo
19540 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72  veToParent(BtCur
19550 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65  sor *pCur){.  Me
19560 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 3b 0a  mPage *pParent;.
19570 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
19580 3b 0a 20 20 69 6e 74 20 69 64 78 50 61 72 65 6e  ;.  int idxParen
19590 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43  t;..  assert( pC
195a0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
195b0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70 50  OR_VALID );.  pP
195c0 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
195d0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  e;.  assert( pPa
195e0 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ge!=0 );.  asser
195f0 74 28 20 21 69 73 52 6f 6f 74 50 61 67 65 28 70  t( !isRootPage(p
19600 50 61 67 65 29 20 29 3b 0a 20 20 70 50 61 72 65  Page) );.  pPare
19610 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72  nt = pPage->pPar
19620 65 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ent;.  assert( p
19630 50 61 72 65 6e 74 21 3d 30 20 29 3b 0a 20 20 69  Parent!=0 );.  i
19640 64 78 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65  dxParent = pPage
19650 2d 3e 69 64 78 50 61 72 65 6e 74 3b 0a 20 20 73  ->idxParent;.  s
19660 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70  qlite3PagerRef(p
19670 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
19680 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
19690 70 50 61 67 65 29 3b 0a 20 20 70 43 75 72 2d 3e  pPage);.  pCur->
196a0 70 50 61 67 65 20 3d 20 70 50 61 72 65 6e 74 3b  pPage = pParent;
196b0 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
196c0 69 7a 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  ize = 0;.  asser
196d0 74 28 20 70 50 61 72 65 6e 74 2d 3e 69 64 78 53  t( pParent->idxS
196e0 68 69 66 74 3d 3d 30 20 29 3b 0a 20 20 70 43 75  hift==0 );.  pCu
196f0 72 2d 3e 69 64 78 20 3d 20 69 64 78 50 61 72 65  r->idx = idxPare
19700 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  nt;.}../*.** Mov
19710 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
19720 74 68 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2f  the root page.*/
19730 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
19740 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20  ToRoot(BtCursor 
19750 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67  *pCur){.  MemPag
19760 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20  e *pRoot;.  int 
19770 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
19780 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
19790 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  = pCur->pBtree->
197a0 70 42 74 3b 0a 0a 20 20 72 65 73 74 6f 72 65 4f  pBt;..  restoreO
197b0 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69  rClearCursorPosi
197c0 74 69 6f 6e 28 70 43 75 72 2c 20 30 29 3b 0a 20  tion(pCur, 0);. 
197d0 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 70   pRoot = pCur->p
197e0 50 61 67 65 3b 0a 20 20 69 66 28 20 70 52 6f 6f  Page;.  if( pRoo
197f0 74 20 26 26 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f  t && pRoot->pgno
19800 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ==pCur->pgnoRoot
19810 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
19820 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 20 29 3b  pRoot->isInit );
19830 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
19840 28 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ( .      SQLITE_
19850 4f 4b 21 3d 28 72 63 20 3d 20 67 65 74 41 6e 64  OK!=(rc = getAnd
19860 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 43  InitPage(pBt, pC
19870 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70  ur->pgnoRoot, &p
19880 52 6f 6f 74 2c 20 30 29 29 0a 20 20 20 20 29 7b  Root, 0)).    ){
19890 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
198a0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
198b0 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75  ALID;.      retu
198c0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
198d0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
198e0 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20 20 70  r->pPage);.    p
198f0 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 52 6f  Cur->pPage = pRo
19900 6f 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  ot;.  }.  pCur->
19910 69 64 78 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  idx = 0;.  pCur-
19920 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
19930 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43  .  if( pRoot->nC
19940 65 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f 6f 74  ell==0 && !pRoot
19950 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67  ->leaf ){.    Pg
19960 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20  no subpage;.    
19970 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70  assert( pRoot->p
19980 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20 20 20 73 75  gno==1 );.    su
19990 62 70 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  bpage = get4byte
199a0 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70  (&pRoot->aData[p
199b0 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Root->hdrOffset+
199c0 38 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  8]);.    assert(
199d0 20 73 75 62 70 61 67 65 3e 30 20 29 3b 0a 20 20   subpage>0 );.  
199e0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
199f0 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
19a00 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
19a10 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61 67  ild(pCur, subpag
19a20 65 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  e);.  }.  pCur->
19a30 65 53 74 61 74 65 20 3d 20 28 28 70 43 75 72 2d  eState = ((pCur-
19a40 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 29  >pPage->nCell>0)
19a50 3f 43 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43 55  ?CURSOR_VALID:CU
19a60 52 53 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a 20  RSOR_INVALID);. 
19a70 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
19a80 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
19a90 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65  rsor down to the
19aa0 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20   left-most leaf 
19ab0 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
19ac0 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68  e.** entry to wh
19ad0 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e  ich it is curren
19ae0 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a  tly pointing..**
19af0 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73  .** The left-mos
19b00 74 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e  t leaf is the on
19b10 65 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c  e with the small
19b20 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69  est key - the fi
19b30 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64  rst.** in ascend
19b40 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  ing order..*/.st
19b50 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c  atic int moveToL
19b60 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72  eftmost(BtCursor
19b70 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20   *pCur){.  Pgno 
19b80 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  pgno;.  int rc;.
19b90 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
19ba0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  ;..  assert( pCu
19bb0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
19bc0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69  R_VALID );.  whi
19bd0 6c 65 28 20 21 28 70 50 61 67 65 20 3d 20 70 43  le( !(pPage = pC
19be0 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66  ur->pPage)->leaf
19bf0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
19c00 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20  pCur->idx>=0 && 
19c10 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d  pCur->idx<pPage-
19c20 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67  >nCell );.    pg
19c30 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66 69  no = get4byte(fi
19c40 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  ndCell(pPage, pC
19c50 75 72 2d 3e 69 64 78 29 29 3b 0a 20 20 20 20 72  ur->idx));.    r
19c60 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
19c70 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  pCur, pgno);.   
19c80 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
19c90 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   rc;.  }.  retur
19ca0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
19cb0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
19cc0 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68  ursor down to th
19cd0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61  e right-most lea
19ce0 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  f entry beneath 
19cf0 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77  the.** page to w
19d00 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65  hich it is curre
19d10 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20  ntly pointing.  
19d20 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66 66 65  Notice the diffe
19d30 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e  rence.** between
19d40 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
19d50 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68  ) and moveToRigh
19d60 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f  tmost().  moveTo
19d70 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69  Leftmost().** fi
19d80 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73  nds the left-mos
19d90 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  t entry beneath 
19da0 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72  the *entry* wher
19db0 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  eas moveToRightm
19dc0 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74  ost().** finds t
19dd0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
19de0 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20  try beneath the 
19df0 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68  *page*..**.** Th
19e00 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
19e10 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69  ry is the one wi
19e20 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b  th the largest k
19e30 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a  ey - the last.**
19e40 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e   key in ascendin
19e50 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  g order..*/.stat
19e60 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67  ic int moveToRig
19e70 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20  htmost(BtCursor 
19e80 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70  *pCur){.  Pgno p
19e90 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  gno;.  int rc;. 
19ea0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
19eb0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ..  assert( pCur
19ec0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
19ed0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c  _VALID );.  whil
19ee0 65 28 20 21 28 70 50 61 67 65 20 3d 20 70 43 75  e( !(pPage = pCu
19ef0 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66 20  r->pPage)->leaf 
19f00 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  ){.    pgno = ge
19f10 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
19f20 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
19f30 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70  ffset+8]);.    p
19f40 43 75 72 2d 3e 69 64 78 20 3d 20 70 50 61 67 65  Cur->idx = pPage
19f50 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20  ->nCell;.    rc 
19f60 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
19f70 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69  ur, pgno);.    i
19f80 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
19f90 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69  c;.  }.  pCur->i
19fa0 64 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  dx = pPage->nCel
19fb0 6c 20 2d 20 31 3b 0a 20 20 70 43 75 72 2d 3e 69  l - 1;.  pCur->i
19fc0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
19fd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19fe0 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  K;.}../* Move th
19ff0 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
1a000 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74  first entry in t
1a010 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  he table.  Retur
1a020 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
1a030 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20  n success.  Set 
1a040 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68  *pRes to 0 if th
1a050 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c  e cursor actuall
1a060 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65  y points to some
1a070 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20  thing.** or set 
1a080 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68  *pRes to 1 if th
1a090 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
1a0a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1a0b0 42 74 72 65 65 46 69 72 73 74 28 42 74 43 75 72  BtreeFirst(BtCur
1a0c0 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
1a0d0 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
1a0e0 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
1a0f0 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
1a100 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1a110 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
1a120 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
1a130 49 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ID ){.    assert
1a140 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  ( pCur->pPage->n
1a150 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 2a  Cell==0 );.    *
1a160 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65  pRes = 1;.    re
1a170 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1a180 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
1a190 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
1a1a0 3e 30 20 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20  >0 );.  *pRes = 
1a1b0 30 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  0;.  rc = moveTo
1a1c0 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
1a1d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1a1e0 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
1a1f0 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  or to the last e
1a200 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
1a210 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
1a220 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
1a230 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74  ss.  Set *pRes t
1a240 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f  o 0 if the curso
1a250 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74  r actually point
1a260 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a  s to something.*
1a270 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74  * or set *pRes t
1a280 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65  o 1 if the table
1a290 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
1a2a0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61  t sqlite3BtreeLa
1a2b0 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
1a2c0 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
1a2d0 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20   int rc;.  rc = 
1a2e0 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
1a2f0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
1a300 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 43 55  urn rc;.  if( CU
1a310 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
1a320 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
1a330 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1a340 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pPage->nCell==0 
1a350 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31  );.    *pRes = 1
1a360 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1a370 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73  ITE_OK;.  }.  as
1a380 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1a390 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1a3a0 20 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b   );.  *pRes = 0;
1a3b0 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69  .  rc = moveToRi
1a3c0 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  ghtmost(pCur);. 
1a3d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1a3e0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
1a3f0 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
1a400 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  nts to an entry 
1a410 6e 65 61 72 20 70 4b 65 79 2f 6e 4b 65 79 2e 0a  near pKey/nKey..
1a420 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 75 63 63  ** Return a succ
1a430 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ess code..**.** 
1a440 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65  For INTKEY table
1a450 73 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79  s, only the nKey
1a460 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 75 73   parameter is us
1a470 65 64 2e 20 20 70 4b 65 79 20 69 73 0a 2a 2a 20  ed.  pKey is.** 
1a480 69 67 6e 6f 72 65 64 2e 20 20 46 6f 72 20 6f 74  ignored.  For ot
1a490 68 65 72 20 74 61 62 6c 65 73 2c 20 6e 4b 65 79  her tables, nKey
1a4a0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
1a4b0 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 0a  f bytes of data.
1a4c0 2a 2a 20 69 6e 20 70 4b 65 79 2e 20 20 54 68 65  ** in pKey.  The
1a4d0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
1a4e0 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20 77  tion specified w
1a4f0 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 77  hen the cursor w
1a500 61 73 0a 2a 2a 20 63 72 65 61 74 65 64 20 69 73  as.** created is
1a510 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65   used to compare
1a520 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   keys..**.** If 
1a530 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20 69  an exact match i
1a540 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65  s not found, the
1a550 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
1a560 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70  always.** left p
1a570 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61  ointing at a lea
1a580 66 20 70 61 67 65 20 77 68 69 63 68 20 77 6f 75  f page which wou
1a590 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72  ld hold the entr
1a5a0 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20  y if it.** were 
1a5b0 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75  present.  The cu
1a5c0 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74  rsor might point
1a5d0 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61   to an entry tha
1a5e0 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72  t comes.** befor
1a5f0 65 20 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b  e or after the k
1a600 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  ey..**.** The re
1a610 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 6e  sult of comparin
1a620 67 20 74 68 65 20 6b 65 79 20 77 69 74 68 20 74  g the key with t
1a630 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63  he entry to whic
1a640 68 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20  h the.** cursor 
1a650 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70  is written to *p
1a660 52 65 73 20 69 66 20 70 52 65 73 21 3d 4e 55 4c  Res if pRes!=NUL
1a670 4c 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20  L.  The meaning 
1a680 6f 66 0a 2a 2a 20 74 68 69 73 20 76 61 6c 75 65  of.** this value
1a690 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
1a6a0 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c  **.**     *pRes<
1a6b0 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  0      The curso
1a6c0 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
1a6d0 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
1a6e0 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
1a6f0 20 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c          is small
1a700 65 72 20 74 68 61 6e 20 70 4b 65 79 20 6f 72 20  er than pKey or 
1a710 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
1a720 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20  empty.**        
1a730 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 74 68            and th
1a740 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65 72  e cursor is ther
1a750 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74  efore left point
1a760 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a   to nothing..**.
1a770 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20  **     *pRes==0 
1a780 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
1a790 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
1a7a0 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
1a7b0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1a7c0 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74       exactly mat
1a7d0 63 68 65 73 20 70 4b 65 79 2e 0a 2a 2a 0a 2a 2a  ches pKey..**.**
1a7e0 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20       *pRes>0    
1a7f0 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
1a800 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
1a810 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
1a820 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1a830 20 20 20 69 73 20 6c 61 72 67 65 72 20 74 68 61     is larger tha
1a840 6e 20 70 4b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73  n pKey..*/.int s
1a850 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
1a860 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  o(BtCursor *pCur
1a870 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
1a880 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 69 6e  ey, i64 nKey, in
1a890 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
1a8a0 72 63 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54  rc;.  rc = moveT
1a8b0 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
1a8c0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1a8d0 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  c;.  assert( pCu
1a8e0 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20 61 73  r->pPage );.  as
1a8f0 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67  sert( pCur->pPag
1a900 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69  e->isInit );.  i
1a910 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
1a920 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
1a930 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 2d  ){.    *pRes = -
1a940 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  1;.    assert( p
1a950 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
1a960 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75  l==0 );.    retu
1a970 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1a980 7d 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20  }.  for(;;){.   
1a990 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 3b 0a 20   int lwr, upr;. 
1a9a0 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a     Pgno chldPg;.
1a9b0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
1a9c0 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
1a9d0 3b 0a 20 20 20 20 69 6e 74 20 63 20 3d 20 2d 31  ;.    int c = -1
1a9e0 3b 20 20 2f 2a 20 70 52 65 73 20 72 65 74 75 72  ;  /* pRes retur
1a9f0 6e 20 69 66 20 74 61 62 6c 65 20 69 73 20 65 6d  n if table is em
1aa00 70 74 79 20 6d 75 73 74 20 62 65 20 2d 31 20 2a  pty must be -1 *
1aa10 2f 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20  /.    lwr = 0;. 
1aa20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e     upr = pPage->
1aa30 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 69 66 28  nCell-1;.    if(
1aa40 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20   !pPage->intKey 
1aa50 26 26 20 70 4b 65 79 3d 3d 30 20 29 7b 0a 20 20  && pKey==0 ){.  
1aa60 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1aa70 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1aa80 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
1aa90 69 64 78 20 3d 20 75 70 72 3b 0a 20 20 20 20 69  idx = upr;.    i
1aaa0 66 28 20 6c 77 72 3c 3d 75 70 72 20 29 20 66 6f  f( lwr<=upr ) fo
1aab0 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 76 6f 69  r(;;){.      voi
1aac0 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20  d *pCellKey;.   
1aad0 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b     i64 nCellKey;
1aae0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66  .      pCur->inf
1aaf0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  o.nSize = 0;.   
1ab00 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
1ab10 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  tKey ){.        
1ab20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20  u8 *pCell;.     
1ab30 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43     pCell = findC
1ab40 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
1ab50 3e 69 64 78 29 20 2b 20 70 50 61 67 65 2d 3e 63  >idx) + pPage->c
1ab60 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20  hildPtrSize;.   
1ab70 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
1ab80 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20  hasData ){.     
1ab90 20 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a       u32 dummy;.
1aba0 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20            pCell 
1abb0 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70  += getVarint32(p
1abc0 43 65 6c 6c 2c 20 26 64 75 6d 6d 79 29 3b 0a 20  Cell, &dummy);. 
1abd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1abe0 20 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c   getVarint(pCell
1abf0 2c 20 28 75 36 34 20 2a 29 26 6e 43 65 6c 6c 4b  , (u64 *)&nCellK
1ac00 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ey);.        if(
1ac10 20 6e 43 65 6c 6c 4b 65 79 3c 6e 4b 65 79 20 29   nCellKey<nKey )
1ac20 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  {.          c = 
1ac30 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  -1;.        }els
1ac40 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3e 6e  e if( nCellKey>n
1ac50 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Key ){.         
1ac60 20 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20   c = +1;.       
1ac70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1ac80 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20    c = 0;.       
1ac90 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
1aca0 20 20 20 20 20 20 20 20 69 6e 74 20 61 76 61 69          int avai
1acb0 6c 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 70  lable;.        p
1acc0 43 65 6c 6c 4b 65 79 20 3d 20 28 76 6f 69 64 20  CellKey = (void 
1acd0 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70  *)fetchPayload(p
1ace0 43 75 72 2c 20 26 61 76 61 69 6c 61 62 6c 65 2c  Cur, &available,
1acf0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 65   0);.        nCe
1ad00 6c 6c 4b 65 79 20 3d 20 70 43 75 72 2d 3e 69 6e  llKey = pCur->in
1ad10 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20  fo.nKey;.       
1ad20 20 69 66 28 20 61 76 61 69 6c 61 62 6c 65 3e 3d   if( available>=
1ad30 6e 43 65 6c 6c 4b 65 79 20 29 7b 0a 20 20 20 20  nCellKey ){.    
1ad40 20 20 20 20 20 20 63 20 3d 20 70 43 75 72 2d 3e        c = pCur->
1ad50 78 43 6f 6d 70 61 72 65 28 70 43 75 72 2d 3e 70  xCompare(pCur->p
1ad60 41 72 67 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 70  Arg, nCellKey, p
1ad70 43 65 6c 6c 4b 65 79 2c 20 6e 4b 65 79 2c 20 70  CellKey, nKey, p
1ad80 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Key);.        }e
1ad90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
1ada0 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65  CellKey = sqlite
1adb0 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 43 65 6c 6c  MallocRaw( nCell
1adc0 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Key );.         
1add0 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30   if( pCellKey==0
1ade0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1adf0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
1ae00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1ae10 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c 20  reeKey(pCur, 0, 
1ae20 6e 43 65 6c 6c 4b 65 79 2c 20 28 76 6f 69 64 20  nCellKey, (void 
1ae30 2a 29 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  *)pCellKey);.   
1ae40 20 20 20 20 20 20 20 63 20 3d 20 70 43 75 72 2d         c = pCur-
1ae50 3e 78 43 6f 6d 70 61 72 65 28 70 43 75 72 2d 3e  >xCompare(pCur->
1ae60 70 41 72 67 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20  pArg, nCellKey, 
1ae70 70 43 65 6c 6c 4b 65 79 2c 20 6e 4b 65 79 2c 20  pCellKey, nKey, 
1ae80 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  pKey);.         
1ae90 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 65 6c   sqliteFree(pCel
1aea0 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  lKey);.         
1aeb0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1aec0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
1aed0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1aee0 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   c==0 ){.       
1aef0 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
1af00 44 61 74 61 20 26 26 20 21 70 50 61 67 65 2d 3e  Data && !pPage->
1af10 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
1af20 20 20 6c 77 72 20 3d 20 70 43 75 72 2d 3e 69 64    lwr = pCur->id
1af30 78 3b 0a 20 20 20 20 20 20 20 20 20 20 75 70 72  x;.          upr
1af40 20 3d 20 6c 77 72 20 2d 20 31 3b 0a 20 20 20 20   = lwr - 1;.    
1af50 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1af60 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1af70 20 20 20 20 20 20 69 66 28 20 70 52 65 73 20 29        if( pRes )
1af80 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
1af90 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1afa0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
1afb0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1afc0 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20  if( c<0 ){.     
1afd0 20 20 20 6c 77 72 20 3d 20 70 43 75 72 2d 3e 69     lwr = pCur->i
1afe0 64 78 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  dx+1;.      }els
1aff0 65 7b 0a 20 20 20 20 20 20 20 20 75 70 72 20 3d  e{.        upr =
1b000 20 70 43 75 72 2d 3e 69 64 78 2d 31 3b 0a 20 20   pCur->idx-1;.  
1b010 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1b020 6c 77 72 3e 75 70 72 20 29 7b 0a 20 20 20 20 20  lwr>upr ){.     
1b030 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1b040 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 64  }.      pCur->id
1b050 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b  x = (lwr+upr)/2;
1b060 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
1b070 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 29 3b  t( lwr==upr+1 );
1b080 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1b090 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
1b0a0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
1b0b0 66 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50  f ){.      chldP
1b0c0 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  g = 0;.    }else
1b0d0 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d   if( lwr>=pPage-
1b0e0 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  >nCell ){.      
1b0f0 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74  chldPg = get4byt
1b100 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
1b110 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
1b120 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  +8]);.    }else{
1b130 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20  .      chldPg = 
1b140 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
1b150 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a  l(pPage, lwr));.
1b160 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68      }.    if( ch
1b170 6c 64 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ldPg==0 ){.     
1b180 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
1b190 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69  dx>=0 && pCur->i
1b1a0 64 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  dx<pCur->pPage->
1b1b0 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 69  nCell );.      i
1b1c0 66 28 20 70 52 65 73 20 29 20 2a 70 52 65 73 20  f( pRes ) *pRes 
1b1d0 3d 20 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = c;.      retur
1b1e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1b1f0 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 64 78   }.    pCur->idx
1b200 20 3d 20 6c 77 72 3b 0a 20 20 20 20 70 43 75 72   = lwr;.    pCur
1b210 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
1b220 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
1b230 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68 6c  oChild(pCur, chl
1b240 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  dPg);.    if( rc
1b250 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1b260 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   rc;.    }.  }. 
1b270 20 2f 2a 20 4e 4f 54 20 52 45 41 43 48 45 44 20   /* NOT REACHED 
1b280 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  */.}../*.** Retu
1b290 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 63  rn TRUE if the c
1b2a0 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69  ursor is not poi
1b2b0 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
1b2c0 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a  y of the table..
1b2d0 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20  **.** TRUE will 
1b2e0 62 65 20 72 65 74 75 72 6e 65 64 20 61 66 74 65  be returned afte
1b2f0 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  r a call to sqli
1b300 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 20 6d  te3BtreeNext() m
1b310 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68 65  oves.** past the
1b320 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
1b330 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c 69  he table or sqli
1b340 74 65 33 42 74 72 65 65 50 72 65 76 28 29 20 6d  te3BtreePrev() m
1b350 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68 65  oves past.** the
1b360 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20 54   first entry.  T
1b370 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74 75  RUE is also retu
1b380 72 6e 65 64 20 69 66 20 74 68 65 20 74 61 62 6c  rned if the tabl
1b390 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
1b3a0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  nt sqlite3BtreeE
1b3b0 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  of(BtCursor *pCu
1b3c0 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57  r){.  /* TODO: W
1b3d0 68 61 74 20 69 66 20 74 68 65 20 63 75 72 73 6f  hat if the curso
1b3e0 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f 52  r is in CURSOR_R
1b3f0 45 51 55 49 52 45 53 45 45 4b 20 62 75 74 20 61  EQUIRESEEK but a
1b400 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73  ll table entries
1b410 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20  .  ** have been 
1b420 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41 50  deleted? This AP
1b430 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63  I will need to c
1b440 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e 20  hange to return 
1b450 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20  an error code.  
1b460 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68  ** as well as th
1b470 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74  e boolean result
1b480 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72   value..  */.  r
1b490 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56 41  eturn (CURSOR_VA
1b4a0 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID!=pCur->eStat
1b4b0 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76  e);.}../*.** Adv
1b4c0 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72 20  ance the cursor 
1b4d0 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72  to the next entr
1b4e0 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
1b4f0 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73  e.  If.** succes
1b500 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70  sful then set *p
1b510 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63  Res=0.  If the c
1b520 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72  ursor.** was alr
1b530 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  eady pointing to
1b540 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
1b550 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1b560 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72  before.** this r
1b570 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
1b580 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  d, then set *pRe
1b590 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  s=1..*/.int sqli
1b5a0 74 65 33 42 74 72 65 65 4e 65 78 74 28 42 74 43  te3BtreeNext(BtC
1b5b0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
1b5c0 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
1b5d0 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  c;.  MemPage *pP
1b5e0 61 67 65 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  age;..#ifndef SQ
1b5f0 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
1b600 5f 43 41 43 48 45 0a 20 20 72 63 20 3d 20 72 65  _CACHE.  rc = re
1b610 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73  storeOrClearCurs
1b620 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 2c  orPosition(pCur,
1b630 20 31 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   1);.  if( rc!=S
1b640 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b650 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
1b660 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 3e   if( pCur->skip>
1b670 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73  0 ){.    pCur->s
1b680 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52  kip = 0;.    *pR
1b690 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  es = 0;.    retu
1b6a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1b6b0 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d  }.  pCur->skip =
1b6c0 20 30 3b 0a 23 65 6e 64 69 66 20 0a 0a 20 20 61   0;.#endif ..  a
1b6d0 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29  ssert( pRes!=0 )
1b6e0 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ;.  pPage = pCur
1b6f0 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66 28 20 43  ->pPage;.  if( C
1b700 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
1b710 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
1b720 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
1b730 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b740 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  OK;.  }.  assert
1b750 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
1b760 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1b770 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43  r->idx<pPage->nC
1b780 65 6c 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e  ell );..  pCur->
1b790 69 64 78 2b 2b 3b 0a 20 20 70 43 75 72 2d 3e 69  idx++;.  pCur->i
1b7a0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
1b7b0 20 69 66 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d   if( pCur->idx>=
1b7c0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
1b7d0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
1b7e0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
1b7f0 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
1b800 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 26 70  Cur, get4byte(&p
1b810 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
1b820 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
1b830 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
1b840 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1b850 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65     rc = moveToLe
1b860 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
1b870 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
1b880 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1b890 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20      }.    do{.  
1b8a0 20 20 20 20 69 66 28 20 69 73 52 6f 6f 74 50 61      if( isRootPa
1b8b0 67 65 28 70 50 61 67 65 29 20 29 7b 0a 20 20 20  ge(pPage) ){.   
1b8c0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
1b8d0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53          pCur->eS
1b8e0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
1b8f0 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72  VALID;.        r
1b900 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1b910 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
1b920 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72  oveToParent(pCur
1b930 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d  );.      pPage =
1b940 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
1b950 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e    }while( pCur->
1b960 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  idx>=pPage->nCel
1b970 6c 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d  l );.    *pRes =
1b980 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   0;.    if( pPag
1b990 65 2d 3e 6c 65 61 66 44 61 74 61 20 29 7b 0a 20  e->leafData ){. 
1b9a0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1b9b0 33 42 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c  3BtreeNext(pCur,
1b9c0 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73   pRes);.    }els
1b9d0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
1b9e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1b9f0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1ba00 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20  }.  *pRes = 0;. 
1ba10 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
1ba20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1ba30 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
1ba40 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  rc = moveToLeftm
1ba50 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 72 65 74  ost(pCur);.  ret
1ba60 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1ba70 20 53 74 65 70 20 74 68 65 20 63 75 72 73 6f 72   Step the cursor
1ba80 20 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20   to the back to 
1ba90 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74  the previous ent
1baa0 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
1bab0 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65  se.  If.** succe
1bac0 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a  ssful then set *
1bad0 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20  pRes=0.  If the 
1bae0 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c  cursor.** was al
1baf0 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74  ready pointing t
1bb00 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  o the first entr
1bb10 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
1bb20 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73  e before.** this
1bb30 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
1bb40 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70  led, then set *p
1bb50 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71  Res=1..*/.int sq
1bb60 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
1bb70 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  us(BtCursor *pCu
1bb80 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
1bb90 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e 6f 20   int rc;.  Pgno 
1bba0 70 67 6e 6f 3b 0a 20 20 4d 65 6d 50 61 67 65 20  pgno;.  MemPage 
1bbb0 2a 70 50 61 67 65 3b 0a 0a 23 69 66 6e 64 65 66  *pPage;..#ifndef
1bbc0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
1bbd0 52 45 44 5f 43 41 43 48 45 0a 20 20 72 63 20 3d  RED_CACHE.  rc =
1bbe0 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43   restoreOrClearC
1bbf0 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
1bc00 75 72 2c 20 31 29 3b 0a 20 20 69 66 28 20 72 63  ur, 1);.  if( rc
1bc10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1bc20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1bc30 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b  }.  if( pCur->sk
1bc40 69 70 3c 30 20 29 7b 0a 20 20 20 20 70 43 75 72  ip<0 ){.    pCur
1bc50 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20  ->skip = 0;.    
1bc60 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72  *pRes = 0;.    r
1bc70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1bc80 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69  .  }.  pCur->ski
1bc90 70 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  p = 0;.#endif.. 
1bca0 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
1bcb0 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
1bcc0 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  e ){.    *pRes =
1bcd0 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
1bce0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
1bcf0 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70   pPage = pCur->p
1bd00 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
1bd10 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
1bd20 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1bd30 3e 69 64 78 3e 3d 30 20 29 3b 0a 20 20 69 66 28  >idx>=0 );.  if(
1bd40 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
1bd50 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
1bd60 62 79 74 65 28 20 66 69 6e 64 43 65 6c 6c 28 70  byte( findCell(p
1bd70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29  Page, pCur->idx)
1bd80 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76   );.    rc = mov
1bd90 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70  eToChild(pCur, p
1bda0 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63  gno);.    if( rc
1bdb0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1bdc0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67    rc = moveToRig
1bdd0 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  htmost(pCur);.  
1bde0 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65  }else{.    while
1bdf0 28 20 70 43 75 72 2d 3e 69 64 78 3d 3d 30 20 29  ( pCur->idx==0 )
1be00 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 52 6f  {.      if( isRo
1be10 6f 74 50 61 67 65 28 70 50 61 67 65 29 20 29 7b  otPage(pPage) ){
1be20 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65  .        pCur->e
1be30 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
1be40 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20  NVALID;.        
1be50 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
1be60 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1be70 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
1be80 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28     moveToParent(
1be90 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61  pCur);.      pPa
1bea0 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
1beb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72  ;.    }.    pCur
1bec0 2d 3e 69 64 78 2d 2d 3b 0a 20 20 20 20 70 43 75  ->idx--;.    pCu
1bed0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
1bee0 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  0;.    if( pPage
1bef0 2d 3e 6c 65 61 66 44 61 74 61 20 26 26 20 21 70  ->leafData && !p
1bf00 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1bf10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1bf20 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43  BtreePrevious(pC
1bf30 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d  ur, pRes);.    }
1bf40 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1bf50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1bf60 7d 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20  }.  }.  *pRes = 
1bf70 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
1bf80 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
1bf90 65 20 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f  e a new page fro
1bfa0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
1bfb0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ile..**.** The n
1bfc0 65 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65  ew page is marke
1bfd0 64 20 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e  d as dirty.  (In
1bfe0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71   other words, sq
1bff0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1c000 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79  ).** has already
1c010 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20   been called on 
1c020 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20  the new page.)  
1c030 54 68 65 20 6e 65 77 20 70 61 67 65 20 68 61 73  The new page has
1c040 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65   also.** been re
1c050 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65  ferenced and the
1c060 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
1c070 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
1c080 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73  for calling.** s
1c090 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1c0a0 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61  () on the new pa
1c0b0 67 65 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f  ge when it is do
1c0c0 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  ne..**.** SQLITE
1c0d0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
1c0e0 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79  on success.  Any
1c0f0 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76 61   other return va
1c100 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a  lue indicates.**
1c110 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50   an error.  *ppP
1c120 61 67 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 61  age and *pPgno a
1c130 72 65 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20  re undefined in 
1c140 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20  the event of an 
1c150 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74  error..** Do not
1c160 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 50   invoke sqlite3P
1c170 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 2a  agerUnref() on *
1c180 70 70 50 61 67 65 20 69 66 20 61 6e 20 65 72 72  ppPage if an err
1c190 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  or is returned..
1c1a0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65  **.** If the "ne
1c1b0 61 72 62 79 22 20 70 61 72 61 6d 65 74 65 72 20  arby" parameter 
1c1c0 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61  is not 0, then a
1c1d0 20 28 66 65 65 62 6c 65 29 20 65 66 66 6f 72 74   (feeble) effort
1c1e0 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20   is made to .** 
1c1f0 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 63 6c  locate a page cl
1c200 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67 65 20  ose to the page 
1c210 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e  number "nearby".
1c220 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73    This can be us
1c230 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65  ed in an.** atte
1c240 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61  mpt to keep rela
1c250 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20  ted pages close 
1c260 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e  to each other in
1c270 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1c280 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20  le,.** which in 
1c290 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61  turn can make da
1c2a0 74 61 62 61 73 65 20 61 63 63 65 73 73 20 66 61  tabase access fa
1c2b0 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ster..**.** If t
1c2c0 68 65 20 22 65 78 61 63 74 22 20 70 61 72 61 6d  he "exact" param
1c2d0 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 61  eter is not 0, a
1c2e0 6e 64 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62  nd the page-numb
1c2f0 65 72 20 6e 65 61 72 62 79 20 65 78 69 73 74 73  er nearby exists
1c300 20 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e   .** anywhere on
1c310 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
1c320 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 65  then it is guare
1c330 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65 74 75  nteed to be retu
1c340 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 69 73  rned. This.** is
1c350 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 61 75   only used by au
1c360 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
1c370 73 65 73 20 77 68 65 6e 20 61 6c 6c 6f 63 61 74  ses when allocat
1c380 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 2e  ing a new table.
1c390 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
1c3a0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
1c3b0 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
1c3c0 74 2c 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a  t, .  MemPage **
1c3d0 70 70 50 61 67 65 2c 20 0a 20 20 50 67 6e 6f 20  ppPage, .  Pgno 
1c3e0 2a 70 50 67 6e 6f 2c 20 0a 20 20 50 67 6e 6f 20  *pPgno, .  Pgno 
1c3f0 6e 65 61 72 62 79 2c 0a 20 20 75 38 20 65 78 61  nearby,.  u8 exa
1c400 63 74 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  ct.){.  MemPage 
1c410 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72  *pPage1;.  int r
1c420 63 3b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  c;.  int n;     
1c430 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
1c440 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
1c450 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6b 3b 20 20  st */.  int k;  
1c460 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1c470 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72  leaves on the tr
1c480 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c  unk of the freel
1c490 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ist */.  MemPage
1c4a0 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20   *pTrunk = 0;.  
1c4b0 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72  MemPage *pPrevTr
1c4c0 75 6e 6b 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67  unk = 0;..  pPag
1c4d0 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
1c4e0 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65  ;.  n = get4byte
1c4f0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
1c500 33 36 5d 29 3b 0a 20 20 69 66 28 20 6e 3e 30 20  36]);.  if( n>0 
1c510 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  ){.    /* There 
1c520 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65  are pages on the
1c530 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73   freelist.  Reus
1c540 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70  e one of those p
1c550 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e  ages. */.    Pgn
1c560 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38  o iTrunk;.    u8
1c570 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
1c580 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d   /* If the free-
1c590 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73 65 61  list must be sea
1c5a0 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62  rched for 'nearb
1c5b0 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f  y' */.    .    /
1c5c0 2a 20 49 66 20 74 68 65 20 27 65 78 61 63 74 27  * If the 'exact'
1c5d0 20 70 61 72 61 6d 65 74 65 72 20 77 61 73 20 74   parameter was t
1c5e0 72 75 65 20 61 6e 64 20 61 20 71 75 65 72 79 20  rue and a query 
1c5f0 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  of the pointer-m
1c600 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20  ap.    ** shows 
1c610 74 68 61 74 20 74 68 65 20 70 61 67 65 20 27 6e  that the page 'n
1c620 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68  earby' is somewh
1c630 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ere on the free-
1c640 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a  list, then.    *
1c650 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73  * the entire-lis
1c660 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68  t will be search
1c670 65 64 20 66 6f 72 20 74 68 61 74 20 70 61 67 65  ed for that page
1c680 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ..    */.#ifndef
1c690 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1c6a0 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
1c6b0 65 78 61 63 74 20 29 7b 0a 20 20 20 20 20 20 75  exact ){.      u
1c6c0 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 61  8 eType;.      a
1c6d0 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30 20  ssert( nearby>0 
1c6e0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1c6f0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
1c700 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   );.      rc = p
1c710 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65  trmapGet(pBt, ne
1c720 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29  arby, &eType, 0)
1c730 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
1c740 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1c750 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
1c760 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a  MAP_FREEPAGE ){.
1c770 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
1c780 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  st = 1;.      }.
1c790 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e        *pPgno = n
1c7a0 65 61 72 62 79 3b 0a 20 20 20 20 7d 0a 23 65 6e  earby;.    }.#en
1c7b0 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72  dif..    /* Decr
1c7c0 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c  ement the free-l
1c7d0 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20  ist count by 1. 
1c7e0 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68  Set iTrunk to th
1c7f0 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20  e index of the. 
1c800 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65     ** first free
1c810 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
1c820 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20  . iPrevTrunk is 
1c830 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20  initially 1..   
1c840 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
1c850 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1c860 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
1c870 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
1c880 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74  turn rc;.    put
1c890 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
1c8a0 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a  Data[36], n-1);.
1c8b0 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65  .    /* The code
1c8c0 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f   within this loo
1c8d0 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e  p is run only on
1c8e0 63 65 20 69 66 20 74 68 65 20 27 73 65 61 72 63  ce if the 'searc
1c8f0 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a  hList' variable.
1c900 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72      ** is not tr
1c910 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ue. Otherwise, i
1c920 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20  t runs once for 
1c930 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20  each trunk-page 
1c940 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72  on the.    ** fr
1c950 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68  ee-list until th
1c960 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20  e page 'nearby' 
1c970 69 73 20 6c 6f 63 61 74 65 64 2e 0a 20 20 20 20  is located..    
1c980 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  */.    do {.    
1c990 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70    pPrevTrunk = p
1c9a0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28  Trunk;.      if(
1c9b0 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20   pPrevTrunk ){. 
1c9c0 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20         iTrunk = 
1c9d0 67 65 74 34 62 79 74 65 28 26 70 50 72 65 76 54  get4byte(&pPrevT
1c9e0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b  runk->aData[0]);
1c9f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1ca00 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67        iTrunk = g
1ca10 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
1ca20 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20  >aData[32]);.   
1ca30 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
1ca40 67 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72  getPage(pBt, iTr
1ca50 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29  unk, &pTrunk, 0)
1ca60 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
1ca70 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  {.        pTrunk
1ca80 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 0;.        go
1ca90 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
1caa0 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  page;.      }.. 
1cab0 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74       k = get4byt
1cac0 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
1cad0 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [4]);.      if( 
1cae0 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c  k==0 && !searchL
1caf0 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ist ){.        /
1cb00 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20  * The trunk has 
1cb10 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68  no leaves and th
1cb20 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65  e list is not be
1cb30 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20  ing searched. . 
1cb40 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74         ** So ext
1cb50 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70  ract the trunk p
1cb60 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75  age itself and u
1cb70 73 65 20 69 74 20 61 73 20 74 68 65 20 6e 65 77  se it as the new
1cb80 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ly .        ** a
1cb90 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f  llocated page */
1cba0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1cbb0 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29   pPrevTrunk==0 )
1cbc0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
1cbd0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1cbe0 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
1cbf0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1cc00 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
1cc10 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
1cc20 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
1cc30 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20  .        *pPgno 
1cc40 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = iTrunk;.      
1cc50 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31    memcpy(&pPage1
1cc60 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54  ->aData[32], &pT
1cc70 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
1cc80 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50  4);.        *ppP
1cc90 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  age = pTrunk;.  
1cca0 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30        pTrunk = 0
1ccb0 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  ;.        TRACE(
1ccc0 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74  ("ALLOCATE: %d t
1ccd0 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70  runk - %d free p
1cce0 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70  ages left\n", *p
1ccf0 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20  Pgno, n-1));.   
1cd00 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 70     }else if( k>p
1cd10 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34  Bt->usableSize/4
1cd20 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 20 20   - 8 ){.        
1cd30 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73  /* Value of k is
1cd40 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20   out of range.  
1cd50 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
1cd60 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  ion */.        r
1cd70 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
1cd80 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
1cd90 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
1cda0 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66  te_page;.#ifndef
1cdb0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1cdc0 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65  OVACUUM.      }e
1cdd0 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c 69  lse if( searchLi
1cde0 73 74 20 26 26 20 6e 65 61 72 62 79 3d 3d 69 54  st && nearby==iT
1cdf0 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
1ce00 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 62  /* The list is b
1ce10 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e  eing searched an
1ce20 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67  d this trunk pag
1ce30 65 20 69 73 20 74 68 65 20 70 61 67 65 0a 20 20  e is the page.  
1ce40 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f        ** to allo
1ce50 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73  cate, regardless
1ce60 20 6f 66 20 77 68 65 74 68 65 72 20 69 74 20 68   of whether it h
1ce70 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20  as leaves..     
1ce80 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
1ce90 73 65 72 74 28 20 2a 70 50 67 6e 6f 3d 3d 69 54  sert( *pPgno==iT
1cea0 72 75 6e 6b 20 29 3b 0a 20 20 20 20 20 20 20 20  runk );.        
1ceb0 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b  *ppPage = pTrunk
1cec0 3b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68  ;.        search
1ced0 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  List = 0;.      
1cee0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1cef0 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
1cf00 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
1cf10 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
1cf20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1cf30 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
1cf40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1cf50 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20   if( k==0 ){.   
1cf60 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65         if( !pPre
1cf70 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  vTrunk ){.      
1cf80 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
1cf90 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
1cfa0 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
1cfb0 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
1cfc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1cfd0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 72       memcpy(&pPr
1cfe0 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
1cff0 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
1d000 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
1d010 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
1d020 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
1d030 2a 20 54 68 65 20 74 72 75 6e 6b 20 70 61 67 65  * The trunk page
1d040 20 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20   is required by 
1d050 74 68 65 20 63 61 6c 6c 65 72 20 62 75 74 20 69  the caller but i
1d060 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20  t contains .    
1d070 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72        ** pointer
1d080 73 20 74 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c  s to free-list l
1d090 65 61 76 65 73 2e 20 54 68 65 20 66 69 72 73 74  eaves. The first
1d0a0 20 6c 65 61 66 20 62 65 63 6f 6d 65 73 20 61 20   leaf becomes a 
1d0b0 74 72 75 6e 6b 0a 20 20 20 20 20 20 20 20 20 20  trunk.          
1d0c0 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  ** page in this 
1d0d0 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20  case..          
1d0e0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d  */.          Mem
1d0f0 50 61 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b  Page *pNewTrunk;
1d100 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20  .          Pgno 
1d110 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65 74 34  iNewTrunk = get4
1d120 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
1d130 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20  ata[8]);.       
1d140 20 20 20 72 63 20 3d 20 67 65 74 50 61 67 65 28     rc = getPage(
1d150 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20  pBt, iNewTrunk, 
1d160 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a  &pNewTrunk, 0);.
1d170 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1d180 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1d190 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
1d1a0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
1d1b0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
1d1c0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1d1d0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1d1e0 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61  pNewTrunk->pDbPa
1d1f0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
1d200 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1d210 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1d220 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
1d230 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
1d240 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
1d250 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
1d260 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d270 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72    memcpy(&pNewTr
1d280 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26  unk->aData[0], &
1d290 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
1d2a0 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
1d2b0 70 75 74 34 62 79 74 65 28 26 70 4e 65 77 54 72  put4byte(&pNewTr
1d2c0 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b  unk->aData[4], k
1d2d0 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  -1);.          m
1d2e0 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b  emcpy(&pNewTrunk
1d2f0 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72  ->aData[8], &pTr
1d300 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20  unk->aData[12], 
1d310 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20  (k-1)*4);.      
1d320 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1d330 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  pNewTrunk);.    
1d340 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76        if( !pPrev
1d350 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
1d360 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1d370 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
1d380 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  , iNewTrunk);.  
1d390 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1d3a0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
1d3b0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1d3c0 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44  e(pPrevTrunk->pD
1d3d0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1d3e0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1d3f0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
1d400 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
1d410 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge;.            
1d420 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  }.            pu
1d430 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75  t4byte(&pPrevTru
1d440 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e  nk->aData[0], iN
1d450 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
1d460 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1d470 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
1d480 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43   0;.        TRAC
1d490 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
1d4a0 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65   trunk - %d free
1d4b0 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20   pages left\n", 
1d4c0 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23  *pPgno, n-1));.#
1d4d0 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73  endif.      }els
1d4e0 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78  e{.        /* Ex
1d4f0 74 72 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f  tract a leaf fro
1d500 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20  m the trunk */. 
1d510 20 20 20 20 20 20 20 69 6e 74 20 63 6c 6f 73 65         int close
1d520 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f  st;.        Pgno
1d530 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
1d540 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
1d550 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61  Data = pTrunk->a
1d560 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 72 63  Data;.        rc
1d570 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1d580 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
1d590 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
1d5a0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
1d5b0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
1d5c0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
1d5d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
1d5e0 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20 20   nearby>0 ){.   
1d5f0 20 20 20 20 20 20 20 69 6e 74 20 69 2c 20 64 69         int i, di
1d600 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c  st;.          cl
1d610 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  osest = 0;.     
1d620 20 20 20 20 20 64 69 73 74 20 3d 20 67 65 74 34       dist = get4
1d630 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20  byte(&aData[8]) 
1d640 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20 20  - nearby;.      
1d650 20 20 20 20 69 66 28 20 64 69 73 74 3c 30 20 29      if( dist<0 )
1d660 20 64 69 73 74 20 3d 20 2d 64 69 73 74 3b 0a 20   dist = -dist;. 
1d670 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31           for(i=1
1d680 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<k; i++){.   
1d690 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 32 20           int d2 
1d6a0 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74  = get4byte(&aDat
1d6b0 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72  a[8+i*4]) - near
1d6c0 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  by;.            
1d6d0 69 66 28 20 64 32 3c 30 20 29 20 64 32 20 3d 20  if( d2<0 ) d2 = 
1d6e0 2d 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20  -d2;.           
1d6f0 20 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b 0a   if( d2<dist ){.
1d700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c                cl
1d710 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20  osest = i;.     
1d720 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20           dist = 
1d730 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d2;.            
1d740 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
1d750 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1d760 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
1d770 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   0;.        }.. 
1d780 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67         iPage = g
1d790 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
1d7a0 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20  +closest*4]);.  
1d7b0 20 20 20 20 20 20 69 66 28 20 21 73 65 61 72 63        if( !searc
1d7c0 68 4c 69 73 74 20 7c 7c 20 69 50 61 67 65 3d 3d  hList || iPage==
1d7d0 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20 20  nearby ){.      
1d7e0 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61      *pPgno = iPa
1d7f0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ge;.          if
1d800 28 20 2a 70 50 67 6e 6f 3e 73 71 6c 69 74 65 33  ( *pPgno>sqlite3
1d810 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
1d820 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20  Bt->pPager) ){. 
1d830 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72             /* Fr
1d840 65 65 20 70 61 67 65 20 6f 66 66 20 74 68 65 20  ee page off the 
1d850 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
1d860 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  */.            r
1d870 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1d880 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
1d890 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1d8a0 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
1d8b0 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20 25  E: %d was leaf %
1d8c0 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b  d of %d on trunk
1d8d0 20 25 64 22 0a 20 20 20 20 20 20 20 20 20 20 20   %d".           
1d8e0 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65        ": %d more
1d8f0 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a   free pages\n",.
1d900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d910 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74   *pPgno, closest
1d920 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70  +1, k, pTrunk->p
1d930 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20  gno, n-1));.    
1d940 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73        if( closes
1d950 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  t<k-1 ){.       
1d960 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61       memcpy(&aDa
1d970 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c  ta[8+closest*4],
1d980 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20   &aData[4+k*4], 
1d990 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  4);.          }.
1d9a0 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
1d9b0 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d  te(&aData[4], k-
1d9c0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  1);.          rc
1d9d0 20 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c 20   = getPage(pBt, 
1d9e0 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  *pPgno, ppPage, 
1d9f0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  1);.          if
1da00 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1da10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
1da20 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1da30 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d  Write((*ppPage)-
1da40 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
1da50 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1da60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1da70 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
1da80 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
1da90 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1daa0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1dab0 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
1dac0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
1dad0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65      }.      rele
1dae0 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75  asePage(pPrevTru
1daf0 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76  nk);.      pPrev
1db00 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d  Trunk = 0;.    }
1db10 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73  while( searchLis
1db20 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t );.  }else{.  
1db30 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e    /* There are n
1db40 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  o pages on the f
1db50 72 65 65 6c 69 73 74 2c 20 73 6f 20 63 72 65 61  reelist, so crea
1db60 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 61 74  te a new page at
1db70 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 64 20   the.    ** end 
1db80 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  of the file */. 
1db90 20 20 20 2a 70 50 67 6e 6f 20 3d 20 73 71 6c 69     *pPgno = sqli
1dba0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
1dbb0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 2b  t(pBt->pPager) +
1dbc0 20 31 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   1;..#ifndef SQL
1dbd0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1dbe0 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
1dbf0 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50  >autoVacuum && P
1dc00 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
1dc10 2c 20 2a 70 50 67 6e 6f 29 20 29 7b 0a 20 20 20  , *pPgno) ){.   
1dc20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20     /* If *pPgno 
1dc30 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e  refers to a poin
1dc40 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c  ter-map page, al
1dc50 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70  locate two new p
1dc60 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74  ages.      ** at
1dc70 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1dc80 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  file instead of 
1dc90 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74 20 61  one. The first a
1dca0 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20  llocated page.  
1dcb0 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61      ** becomes a
1dcc0 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70   new pointer-map
1dcd0 20 70 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e   page, the secon
1dce0 64 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  d is used by the
1dcf0 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a   caller..      *
1dd00 2f 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  /.      TRACE(("
1dd10 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f  ALLOCATE: %d fro
1dd20 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70  m end of file (p
1dd30 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29  ointer-map page)
1dd40 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20  \n", *pPgno));. 
1dd50 20 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50       assert( *pP
1dd60 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
1dd70 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20  E_PAGE(pBt) );. 
1dd80 20 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b       (*pPgno)++;
1dd90 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
1dda0 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e     assert( *pPgn
1ddb0 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
1ddc0 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20  PAGE(pBt) );.   
1ddd0 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70 42   rc = getPage(pB
1dde0 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67  t, *pPgno, ppPag
1ddf0 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  e, 0);.    if( r
1de00 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1de10 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1de20 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61  agerWrite((*ppPa
1de30 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge)->pDbPage);. 
1de40 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1de50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1de60 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
1de70 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52  e);.    }.    TR
1de80 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
1de90 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66  %d from end of f
1dea0 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29  ile\n", *pPgno))
1deb0 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
1dec0 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47   *pPgno!=PENDING
1ded0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1dee0 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  );..end_allocate
1def0 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73 65  _page:.  release
1df00 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20  Page(pTrunk);.  
1df10 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65  releasePage(pPre
1df20 76 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72  vTrunk);.  retur
1df30 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
1df40 64 64 20 61 20 70 61 67 65 20 6f 66 20 74 68 65  dd a page of the
1df50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
1df60 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  o the freelist..
1df70 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  **.** sqlite3Pag
1df80 65 72 55 6e 72 65 66 28 29 20 69 73 20 4e 4f 54  erUnref() is NOT
1df90 20 63 61 6c 6c 65 64 20 66 6f 72 20 70 50 61 67   called for pPag
1dfa0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1dfb0 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67   freePage(MemPag
1dfc0 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 42 74 53  e *pPage){.  BtS
1dfd0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
1dfe0 67 65 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61  ge->pBt;.  MemPa
1dff0 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
1e000 2d 3e 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20  ->pPage1;.  int 
1e010 72 63 2c 20 6e 2c 20 6b 3b 0a 0a 20 20 2f 2a 20  rc, n, k;..  /* 
1e020 50 72 65 70 61 72 65 20 74 68 65 20 70 61 67 65  Prepare the page
1e030 20 66 6f 72 20 66 72 65 65 69 6e 67 20 2a 2f 0a   for freeing */.
1e040 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
1e050 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20 20 70 50 61  >pgno>1 );.  pPa
1e060 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
1e070 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
1e080 61 67 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20  age->pParent);. 
1e090 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20   pPage->pParent 
1e0a0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65  = 0;..  /* Incre
1e0b0 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20 70 61  ment the free pa
1e0c0 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67  ge count on pPag
1e0d0 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  e1 */.  rc = sql
1e0e0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1e0f0 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
1e100 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
1e110 72 6e 20 72 63 3b 0a 20 20 6e 20 3d 20 67 65 74  rn rc;.  n = get
1e120 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
1e130 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74  Data[36]);.  put
1e140 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
1e150 44 61 74 61 5b 33 36 5d 2c 20 6e 2b 31 29 3b 0a  Data[36], n+1);.
1e160 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
1e170 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f  ECURE_DELETE.  /
1e180 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f  * If the SQLITE_
1e190 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 63 6f  SECURE_DELETE co
1e1a0 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
1e1b0 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  n is enabled, th
1e1c0 65 6e 0a 20 20 2a 2a 20 61 6c 77 61 79 73 20 66  en.  ** always f
1e1d0 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64  ully overwrite d
1e1e0 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  eleted informati
1e1f0 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20  on with zeros.. 
1e200 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
1e210 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
1e220 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
1e230 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1e240 72 63 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61  rc;.  memset(pPa
1e250 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50  ge->aData, 0, pP
1e260 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  age->pBt->pageSi
1e270 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  ze);.#endif..#if
1e280 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1e290 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a  _AUTOVACUUM.  /*
1e2a0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
1e2b0 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76   supports auto-v
1e2c0 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20  acuum, write an 
1e2d0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69  entry in the poi
1e2e0 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f  nter-map.  ** to
1e2f0 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
1e300 68 65 20 70 61 67 65 20 69 73 20 66 72 65 65 2e  he page is free.
1e310 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
1e320 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
1e330 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
1e340 74 28 70 42 74 2c 20 70 50 61 67 65 2d 3e 70 67  t(pBt, pPage->pg
1e350 6e 6f 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50  no, PTRMAP_FREEP
1e360 41 47 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  AGE, 0);.    if(
1e370 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
1e380 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
1e390 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  f( n==0 ){.    /
1e3a0 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 66 69  * This is the fi
1e3b0 72 73 74 20 66 72 65 65 20 70 61 67 65 20 2a 2f  rst free page */
1e3c0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1e3d0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
1e3e0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
1e3f0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1e400 20 72 63 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28   rc;.    memset(
1e410 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c  pPage->aData, 0,
1e420 20 38 29 3b 0a 20 20 20 20 70 75 74 34 62 79 74   8);.    put4byt
1e430 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1e440 5b 33 32 5d 2c 20 70 50 61 67 65 2d 3e 70 67 6e  [32], pPage->pgn
1e450 6f 29 3b 0a 20 20 20 20 54 52 41 43 45 28 28 22  o);.    TRACE(("
1e460 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 66 69  FREE-PAGE: %d fi
1e470 72 73 74 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70  rst\n", pPage->p
1e480 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  gno));.  }else{.
1e490 20 20 20 20 2f 2a 20 4f 74 68 65 72 20 66 72 65      /* Other fre
1e4a0 65 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20  e pages already 
1e4b0 65 78 69 73 74 2e 20 20 52 65 74 72 69 76 65 20  exist.  Retrive 
1e4c0 74 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b 20  the first trunk 
1e4d0 70 61 67 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74  page.    ** of t
1e4e0 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e 64 20  he freelist and 
1e4f0 66 69 6e 64 20 6f 75 74 20 68 6f 77 20 6d 61 6e  find out how man
1e500 79 20 6c 65 61 76 65 73 20 69 74 20 68 61 73 2e  y leaves it has.
1e510 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   */.    MemPage 
1e520 2a 70 54 72 75 6e 6b 3b 0a 20 20 20 20 72 63 20  *pTrunk;.    rc 
1e530 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c 20 67  = getPage(pBt, g
1e540 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
1e550 3e 61 44 61 74 61 5b 33 32 5d 29 2c 20 26 70 54  >aData[32]), &pT
1e560 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66  runk, 0);.    if
1e570 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1e580 3b 0a 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79  ;.    k = get4by
1e590 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
1e5a0 61 5b 34 5d 29 3b 0a 20 20 20 20 69 66 28 20 6b  a[4]);.    if( k
1e5b0 3e 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  >=pBt->usableSiz
1e5c0 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20  e/4 - 8 ){.     
1e5d0 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 69 73   /* The trunk is
1e5e0 20 66 75 6c 6c 2e 20 20 54 75 72 6e 20 74 68 65   full.  Turn the
1e5f0 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   page being free
1e600 64 20 69 6e 74 6f 20 61 20 6e 65 77 0a 20 20 20  d into a new.   
1e610 20 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65     ** trunk page
1e620 20 77 69 74 68 20 6e 6f 20 6c 65 61 76 65 73 2e   with no leaves.
1e630 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
1e640 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1e650 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
1e660 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
1e670 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1e680 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65    put4byte(pPage
1e690 2d 3e 61 44 61 74 61 2c 20 70 54 72 75 6e 6b 2d  ->aData, pTrunk-
1e6a0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 70 75  >pgno);.      pu
1e6b0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
1e6c0 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 20  Data[4], 0);.   
1e6d0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
1e6e0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
1e6f0 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
1e700 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45      TRACE(("FREE
1e710 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72  -PAGE: %d new tr
1e720 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69  unk page replaci
1e730 6e 67 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ng %d\n",.      
1e740 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70          pPage->p
1e750 67 6e 6f 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e  gno, pTrunk->pgn
1e760 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  o));.    }else{.
1e770 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65        /* Add the
1e780 20 6e 65 77 6c 79 20 66 72 65 65 64 20 70 61 67   newly freed pag
1e790 65 20 61 73 20 61 20 6c 65 61 66 20 6f 6e 20 74  e as a leaf on t
1e7a0 68 65 20 63 75 72 72 65 6e 74 20 74 72 75 6e 6b  he current trunk
1e7b0 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
1e7c0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1e7d0 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
1e7e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
1e7f0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1e800 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72     put4byte(&pTr
1e810 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b  unk->aData[4], k
1e820 2b 31 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62  +1);.      put4b
1e830 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
1e840 74 61 5b 38 2b 6b 2a 34 5d 2c 20 70 50 61 67 65  ta[8+k*4], pPage
1e850 2d 3e 70 67 6e 6f 29 3b 0a 23 69 66 6e 64 65 66  ->pgno);.#ifndef
1e860 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44   SQLITE_SECURE_D
1e870 45 4c 45 54 45 0a 20 20 20 20 20 20 73 71 6c 69  ELETE.      sqli
1e880 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
1e890 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  e(pBt->pPager, p
1e8a0 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 23 65 6e  Page->pgno);.#en
1e8b0 64 69 66 0a 20 20 20 20 20 20 54 52 41 43 45 28  dif.      TRACE(
1e8c0 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20  ("FREE-PAGE: %d 
1e8d0 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61  leaf on trunk pa
1e8e0 67 65 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e  ge %d\n",pPage->
1e8f0 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e  pgno,pTrunk->pgn
1e900 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  o));.    }.    r
1e910 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e  eleasePage(pTrun
1e920 6b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  k);.  }.  return
1e930 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72   rc;.}../*.** Fr
1e940 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ee any overflow 
1e950 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64  pages associated
1e960 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
1e970 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Cell..*/.static 
1e980 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65  int clearCell(Me
1e990 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 6e  mPage *pPage, un
1e9a0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
1e9b0 6c 6c 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ll){.  BtShared 
1e9c0 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
1e9d0 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  t;.  CellInfo in
1e9e0 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50  fo;.  Pgno ovflP
1e9f0 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  gno;.  int rc;. 
1ea00 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 69 6e   int nOvfl;.  in
1ea10 74 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a  t ovflPageSize;.
1ea20 0a 20 20 70 61 72 73 65 43 65 6c 6c 50 74 72 28  .  parseCellPtr(
1ea30 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
1ea40 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f  nfo);.  if( info
1ea50 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 7b  .iOverflow==0 ){
1ea60 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1ea70 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76  TE_OK;  /* No ov
1ea80 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 52 65  erflow pages. Re
1ea90 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69  turn without doi
1eaa0 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20  ng anything */. 
1eab0 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20   }.  ovflPgno = 
1eac0 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  get4byte(&pCell[
1ead0 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29  info.iOverflow])
1eae0 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  ;.  ovflPageSize
1eaf0 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
1eb00 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20  ze - 4;.  nOvfl 
1eb10 3d 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  = (info.nPayload
1eb20 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b   - info.nLocal +
1eb30 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 2d 20   ovflPageSize - 
1eb40 31 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b  1)/ovflPageSize;
1eb50 0a 20 20 61 73 73 65 72 74 28 20 6f 76 66 6c 50  .  assert( ovflP
1eb60 67 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e  gno==0 || nOvfl>
1eb70 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f  0 );.  while( nO
1eb80 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 4d 65 6d  vfl-- ){.    Mem
1eb90 50 61 67 65 20 2a 70 4f 76 66 6c 3b 0a 20 20 20  Page *pOvfl;.   
1eba0 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30   if( ovflPgno==0
1ebb0 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 73 71 6c   || ovflPgno>sql
1ebc0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
1ebd0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20  nt(pBt->pPager) 
1ebe0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1ebf0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1ec00 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  KPT;.    }.    r
1ec10 63 20 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c  c = getPage(pBt,
1ec20 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66   ovflPgno, &pOvf
1ec30 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  l, 0);.    if( r
1ec40 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1ec50 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a     if( nOvfl ){.
1ec60 20 20 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d        ovflPgno =
1ec70 20 67 65 74 34 62 79 74 65 28 70 4f 76 66 6c 2d   get4byte(pOvfl-
1ec80 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20  >aData);.    }. 
1ec90 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
1eca0 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 73 71 6c  (pOvfl);.    sql
1ecb0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
1ecc0 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Ovfl->pDbPage);.
1ecd0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
1ece0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65  urn rc;.  }.  re
1ecf0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1ed00 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
1ed10 74 68 65 20 62 79 74 65 20 73 65 71 75 65 6e 63  the byte sequenc
1ed20 65 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73  e used to repres
1ed30 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61  ent a cell on pa
1ed40 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20  ge pPage.** and 
1ed50 77 72 69 74 65 20 74 68 61 74 20 62 79 74 65 20  write that byte 
1ed60 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43  sequence into pC
1ed70 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77  ell[].  Overflow
1ed80 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c   pages are.** al
1ed90 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c  located and fill
1eda0 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61  ed in as necessa
1edb0 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67  ry.  The calling
1edc0 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73   procedure.** is
1edd0 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
1ede0 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66   making sure suf
1edf0 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 68 61  ficient space ha
1ee00 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
1ee10 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e  .** for pCell[].
1ee20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
1ee30 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20   pCell does not 
1ee40 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64 20 74  necessary need t
1ee50 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70  o point to the p
1ee60 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61  Page->aData.** a
1ee70 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68  rea.  pCell migh
1ee80 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20  t point to some 
1ee90 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67  temporary storag
1eea0 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c  e.  The cell wil
1eeb0 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63  l.** be construc
1eec0 74 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70  ted in this temp
1eed0 6f 72 61 72 79 20 61 72 65 61 20 74 68 65 6e 20  orary area then 
1eee0 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67  copied into pPag
1eef0 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65  e->aData.** late
1ef00 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
1ef10 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d   fillInCell(.  M
1ef20 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
1ef30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ef40 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
1ef50 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c  ontains the cell
1ef60 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
1ef70 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20  har *pCell,     
1ef80 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65       /* Complete
1ef90 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c   text of the cel
1efa0 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  l */.  const voi
1efb0 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65  d *pKey, i64 nKe
1efc0 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79  y,    /* The key
1efd0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
1efe0 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61 74   *pData,int nDat
1eff0 61 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61  a,   /* The data
1f000 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a   */.  int *pnSiz
1f010 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
1f020 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65       /* Write ce
1f030 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a  ll size here */.
1f040 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61  ){.  int nPayloa
1f050 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  d;.  const u8 *p
1f060 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c  Src;.  int nSrc,
1f070 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73 70   n, rc;.  int sp
1f080 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61  aceLeft;.  MemPa
1f090 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20  ge *pOvfl = 0;. 
1f0a0 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c   MemPage *pToRel
1f0b0 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69  ease = 0;.  unsi
1f0c0 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f  gned char *pPrio
1f0d0 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  r;.  unsigned ch
1f0e0 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20  ar *pPayload;.  
1f0f0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1f100 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67  pPage->pBt;.  Pg
1f110 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b  no pgnoOvfl = 0;
1f120 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a  .  int nHeader;.
1f130 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
1f140 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74  ..  /* Fill in t
1f150 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20  he header. */.  
1f160 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 69  nHeader = 0;.  i
1f170 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
1f180 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b  ){.    nHeader +
1f190 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 4;.  }.  if( p
1f1a0 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b  Page->hasData ){
1f1b0 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20  .    nHeader += 
1f1c0 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  putVarint(&pCell
1f1d0 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44 61 74 61  [nHeader], nData
1f1e0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1f1f0 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 0a 20  nData = 0;.  }. 
1f200 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56   nHeader += putV
1f210 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65  arint(&pCell[nHe
1f220 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e  ader], *(u64*)&n
1f230 4b 65 79 29 3b 0a 20 20 70 61 72 73 65 43 65 6c  Key);.  parseCel
1f240 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
1f250 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73  l, &info);.  ass
1f260 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65 61 64 65  ert( info.nHeade
1f270 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b 0a 20 20  r==nHeader );.  
1f280 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65  assert( info.nKe
1f290 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 61 73 73  y==nKey );.  ass
1f2a0 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61 74 61 3d  ert( info.nData=
1f2b0 3d 6e 44 61 74 61 20 29 3b 0a 20 20 0a 20 20 2f  =nData );.  .  /
1f2c0 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61  * Fill in the pa
1f2d0 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50 61 79 6c  yload */.  nPayl
1f2e0 6f 61 64 20 3d 20 6e 44 61 74 61 3b 0a 20 20 69  oad = nData;.  i
1f2f0 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
1f300 20 29 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 70   ){.    pSrc = p
1f310 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d  Data;.    nSrc =
1f320 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44 61 74   nData;.    nDat
1f330 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  a = 0;.  }else{.
1f340 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20      nPayload += 
1f350 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d  nKey;.    pSrc =
1f360 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63 20   pKey;.    nSrc 
1f370 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70  = nKey;.  }.  *p
1f380 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69  nSize = info.nSi
1f390 7a 65 3b 0a 20 20 73 70 61 63 65 4c 65 66 74 20  ze;.  spaceLeft 
1f3a0 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  = info.nLocal;. 
1f3b0 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65   pPayload = &pCe
1f3c0 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70  ll[nHeader];.  p
1f3d0 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69  Prior = &pCell[i
1f3e0 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a  nfo.iOverflow];.
1f3f0 0a 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f  .  while( nPaylo
1f400 61 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20  ad>0 ){.    if( 
1f410 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a  spaceLeft==0 ){.
1f420 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1f430 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1f440 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74       Pgno pgnoPt
1f450 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b  rmap = pgnoOvfl;
1f460 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67   /* Overflow pag
1f470 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
1f480 74 72 79 20 70 61 67 65 20 2a 2f 0a 23 65 6e 64  try page */.#end
1f490 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c  if.      rc = al
1f4a0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1f4b0 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67  pBt, &pOvfl, &pg
1f4c0 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c  noOvfl, pgnoOvfl
1f4d0 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  , 0);.#ifndef SQ
1f4e0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1f4f0 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66  CUUM.      /* If
1f500 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75   the database su
1f510 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75  pports auto-vacu
1f520 75 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f  um, and the seco
1f530 6e 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74  nd or subsequent
1f540 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  .      ** overfl
1f550 6f 77 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  ow page is being
1f560 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20   allocated, add 
1f570 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20  an entry to the 
1f580 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20  pointer-map.    
1f590 20 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61    ** for that pa
1f5a0 67 65 20 6e 6f 77 2e 20 54 68 65 20 65 6e 74 72  ge now. The entr
1f5b0 79 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  y for the first 
1f5c0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 77 69  overflow page wi
1f5d0 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 61  ll be.      ** a
1f5e0 64 64 65 64 20 6c 61 74 65 72 2c 20 62 79 20 74  dded later, by t
1f5f0 68 65 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 20  he insertCell() 
1f600 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20 20 20 2a  routine..      *
1f610 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
1f620 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 70  >autoVacuum && p
1f630 67 6e 6f 50 74 72 6d 61 70 21 3d 30 20 26 26 20  gnoPtrmap!=0 && 
1f640 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1f650 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74  .        rc = pt
1f660 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e  rmapPut(pBt, pgn
1f670 6f 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56  oOvfl, PTRMAP_OV
1f680 45 52 46 4c 4f 57 32 2c 20 70 67 6e 6f 50 74 72  ERFLOW2, pgnoPtr
1f690 6d 61 70 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  map);.      }.#e
1f6a0 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 72  ndif.      if( r
1f6b0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  c ){.        rel
1f6c0 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
1f6d0 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ase);.        re
1f6e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1f6f0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
1f700 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c  pPrior, pgnoOvfl
1f710 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  );.      release
1f720 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
1f730 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61  ;.      pToRelea
1f740 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20  se = pOvfl;.    
1f750 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c    pPrior = pOvfl
1f760 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 70  ->aData;.      p
1f770 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20  ut4byte(pPrior, 
1f780 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c 6f  0);.      pPaylo
1f790 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61  ad = &pOvfl->aDa
1f7a0 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70 61  ta[4];.      spa
1f7b0 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75 73  ceLeft = pBt->us
1f7c0 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
1f7d0 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79    }.    n = nPay
1f7e0 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e  load;.    if( n>
1f7f0 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20  spaceLeft ) n = 
1f800 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 20 20 69  spaceLeft;.    i
1f810 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20  f( n>nSrc ) n = 
1f820 6e 53 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74  nSrc;.    assert
1f830 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20 6d 65  ( pSrc );.    me
1f840 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70  mcpy(pPayload, p
1f850 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 6e 50 61  Src, n);.    nPa
1f860 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20  yload -= n;.    
1f870 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20  pPayload += n;. 
1f880 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20     pSrc += n;.  
1f890 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20    nSrc -= n;.   
1f8a0 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b   spaceLeft -= n;
1f8b0 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3d 3d 30  .    if( nSrc==0
1f8c0 20 29 7b 0a 20 20 20 20 20 20 6e 53 72 63 20 3d   ){.      nSrc =
1f8d0 20 6e 44 61 74 61 3b 0a 20 20 20 20 20 20 70 53   nData;.      pS
1f8e0 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20  rc = pData;.    
1f8f0 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50  }.  }.  releaseP
1f900 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
1f910 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1f920 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  _OK;.}../*.** Ch
1f930 61 6e 67 65 20 74 68 65 20 4d 65 6d 50 61 67 65  ange the MemPage
1f940 2e 70 50 61 72 65 6e 74 20 70 6f 69 6e 74 65 72  .pParent pointer
1f950 20 6f 6e 20 74 68 65 20 70 61 67 65 20 77 68 6f   on the page who
1f960 73 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20  se number is.** 
1f970 67 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63  given in the sec
1f980 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 73 6f 20  ond argument so 
1f990 74 68 61 74 20 4d 65 6d 50 61 67 65 2e 70 50 61  that MemPage.pPa
1f9a0 72 65 6e 74 20 68 6f 6c 64 73 20 74 68 65 0a 2a  rent holds the.*
1f9b0 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65  * pointer in the
1f9c0 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 2e   third argument.
1f9d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
1f9e0 65 70 61 72 65 6e 74 50 61 67 65 28 42 74 53 68  eparentPage(BtSh
1f9f0 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
1fa00 70 67 6e 6f 2c 20 4d 65 6d 50 61 67 65 20 2a 70  pgno, MemPage *p
1fa10 4e 65 77 50 61 72 65 6e 74 2c 20 69 6e 74 20 69  NewParent, int i
1fa20 64 78 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  dx){.  MemPage *
1fa30 70 54 68 69 73 3b 0a 20 20 44 62 50 61 67 65 20  pThis;.  DbPage 
1fa40 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73  *pDbPage;..  ass
1fa50 65 72 74 28 20 70 4e 65 77 50 61 72 65 6e 74 21  ert( pNewParent!
1fa60 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f  =0 );.  if( pgno
1fa70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
1fa80 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
1fa90 28 20 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30  ( pBt->pPager!=0
1faa0 20 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20   );.  pDbPage = 
1fab0 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
1fac0 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  up(pBt->pPager, 
1fad0 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62  pgno);.  if( pDb
1fae0 50 61 67 65 20 29 7b 0a 20 20 20 20 70 54 68 69  Page ){.    pThi
1faf0 73 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73  s = (MemPage *)s
1fb00 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
1fb10 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  tra(pDbPage);.  
1fb20 20 20 69 66 28 20 70 54 68 69 73 2d 3e 69 73 49    if( pThis->isI
1fb30 6e 69 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73  nit ){.      ass
1fb40 65 72 74 28 20 70 54 68 69 73 2d 3e 61 44 61 74  ert( pThis->aDat
1fb50 61 3d 3d 28 73 71 6c 69 74 65 33 50 61 67 65 72  a==(sqlite3Pager
1fb60 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
1fb70 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ) );.      if( p
1fb80 54 68 69 73 2d 3e 70 50 61 72 65 6e 74 21 3d 70  This->pParent!=p
1fb90 4e 65 77 50 61 72 65 6e 74 20 29 7b 0a 20 20 20  NewParent ){.   
1fba0 20 20 20 20 20 69 66 28 20 70 54 68 69 73 2d 3e       if( pThis->
1fbb0 70 50 61 72 65 6e 74 20 29 20 73 71 6c 69 74 65  pParent ) sqlite
1fbc0 33 50 61 67 65 72 55 6e 72 65 66 28 70 54 68 69  3PagerUnref(pThi
1fbd0 73 2d 3e 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  s->pParent->pDbP
1fbe0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 54  age);.        pT
1fbf0 68 69 73 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70  his->pParent = p
1fc00 4e 65 77 50 61 72 65 6e 74 3b 0a 20 20 20 20 20  NewParent;.     
1fc10 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
1fc20 65 66 28 70 4e 65 77 50 61 72 65 6e 74 2d 3e 70  ef(pNewParent->p
1fc30 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d  DbPage);.      }
1fc40 0a 20 20 20 20 20 20 70 54 68 69 73 2d 3e 69 64  .      pThis->id
1fc50 78 50 61 72 65 6e 74 20 3d 20 69 64 78 3b 0a 20  xParent = idx;. 
1fc60 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1fc70 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
1fc80 67 65 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  ge);.  }..#ifnde
1fc90 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1fca0 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20 70  TOVACUUM.  if( p
1fcb0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
1fcc0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 74 72  {.    return ptr
1fcd0 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
1fce0 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
1fcf0 70 4e 65 77 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  pNewParent->pgno
1fd00 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
1fd10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1fd20 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  ;.}..../*.** Cha
1fd30 6e 67 65 20 74 68 65 20 70 50 61 72 65 6e 74 20  nge the pParent 
1fd40 70 6f 69 6e 74 65 72 20 6f 66 20 61 6c 6c 20 63  pointer of all c
1fd50 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 67 65  hildren of pPage
1fd60 20 74 6f 20 70 6f 69 6e 74 20 62 61 63 6b 0a 2a   to point back.*
1fd70 2a 20 74 6f 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a  * to pPage..**.*
1fd80 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  * In other words
1fd90 2c 20 66 6f 72 20 65 76 65 72 79 20 63 68 69 6c  , for every chil
1fda0 64 20 6f 66 20 70 50 61 67 65 2c 20 69 6e 76 6f  d of pPage, invo
1fdb0 6b 65 20 72 65 70 61 72 65 6e 74 50 61 67 65 28  ke reparentPage(
1fdc0 29 0a 2a 2a 20 74 6f 20 6d 61 6b 65 20 73 75 72  ).** to make sur
1fdd0 65 20 74 68 61 74 20 65 61 63 68 20 63 68 69 6c  e that each chil
1fde0 64 20 6b 6e 6f 77 73 20 74 68 61 74 20 70 50 61  d knows that pPa
1fdf0 67 65 20 69 73 20 69 74 73 20 70 61 72 65 6e 74  ge is its parent
1fe00 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1fe10 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64  tine gets called
1fe20 20 61 66 74 65 72 20 79 6f 75 20 6d 65 6d 63 70   after you memcp
1fe30 79 28 29 20 6f 6e 65 20 70 61 67 65 20 69 6e 74  y() one page int
1fe40 6f 0a 2a 2a 20 61 6e 6f 74 68 65 72 2e 0a 2a 2f  o.** another..*/
1fe50 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 70 61  .static int repa
1fe60 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73 28 4d  rentChildPages(M
1fe70 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
1fe80 20 20 69 6e 74 20 69 3b 0a 20 20 42 74 53 68 61    int i;.  BtSha
1fe90 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
1fea0 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
1feb0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
1fec0 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
1fed0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1fee0 4f 4b 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  OK;..  for(i=0; 
1fef0 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20  i<pPage->nCell; 
1ff00 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43  i++){.    u8 *pC
1ff10 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
1ff20 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 69 66  Page, i);.    if
1ff30 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
1ff40 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 70  {.      rc = rep
1ff50 61 72 65 6e 74 50 61 67 65 28 70 42 74 2c 20 67  arentPage(pBt, g
1ff60 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 2c 20  et4byte(pCell), 
1ff70 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20  pPage, i);.     
1ff80 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1ff90 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
1ffa0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
1ffb0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
1ffc0 20 20 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e      rc = reparen
1ffd0 74 50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62  tPage(pBt, get4b
1ffe0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
1fff0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
20000 65 74 2b 38 5d 29 2c 20 0a 20 20 20 20 20 20 20  et+8]), .       
20010 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 70  pPage, i);.    p
20020 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d  Page->idxShift =
20030 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
20040 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
20050 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20 63 65  move the i-th ce
20060 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 20 20  ll from pPage.  
20070 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 66 66  This routine eff
20080 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e  ects pPage only.
20090 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e  .** The cell con
200a0 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72 65 65  tent is not free
200b0 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 64  d or deallocated
200c0 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  .  It is assumed
200d0 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c   that.** the cel
200e0 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65  l content has be
200f0 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c  en copied somepl
20100 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69 73 20  ace else.  This 
20110 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20  routine just.** 
20120 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65 66 65  removes the refe
20130 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 65 6c  rence to the cel
20140 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a  l from pPage..**
20150 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20 62 65  .** "sz" must be
20160 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
20170 79 74 65 73 20 69 6e 20 74 68 65 20 63 65 6c 6c  ytes in the cell
20180 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
20190 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67   dropCell(MemPag
201a0 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 64  e *pPage, int id
201b0 78 2c 20 69 6e 74 20 73 7a 29 7b 0a 20 20 69 6e  x, int sz){.  in
201c0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  t i;          /*
201d0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
201e0 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20  .  int pc;      
201f0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
20200 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20  cell content of 
20210 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74  cell being delet
20220 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  ed */.  u8 *data
20230 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65  ;       /* pPage
20240 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20  ->aData */.  u8 
20250 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  *ptr;        /* 
20260 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74  Used to move byt
20270 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e  es around within
20280 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 61 73   data[] */..  as
20290 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20  sert( idx>=0 && 
202a0 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx<pPage->nCell
202b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a   );.  assert( sz
202c0 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67 65  ==cellSize(pPage
202d0 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73 65  , idx) );.  asse
202e0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
202f0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
20300 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
20310 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
20320 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 64  Data;.  ptr = &d
20330 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  ata[pPage->cellO
20340 66 66 73 65 74 20 2b 20 32 2a 69 64 78 5d 3b 0a  ffset + 2*idx];.
20350 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
20360 70 74 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ptr);.  assert( 
20370 70 63 3e 31 30 20 26 26 20 70 63 2b 73 7a 3c 3d  pc>10 && pc+sz<=
20380 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
20390 6c 65 53 69 7a 65 20 29 3b 0a 20 20 66 72 65 65  leSize );.  free
203a0 53 70 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c  Space(pPage, pc,
203b0 20 73 7a 29 3b 0a 20 20 66 6f 72 28 69 3d 69 64   sz);.  for(i=id
203c0 78 2b 31 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43  x+1; i<pPage->nC
203d0 65 6c 6c 3b 20 69 2b 2b 2c 20 70 74 72 2b 3d 32  ell; i++, ptr+=2
203e0 29 7b 0a 20 20 20 20 70 74 72 5b 30 5d 20 3d 20  ){.    ptr[0] = 
203f0 70 74 72 5b 32 5d 3b 0a 20 20 20 20 70 74 72 5b  ptr[2];.    ptr[
20400 31 5d 20 3d 20 70 74 72 5b 33 5d 3b 0a 20 20 7d  1] = ptr[3];.  }
20410 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d  .  pPage->nCell-
20420 2d 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  -;.  put2byte(&d
20430 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
20440 66 73 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e  fset+3], pPage->
20450 6e 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d  nCell);.  pPage-
20460 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20 70  >nFree += 2;.  p
20470 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d  Page->idxShift =
20480 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73   1;.}../*.** Ins
20490 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f  ert a new cell o
204a0 6e 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20  n pPage at cell 
204b0 69 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c  index "i".  pCel
204c0 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a  l points to the.
204d0 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  ** content of th
204e0 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  e cell..**.** If
204f0 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
20500 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68  t will fit on th
20510 65 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74  e page, then put
20520 20 69 74 20 74 68 65 72 65 2e 20 20 49 66 20 69   it there.  If i
20530 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69  t.** will not fi
20540 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63  t, then make a c
20550 6f 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  opy of the cell 
20560 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65  content into pTe
20570 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69  mp if.** pTemp i
20580 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67  s not null.  Reg
20590 61 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70  ardless of pTemp
205a0 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  , allocate a new
205b0 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61   entry.** in pPa
205c0 67 65 2d 3e 61 4f 76 66 6c 5b 5d 20 61 6e 64 20  ge->aOvfl[] and 
205d0 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f  make it point to
205e0 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
205f0 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20  t (either.** in 
20600 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69  pTemp or the ori
20610 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64  ginal pCell) and
20620 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73   also record its
20630 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f   index. .** Allo
20640 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74  cating a new ent
20650 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65  ry in pPage->aCe
20660 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61  ll[] implies tha
20670 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76  t .** pPage->nOv
20680 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d  erflow is increm
20690 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ented..**.** If 
206a0 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  nSkip is non-zer
206b0 6f 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63  o, then do not c
206c0 6f 70 79 20 74 68 65 20 66 69 72 73 74 20 6e 53  opy the first nS
206d0 6b 69 70 20 62 79 74 65 73 20 6f 66 20 74 68 65  kip bytes of the
206e0 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 61  .** cell. The ca
206f0 6c 6c 65 72 20 77 69 6c 6c 20 6f 76 65 72 77 72  ller will overwr
20700 69 74 65 20 74 68 65 6d 20 61 66 74 65 72 20 74  ite them after t
20710 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
20720 75 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69  urns. If.** nSki
20730 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  p is non-zero, t
20740 68 65 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f  hen pCell may no
20750 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e  t point to an in
20760 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63  valid memory loc
20770 61 74 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70  ation .** (but p
20780 43 65 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c  Cell+nSkip is al
20790 77 61 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a  ways valid)..*/.
207a0 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 65 72  static int inser
207b0 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  tCell(.  MemPage
207c0 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61   *pPage,   /* Pa
207d0 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65  ge into which we
207e0 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a   are copying */.
207f0 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20    int i,        
20800 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20      /* New cell 
20810 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68  becomes the i-th
20820 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67   cell of the pag
20830 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  e */.  u8 *pCell
20840 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74  ,        /* Cont
20850 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63  ent of the new c
20860 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c  ell */.  int sz,
20870 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
20880 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69  tes of content i
20890 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  n pCell */.  u8 
208a0 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f  *pTemp,        /
208b0 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73  * Temp storage s
208c0 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20  pace for pCell, 
208d0 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 75  if needed */.  u
208e0 38 20 6e 53 6b 69 70 20 20 20 20 20 20 20 20 20  8 nSkip         
208f0 20 2f 2a 20 44 6f 20 6e 6f 74 20 77 72 69 74 65   /* Do not write
20900 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70   the first nSkip
20910 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 63 65   bytes of the ce
20920 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ll */.){.  int i
20930 64 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dx;          /* 
20940 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e  Where to write n
20950 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  ew cell content 
20960 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  in data[] */.  i
20970 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  nt j;           
20980 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
20990 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20   */.  int top;  
209a0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
209b0 20 62 79 74 65 20 6f 66 20 63 6f 6e 74 65 6e 74   byte of content
209c0 20 66 6f 72 20 61 6e 79 20 63 65 6c 6c 20 69 6e   for any cell in
209d0 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
209e0 20 65 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f   end;          /
209f0 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73  * First byte pas
20a00 74 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20  t the last cell 
20a10 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b  pointer in data[
20a20 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 3b 20  ] */.  int ins; 
20a30 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
20a40 78 20 69 6e 20 64 61 74 61 5b 5d 20 77 68 65 72  x in data[] wher
20a50 65 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74  e new cell point
20a60 65 72 20 69 73 20 69 6e 73 65 72 74 65 64 20 2a  er is inserted *
20a70 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
20a80 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
20a90 69 6e 74 6f 20 64 61 74 61 5b 5d 20 6f 66 20 74  into data[] of t
20aa0 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  he page header *
20ab0 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73  /.  int cellOffs
20ac0 65 74 3b 20 20 20 2f 2a 20 41 64 64 72 65 73 73  et;   /* Address
20ad0 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 70   of first cell p
20ae0 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d  ointer in data[]
20af0 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
20b00 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
20b10 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68  ontent of the wh
20b20 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  ole page */.  u8
20b30 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 20 20   *ptr;          
20b40 2f 2a 20 55 73 65 64 20 66 6f 72 20 6d 6f 76 69  /* Used for movi
20b50 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ng information a
20b60 72 6f 75 6e 64 20 69 6e 20 64 61 74 61 5b 5d 20  round in data[] 
20b70 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 3e  */..  assert( i>
20b80 3d 30 20 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e  =0 && i<=pPage->
20b90 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76  nCell+pPage->nOv
20ba0 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65  erflow );.  asse
20bb0 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65  rt( sz==cellSize
20bc0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
20bd0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
20be0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
20bf0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
20c00 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20  bPage) );.  if( 
20c10 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
20c20 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e   || sz+2>pPage->
20c30 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 69 66 28  nFree ){.    if(
20c40 20 70 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20   pTemp ){.      
20c50 6d 65 6d 63 70 79 28 70 54 65 6d 70 2b 6e 53 6b  memcpy(pTemp+nSk
20c60 69 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c  ip, pCell+nSkip,
20c70 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20   sz-nSkip);.    
20c80 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b    pCell = pTemp;
20c90 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70  .    }.    j = p
20ca0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b  Page->nOverflow+
20cb0 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  +;.    assert( j
20cc0 3c 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61  <sizeof(pPage->a
20cd0 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61  Ovfl)/sizeof(pPa
20ce0 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 20 29 3b  ge->aOvfl[0]) );
20cf0 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66  .    pPage->aOvf
20d00 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d 20 70 43 65  l[j].pCell = pCe
20d10 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61  ll;.    pPage->a
20d20 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20 3d 20 69 3b  Ovfl[j].idx = i;
20d30 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
20d40 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 0;.  }else{.
20d50 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65      data = pPage
20d60 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 68 64 72  ->aData;.    hdr
20d70 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
20d80 73 65 74 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67  set;.    top = g
20d90 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
20da0 72 2b 35 5d 29 3b 0a 20 20 20 20 63 65 6c 6c 4f  r+5]);.    cellO
20db0 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63  ffset = pPage->c
20dc0 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 65  ellOffset;.    e
20dd0 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  nd = cellOffset 
20de0 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  + 2*pPage->nCell
20df0 20 2b 20 32 3b 0a 20 20 20 20 69 6e 73 20 3d 20   + 2;.    ins = 
20e00 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69  cellOffset + 2*i
20e10 3b 0a 20 20 20 20 69 66 28 20 65 6e 64 20 3e 20  ;.    if( end > 
20e20 74 6f 70 20 2d 20 73 7a 20 29 7b 0a 20 20 20 20  top - sz ){.    
20e30 20 20 69 6e 74 20 72 63 20 3d 20 64 65 66 72 61    int rc = defra
20e40 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 29  gmentPage(pPage)
20e50 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
20e60 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
20e70 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 74 6f 70  rn rc;.      top
20e80 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
20e90 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20  a[hdr+5]);.     
20ea0 20 61 73 73 65 72 74 28 20 65 6e 64 20 2b 20 73   assert( end + s
20eb0 7a 20 3c 3d 20 74 6f 70 20 29 3b 0a 20 20 20 20  z <= top );.    
20ec0 7d 0a 20 20 20 20 69 64 78 20 3d 20 61 6c 6c 6f  }.    idx = allo
20ed0 63 61 74 65 53 70 61 63 65 28 70 50 61 67 65 2c  cateSpace(pPage,
20ee0 20 73 7a 29 3b 0a 20 20 20 20 61 73 73 65 72 74   sz);.    assert
20ef0 28 20 69 64 78 3e 30 20 29 3b 0a 20 20 20 20 61  ( idx>0 );.    a
20f00 73 73 65 72 74 28 20 65 6e 64 20 3c 3d 20 67 65  ssert( end <= ge
20f10 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
20f20 2b 35 5d 29 20 29 3b 0a 20 20 20 20 70 50 61 67  +5]) );.    pPag
20f30 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20  e->nCell++;.    
20f40 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20  pPage->nFree -= 
20f50 32 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  2;.    memcpy(&d
20f60 61 74 61 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c 20  ata[idx+nSkip], 
20f70 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d  pCell+nSkip, sz-
20f80 6e 53 6b 69 70 29 3b 0a 20 20 20 20 66 6f 72 28  nSkip);.    for(
20f90 6a 3d 65 6e 64 2d 32 2c 20 70 74 72 3d 26 64 61  j=end-2, ptr=&da
20fa0 74 61 5b 6a 5d 3b 20 6a 3e 69 6e 73 3b 20 6a 2d  ta[j]; j>ins; j-
20fb0 3d 32 2c 20 70 74 72 2d 3d 32 29 7b 0a 20 20 20  =2, ptr-=2){.   
20fc0 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b     ptr[0] = ptr[
20fd0 2d 32 5d 3b 0a 20 20 20 20 20 20 70 74 72 5b 31  -2];.      ptr[1
20fe0 5d 20 3d 20 70 74 72 5b 2d 31 5d 3b 0a 20 20 20  ] = ptr[-1];.   
20ff0 20 7d 0a 20 20 20 20 70 75 74 32 62 79 74 65 28   }.    put2byte(
21000 26 64 61 74 61 5b 69 6e 73 5d 2c 20 69 64 78 29  &data[ins], idx)
21010 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
21020 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61  data[hdr+3], pPa
21030 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20 20  ge->nCell);.    
21040 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20  pPage->idxShift 
21050 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 1;.#ifndef SQL
21060 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
21070 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67  UUM.    if( pPag
21080 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  e->pBt->autoVacu
21090 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  um ){.      /* T
210a0 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74  he cell may cont
210b0 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ain a pointer to
210c0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
210d0 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a  e. If so, write.
210e0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74        ** the ent
210f0 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ry for the overf
21100 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68  low page into th
21110 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20  e pointer map.. 
21120 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 43 65       */.      Ce
21130 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
21140 20 20 20 70 61 72 73 65 43 65 6c 6c 50 74 72 28     parseCellPtr(
21150 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
21160 6e 66 6f 29 3b 0a 20 20 20 20 20 20 61 73 73 65  nfo);.      asse
21170 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b  rt( (info.nData+
21180 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30  (pPage->intKey?0
21190 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e  :info.nKey))==in
211a0 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20  fo.nPayload );. 
211b0 20 20 20 20 20 69 66 28 20 28 69 6e 66 6f 2e 6e       if( (info.n
211c0 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74  Data+(pPage->int
211d0 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29  Key?0:info.nKey)
211e0 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  )>info.nLocal ){
211f0 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 70 67  .        Pgno pg
21200 6e 6f 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  noOvfl = get4byt
21210 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
21220 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20  verflow]);.     
21230 20 20 20 69 6e 74 20 72 63 20 3d 20 70 74 72 6d     int rc = ptrm
21240 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74  apPut(pPage->pBt
21250 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d  , pgnoOvfl, PTRM
21260 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50  AP_OVERFLOW1, pP
21270 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  age->pgno);.    
21280 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
21290 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
212a0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
212b0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 72  .#endif.  }..  r
212c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
212d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
212e0 6c 69 73 74 20 6f 66 20 63 65 6c 6c 73 20 74 6f  list of cells to
212f0 20 61 20 70 61 67 65 2e 20 20 54 68 65 20 70 61   a page.  The pa
21300 67 65 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69  ge should be ini
21310 74 69 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a  tially empty..**
21320 20 54 68 65 20 63 65 6c 6c 73 20 61 72 65 20 67   The cells are g
21330 75 61 72 61 6e 74 65 65 64 20 74 6f 20 66 69 74  uaranteed to fit
21340 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f   on the page..*/
21350 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73  .static void ass
21360 65 6d 62 6c 65 50 61 67 65 28 0a 20 20 4d 65 6d  emblePage(.  Mem
21370 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f  Page *pPage,   /
21380 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20 62 65  * The page to be
21390 20 61 73 73 65 6d 62 6c 69 65 64 20 2a 2f 0a 20   assemblied */. 
213a0 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20   int nCell,     
213b0 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72     /* The number
213c0 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 64 64   of cells to add
213d0 20 74 6f 20 74 68 69 73 20 70 61 67 65 20 2a 2f   to this page */
213e0 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20  .  u8 **apCell, 
213f0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73       /* Pointers
21400 20 74 6f 20 63 65 6c 6c 20 62 6f 64 69 65 73 20   to cell bodies 
21410 2a 2f 0a 20 20 69 6e 74 20 2a 61 53 69 7a 65 20  */.  int *aSize 
21420 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20         /* Sizes 
21430 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 2a 2f 0a  of the cells */.
21440 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
21450 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
21460 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
21470 74 6f 74 61 6c 53 69 7a 65 3b 20 20 20 20 2f 2a  totalSize;    /*
21480 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 61   Total size of a
21490 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 69 6e  ll cells */.  in
214a0 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  t hdr;          
214b0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 70 61 67 65  /* Index of page
214c0 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
214d0 20 63 65 6c 6c 70 74 72 3b 20 20 20 20 20 20 2f   cellptr;      /
214e0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78  * Address of nex
214f0 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  t cell pointer *
21500 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 62 6f 64 79  /.  int cellbody
21510 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  ;     /* Address
21520 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 62 6f   of next cell bo
21530 64 79 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  dy */.  u8 *data
21540 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  ;         /* Dat
21550 61 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a  a for the page *
21560 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
21570 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
21580 20 29 3b 0a 20 20 74 6f 74 61 6c 53 69 7a 65 20   );.  totalSize 
21590 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
215a0 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
215b0 20 20 20 74 6f 74 61 6c 53 69 7a 65 20 2b 3d 20     totalSize += 
215c0 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 7d 0a 20 20  aSize[i];.  }.  
215d0 61 73 73 65 72 74 28 20 74 6f 74 61 6c 53 69 7a  assert( totalSiz
215e0 65 2b 32 2a 6e 43 65 6c 6c 3c 3d 70 50 61 67 65  e+2*nCell<=pPage
215f0 2d 3e 6e 46 72 65 65 20 29 3b 0a 20 20 61 73 73  ->nFree );.  ass
21600 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
21610 6c 3d 3d 30 20 29 3b 0a 20 20 63 65 6c 6c 70 74  l==0 );.  cellpt
21620 72 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  r = pPage->cellO
21630 66 66 73 65 74 3b 0a 20 20 64 61 74 61 20 3d 20  ffset;.  data = 
21640 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
21650 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
21660 4f 66 66 73 65 74 3b 0a 20 20 70 75 74 32 62 79  Offset;.  put2by
21670 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c  te(&data[hdr+3],
21680 20 6e 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20 6e   nCell);.  if( n
21690 43 65 6c 6c 20 29 7b 0a 20 20 20 20 63 65 6c 6c  Cell ){.    cell
216a0 62 6f 64 79 20 3d 20 61 6c 6c 6f 63 61 74 65 53  body = allocateS
216b0 70 61 63 65 28 70 50 61 67 65 2c 20 74 6f 74 61  pace(pPage, tota
216c0 6c 53 69 7a 65 29 3b 0a 20 20 20 20 61 73 73 65  lSize);.    asse
216d0 72 74 28 20 63 65 6c 6c 62 6f 64 79 3e 30 20 29  rt( cellbody>0 )
216e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
216f0 61 67 65 2d 3e 6e 46 72 65 65 20 3e 3d 20 32 2a  age->nFree >= 2*
21700 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 50 61  nCell );.    pPa
21710 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 32 2a 6e  ge->nFree -= 2*n
21720 43 65 6c 6c 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Cell;.    for(i=
21730 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
21740 7b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65  {.      put2byte
21750 28 26 64 61 74 61 5b 63 65 6c 6c 70 74 72 5d 2c  (&data[cellptr],
21760 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 20 20   cellbody);.    
21770 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63    memcpy(&data[c
21780 65 6c 6c 62 6f 64 79 5d 2c 20 61 70 43 65 6c 6c  ellbody], apCell
21790 5b 69 5d 2c 20 61 53 69 7a 65 5b 69 5d 29 3b 0a  [i], aSize[i]);.
217a0 20 20 20 20 20 20 63 65 6c 6c 70 74 72 20 2b 3d        cellptr +=
217b0 20 32 3b 0a 20 20 20 20 20 20 63 65 6c 6c 62 6f   2;.      cellbo
217c0 64 79 20 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a  dy += aSize[i];.
217d0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
217e0 28 20 63 65 6c 6c 62 6f 64 79 3d 3d 70 50 61 67  ( cellbody==pPag
217f0 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
21800 7a 65 20 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67  ze );.  }.  pPag
21810 65 2d 3e 6e 43 65 6c 6c 20 3d 20 6e 43 65 6c 6c  e->nCell = nCell
21820 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
21830 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65 74  ollowing paramet
21840 65 72 73 20 64 65 74 65 72 6d 69 6e 65 20 68 6f  ers determine ho
21850 77 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74 20  w many adjacent 
21860 70 61 67 65 73 20 67 65 74 20 69 6e 76 6f 6c 76  pages get involv
21870 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61 6e  ed.** in a balan
21880 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20  cing operation. 
21890 20 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65   NN is the numbe
218a0 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f  r of neighbors o
218b0 6e 20 65 69 74 68 65 72 20 73 69 64 65 0a 2a 2a  n either side.**
218c0 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 68 61   of the page tha
218d0 74 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e  t participate in
218e0 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20 6f   the balancing o
218f0 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69 73  peration.  NB is
21900 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75   the.** total nu
21910 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
21920 61 74 20 70 61 72 74 69 63 69 70 61 74 65 2c 20  at participate, 
21930 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 61  including the ta
21940 72 67 65 74 20 70 61 67 65 20 61 6e 64 0a 2a 2a  rget page and.**
21950 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e   NN neighbors on
21960 20 65 69 74 68 65 72 20 73 69 64 65 2e 0a 2a 2a   either side..**
21970 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20  .** The minimum 
21980 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20 31  value of NN is 1
21990 20 28 6f 66 20 63 6f 75 72 73 65 29 2e 20 20 49   (of course).  I
219a0 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20 61 62 6f  ncreasing NN abo
219b0 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f 72  ve 1.** (to 2 or
219c0 20 33 29 20 67 69 76 65 73 20 61 20 6d 6f 64 65   3) gives a mode
219d0 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 69  st improvement i
219e0 6e 20 53 45 4c 45 43 54 20 61 6e 64 20 44 45 4c  n SELECT and DEL
219f0 45 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a  ETE performance.
21a00 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67 65 20 66  ** in exchange f
21a10 6f 72 20 61 20 6c 61 72 67 65 72 20 64 65 67 72  or a larger degr
21a20 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45 52  adation in INSER
21a30 54 20 61 6e 64 20 55 50 44 41 54 45 20 70 65 72  T and UPDATE per
21a40 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65  formance..** The
21a50 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70 70   value of NN app
21a60 65 61 72 73 20 74 6f 20 67 69 76 65 20 74 68 65  ears to give the
21a70 20 62 65 73 74 20 72 65 73 75 6c 74 73 20 6f 76   best results ov
21a80 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e  erall..*/.#defin
21a90 65 20 4e 4e 20 31 20 20 20 20 20 20 20 20 20 20  e NN 1          
21aa0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
21ab0 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74  neighbors on eit
21ac0 68 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67  her side of pPag
21ad0 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42 20  e */.#define NB 
21ae0 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f 2a  (NN*2+1)      /*
21af0 20 54 6f 74 61 6c 20 70 61 67 65 73 20 69 6e 76   Total pages inv
21b00 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 62 61 6c  olved in the bal
21b10 61 6e 63 65 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77  ance */../* Forw
21b20 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
21b30 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61  .static int bala
21b40 6e 63 65 28 4d 65 6d 50 61 67 65 2a 2c 20 69 6e  nce(MemPage*, in
21b50 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  t);..#ifndef SQL
21b60 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41  ITE_OMIT_QUICKBA
21b70 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73  LANCE./*.** This
21b80 20 76 65 72 73 69 6f 6e 20 6f 66 20 62 61 6c 61   version of bala
21b90 6e 63 65 28 29 20 68 61 6e 64 6c 65 73 20 74 68  nce() handles th
21ba0 65 20 63 6f 6d 6d 6f 6e 20 73 70 65 63 69 61 6c  e common special
21bb0 20 63 61 73 65 20 77 68 65 72 65 0a 2a 2a 20 61   case where.** a
21bc0 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 62 65   new entry is be
21bd0 69 6e 67 20 69 6e 73 65 72 74 65 64 20 6f 6e 20  ing inserted on 
21be0 74 68 65 20 65 78 74 72 65 6d 65 20 72 69 67 68  the extreme righ
21bf0 74 2d 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  t-end of the.** 
21c00 74 72 65 65 2c 20 69 6e 20 6f 74 68 65 72 20 77  tree, in other w
21c10 6f 72 64 73 2c 20 77 68 65 6e 20 74 68 65 20 6e  ords, when the n
21c20 65 77 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65  ew entry will be
21c30 63 6f 6d 65 20 74 68 65 20 6c 61 72 67 65 73 74  come the largest
21c40 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74 68 65  .** entry in the
21c50 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73   tree..**.** Ins
21c60 74 65 61 64 20 6f 66 20 74 72 79 69 6e 67 20 62  tead of trying b
21c70 61 6c 61 6e 63 65 20 74 68 65 20 33 20 72 69 67  alance the 3 rig
21c80 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61 67  ht-most leaf pag
21c90 65 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20  es, just add.** 
21ca0 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68  a new page to th
21cb0 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
21cc0 65 20 61 6e 64 20 70 75 74 20 74 68 65 20 6f 6e  e and put the on
21cd0 65 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a  e new entry in.*
21ce0 2a 20 74 68 61 74 20 70 61 67 65 2e 20 20 54 68  * that page.  Th
21cf0 69 73 20 6c 65 61 76 65 73 20 74 68 65 20 72 69  is leaves the ri
21d00 67 68 74 20 73 69 64 65 20 6f 66 20 74 68 65 20  ght side of the 
21d10 74 72 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a  tree somewhat.**
21d20 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42 75   unbalanced.  Bu
21d30 74 20 6f 64 64 73 20 61 72 65 20 74 68 61 74 20  t odds are that 
21d40 77 65 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72  we will be inser
21d50 74 69 6e 67 20 6e 65 77 20 65 6e 74 72 69 65 73  ting new entries
21d60 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 73  .** at the end s
21d70 6f 6f 6e 20 61 66 74 65 72 77 61 72 64 73 20 73  oon afterwards s
21d80 6f 20 74 68 65 20 6e 65 61 72 6c 79 20 65 6d 70  o the nearly emp
21d90 74 79 20 70 61 67 65 20 77 69 6c 6c 20 71 75 69  ty page will qui
21da0 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e  ckly.** fill up.
21db0 20 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a    On average..**
21dc0 0a 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68 65  .** pPage is the
21dd0 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68   leaf page which
21de0 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   is the right-mo
21df0 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 74  st page in the t
21e00 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20  ree..** pParent 
21e10 69 73 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20  is its parent.  
21e20 70 50 61 67 65 20 6d 75 73 74 20 68 61 76 65 20  pPage must have 
21e30 61 20 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f  a single overflo
21e40 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68  w entry.** which
21e50 20 69 73 20 61 6c 73 6f 20 74 68 65 20 72 69 67   is also the rig
21e60 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e  ht-most entry on
21e70 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74   the page..*/.st
21e80 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
21e90 5f 71 75 69 63 6b 28 4d 65 6d 50 61 67 65 20 2a  _quick(MemPage *
21ea0 70 50 61 67 65 2c 20 4d 65 6d 50 61 67 65 20 2a  pPage, MemPage *
21eb0 70 50 61 72 65 6e 74 29 7b 0a 20 20 69 6e 74 20  pParent){.  int 
21ec0 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  rc;.  MemPage *p
21ed0 4e 65 77 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  New;.  Pgno pgno
21ee0 4e 65 77 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c  New;.  u8 *pCell
21ef0 3b 0a 20 20 69 6e 74 20 73 7a 43 65 6c 6c 3b 0a  ;.  int szCell;.
21f00 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
21f10 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
21f20 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
21f30 20 69 6e 74 20 70 61 72 65 6e 74 49 64 78 20 3d   int parentIdx =
21f40 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b   pParent->nCell;
21f50 20 20 20 2f 2a 20 70 50 61 72 65 6e 74 20 6e 65     /* pParent ne
21f60 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69  w divider cell i
21f70 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 70 61  ndex */.  int pa
21f80 72 65 6e 74 53 69 7a 65 3b 20 20 20 20 20 20 20  rentSize;       
21f90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
21fa0 69 7a 65 20 6f 66 20 6e 65 77 20 64 69 76 69 64  ize of new divid
21fb0 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  er cell */.  u8 
21fc0 70 61 72 65 6e 74 43 65 6c 6c 5b 36 34 5d 3b 20  parentCell[64]; 
21fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21fe0 2a 20 53 70 61 63 65 20 66 6f 72 20 74 68 65 20  * Space for the 
21ff0 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c  new divider cell
22000 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   */..  /* Alloca
22010 74 65 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49  te a new page. I
22020 6e 73 65 72 74 20 74 68 65 20 6f 76 65 72 66 6c  nsert the overfl
22030 6f 77 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61  ow cell from pPa
22040 67 65 0a 20 20 2a 2a 20 69 6e 74 6f 20 69 74 2e  ge.  ** into it.
22050 20 54 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65   Then remove the
22060 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 66   overflow cell f
22070 72 6f 6d 20 70 50 61 67 65 2e 0a 20 20 2a 2f 0a  rom pPage..  */.
22080 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
22090 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
220a0 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20 30  New, &pgnoNew, 0
220b0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
220c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
220d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
220e0 20 20 70 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d    pCell = pPage-
220f0 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b  >aOvfl[0].pCell;
22100 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c  .  szCell = cell
22110 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70  SizePtr(pPage, p
22120 43 65 6c 6c 29 3b 0a 20 20 7a 65 72 6f 50 61 67  Cell);.  zeroPag
22130 65 28 70 4e 65 77 2c 20 70 50 61 67 65 2d 3e 61  e(pNew, pPage->a
22140 44 61 74 61 5b 30 5d 29 3b 0a 20 20 61 73 73 65  Data[0]);.  asse
22150 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 31  mblePage(pNew, 1
22160 2c 20 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65 6c  , &pCell, &szCel
22170 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76  l);.  pPage->nOv
22180 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 2f  erflow = 0;..  /
22190 2a 20 53 65 74 20 74 68 65 20 70 61 72 65 6e 74  * Set the parent
221a0 20 6f 66 20 74 68 65 20 6e 65 77 6c 79 20 61 6c   of the newly al
221b0 6c 6f 63 61 74 65 64 20 70 61 67 65 20 74 6f 20  located page to 
221c0 70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 70 4e  pParent. */.  pN
221d0 65 77 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 50  ew->pParent = pP
221e0 61 72 65 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33  arent;.  sqlite3
221f0 50 61 67 65 72 52 65 66 28 70 50 61 72 65 6e 74  PagerRef(pParent
22200 2d 3e 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 2f  ->pDbPage);..  /
22210 2a 20 70 50 61 67 65 20 69 73 20 63 75 72 72 65  * pPage is curre
22220 6e 74 6c 79 20 74 68 65 20 72 69 67 68 74 2d 63  ntly the right-c
22230 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 2e  hild of pParent.
22240 20 43 68 61 6e 67 65 20 74 68 69 73 0a 20 20 2a   Change this.  *
22250 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 69  * so that the ri
22260 67 68 74 2d 63 68 69 6c 64 20 69 73 20 74 68 65  ght-child is the
22270 20 6e 65 77 20 70 61 67 65 20 61 6c 6c 6f 63 61   new page alloca
22280 74 65 64 20 61 62 6f 76 65 20 61 6e 64 0a 20 20  ted above and.  
22290 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68 65 20  ** pPage is the 
222a0 6e 65 78 74 2d 74 6f 2d 72 69 67 68 74 20 63 68  next-to-right ch
222b0 69 6c 64 2e 20 0a 20 20 2a 2f 0a 20 20 61 73 73  ild. .  */.  ass
222c0 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
222d0 6c 3e 30 20 29 3b 0a 20 20 70 61 72 73 65 43 65  l>0 );.  parseCe
222e0 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 66 69 6e  llPtr(pPage, fin
222f0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 50 61  dCell(pPage, pPa
22300 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 2c 20 26 69  ge->nCell-1), &i
22310 6e 66 6f 29 3b 0a 20 20 72 63 20 3d 20 66 69 6c  nfo);.  rc = fil
22320 6c 49 6e 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  lInCell(pParent,
22330 20 70 61 72 65 6e 74 43 65 6c 6c 2c 20 30 2c 20   parentCell, 0, 
22340 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c  info.nKey, 0, 0,
22350 20 26 70 61 72 65 6e 74 53 69 7a 65 29 3b 0a 20   &parentSize);. 
22360 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
22370 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
22380 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
22390 74 28 20 70 61 72 65 6e 74 53 69 7a 65 3c 36 34  t( parentSize<64
223a0 20 29 3b 0a 20 20 72 63 20 3d 20 69 6e 73 65 72   );.  rc = inser
223b0 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70  tCell(pParent, p
223c0 61 72 65 6e 74 49 64 78 2c 20 70 61 72 65 6e 74  arentIdx, parent
223d0 43 65 6c 6c 2c 20 70 61 72 65 6e 74 53 69 7a 65  Cell, parentSize
223e0 2c 20 30 2c 20 34 29 3b 0a 20 20 69 66 28 20 72  , 0, 4);.  if( r
223f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
22400 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
22410 20 7d 0a 20 20 70 75 74 34 62 79 74 65 28 66 69   }.  put4byte(fi
22420 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70  ndOverflowCell(p
22430 50 61 72 65 6e 74 2c 70 61 72 65 6e 74 49 64 78  Parent,parentIdx
22440 29 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  ), pPage->pgno);
22450 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
22460 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
22470 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
22480 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a 0a 23 69  ], pgnoNew);..#i
22490 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
224a0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f  T_AUTOVACUUM.  /
224b0 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
224c0 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
224d0 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68 65  base, update the
224e0 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20 2a   pointer map.  *
224f0 2a 20 77 69 74 68 20 65 6e 74 72 69 65 73 20 66  * with entries f
22500 6f 72 20 74 68 65 20 6e 65 77 20 70 61 67 65 2c  or the new page,
22510 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65 72   and any pointer
22520 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 2a 2a 20   from the .  ** 
22530 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61 67 65  cell on the page
22540 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
22550 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  page..  */.  if(
22560 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
22570 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 74 72   ){.    rc = ptr
22580 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
22590 4e 65 77 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  New, PTRMAP_BTRE
225a0 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  E, pParent->pgno
225b0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
225c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
225d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
225e0 20 7d 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d   }.    rc = ptrm
225f0 61 70 50 75 74 4f 76 66 6c 28 70 4e 65 77 2c 20  apPutOvfl(pNew, 
22600 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
22610 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22620 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
22630 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
22640 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65    /* Release the
22650 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
22660 65 20 6e 65 77 20 70 61 67 65 20 61 6e 64 20 62  e new page and b
22670 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e  alance the paren
22680 74 20 70 61 67 65 2c 0a 20 20 2a 2a 20 69 6e 20  t page,.  ** in 
22690 63 61 73 65 20 74 68 65 20 64 69 76 69 64 65 72  case the divider
226a0 20 63 65 6c 6c 20 69 6e 73 65 72 74 65 64 20 63   cell inserted c
226b0 61 75 73 65 64 20 69 74 20 74 6f 20 62 65 63 6f  aused it to beco
226c0 6d 65 20 6f 76 65 72 66 75 6c 6c 2e 0a 20 20 2a  me overfull..  *
226d0 2f 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  /.  releasePage(
226e0 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20  pNew);.  return 
226f0 62 61 6c 61 6e 63 65 28 70 50 61 72 65 6e 74 2c  balance(pParent,
22700 20 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   0);.}.#endif /*
22710 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49   SQLITE_OMIT_QUI
22720 43 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 2f 2a  CKBALANCE */../*
22730 0a 2a 2a 20 54 68 65 20 49 53 41 55 54 4f 56 41  .** The ISAUTOVA
22740 43 55 55 4d 20 6d 61 63 72 6f 20 69 73 20 75 73  CUUM macro is us
22750 65 64 20 77 69 74 68 69 6e 20 62 61 6c 61 6e 63  ed within balanc
22760 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 74 6f 20 64  e_nonroot() to d
22770 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 69 66 20 74  etermine.** if t
22780 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70  he database supp
22790 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
227a0 20 6f 72 20 6e 6f 74 2e 20 42 65 63 61 75 73 65   or not. Because
227b0 20 69 74 20 69 73 20 75 73 65 64 0a 2a 2a 20 77   it is used.** w
227c0 69 74 68 69 6e 20 61 6e 20 65 78 70 72 65 73 73  ithin an express
227d0 69 6f 6e 20 74 68 61 74 20 69 73 20 61 6e 20 61  ion that is an a
227e0 72 67 75 6d 65 6e 74 20 74 6f 20 61 6e 6f 74 68  rgument to anoth
227f0 65 72 20 6d 61 63 72 6f 20 0a 2a 2a 20 28 73 71  er macro .** (sq
22800 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 29 2c 20  liteMallocRaw), 
22810 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
22820 6c 65 20 74 6f 20 75 73 65 20 63 6f 6e 64 69 74  le to use condit
22830 69 6f 6e 61 6c 20 63 6f 6d 70 69 6c 61 74 69 6f  ional compilatio
22840 6e 2e 0a 2a 2a 20 53 6f 2c 20 74 68 69 73 20 6d  n..** So, this m
22850 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65 64 20  acro is defined 
22860 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a 23 69 66 6e  instead..*/.#ifn
22870 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
22880 41 55 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69  AUTOVACUUM.#defi
22890 6e 65 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  ne ISAUTOVACUUM 
228a0 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  (pBt->autoVacuum
228b0 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ).#else.#define 
228c0 49 53 41 55 54 4f 56 41 43 55 55 4d 20 30 0a 23  ISAUTOVACUUM 0.#
228d0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
228e0 73 20 72 6f 75 74 69 6e 65 20 72 65 64 69 73 74  s routine redist
228f0 72 69 62 75 74 65 73 20 43 65 6c 6c 73 20 6f 6e  ributes Cells on
22900 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f   pPage and up to
22910 20 4e 4e 2a 32 20 73 69 62 6c 69 6e 67 73 0a 2a   NN*2 siblings.*
22920 2a 20 6f 66 20 70 50 61 67 65 20 73 6f 20 74 68  * of pPage so th
22930 61 74 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76  at all pages hav
22940 65 20 61 62 6f 75 74 20 74 68 65 20 73 61 6d 65  e about the same
22950 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65 20   amount of free 
22960 73 70 61 63 65 2e 0a 2a 2a 20 55 73 75 61 6c 6c  space..** Usuall
22970 79 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e  y NN siblings on
22980 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20   either side of 
22990 70 50 61 67 65 20 69 73 20 75 73 65 64 20 69 6e  pPage is used in
229a0 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c 0a   the balancing,.
229b0 2a 2a 20 74 68 6f 75 67 68 20 6d 6f 72 65 20 73  ** though more s
229c0 69 62 6c 69 6e 67 73 20 6d 69 67 68 74 20 63 6f  iblings might co
229d0 6d 65 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65  me from one side
229e0 20 69 66 20 70 50 61 67 65 20 69 73 20 74 68 65   if pPage is the
229f0 20 66 69 72 73 74 0a 2a 2a 20 6f 72 20 6c 61 73   first.** or las
22a00 74 20 63 68 69 6c 64 20 6f 66 20 69 74 73 20 70  t child of its p
22a10 61 72 65 6e 74 2e 20 20 49 66 20 70 50 61 67 65  arent.  If pPage
22a20 20 68 61 73 20 66 65 77 65 72 20 74 68 61 6e 20   has fewer than 
22a30 32 2a 4e 4e 20 73 69 62 6c 69 6e 67 73 0a 2a 2a  2*NN siblings.**
22a40 20 28 73 6f 6d 65 74 68 69 6e 67 20 77 68 69 63   (something whic
22a50 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  h can only happe
22a60 6e 20 69 66 20 70 50 61 67 65 20 69 73 20 74 68  n if pPage is th
22a70 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 72 20 61  e root page or a
22a80 20 0a 2a 2a 20 63 68 69 6c 64 20 6f 66 20 72 6f   .** child of ro
22a90 6f 74 29 20 74 68 65 6e 20 61 6c 6c 20 61 76 61  ot) then all ava
22aa0 69 6c 61 62 6c 65 20 73 69 62 6c 69 6e 67 73 20  ilable siblings 
22ab0 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 74  participate in t
22ac0 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a  he balancing..**
22ad0 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  .** The number o
22ae0 66 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 70 50  f siblings of pP
22af0 61 67 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63  age might be inc
22b00 72 65 61 73 65 64 20 6f 72 20 64 65 63 72 65 61  reased or decrea
22b10 73 65 64 20 62 79 20 6f 6e 65 20 6f 72 0a 2a 2a  sed by one or.**
22b20 20 74 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72   two in an effor
22b30 74 20 74 6f 20 6b 65 65 70 20 70 61 67 65 73 20  t to keep pages 
22b40 6e 65 61 72 6c 79 20 66 75 6c 6c 20 62 75 74 20  nearly full but 
22b50 6e 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20 54  not over full. T
22b60 68 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20  he root page.** 
22b70 69 73 20 73 70 65 63 69 61 6c 20 61 6e 64 20 69  is special and i
22b80 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20  s allowed to be 
22b90 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20 49 66  nearly empty. If
22ba0 20 70 50 61 67 65 20 69 73 20 0a 2a 2a 20 74 68   pPage is .** th
22bb0 65 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65  e root page, the
22bc0 6e 20 74 68 65 20 64 65 70 74 68 20 6f 66 20 74  n the depth of t
22bd0 68 65 20 74 72 65 65 20 6d 69 67 68 74 20 62 65  he tree might be
22be0 20 69 6e 63 72 65 61 73 65 64 0a 2a 2a 20 6f 72   increased.** or
22bf0 20 64 65 63 72 65 61 73 65 64 20 62 79 20 6f 6e   decreased by on
22c00 65 2c 20 61 73 20 6e 65 63 65 73 73 61 72 79 2c  e, as necessary,
22c10 20 74 6f 20 6b 65 65 70 20 74 68 65 20 72 6f 6f   to keep the roo
22c20 74 20 70 61 67 65 20 66 72 6f 6d 20 62 65 69 6e  t page from bein
22c30 67 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c 20 6f 72  g.** overfull or
22c40 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74   completely empt
22c50 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  y..**.** Note th
22c60 61 74 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  at when this rou
22c70 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
22c80 73 6f 6d 65 20 6f 66 20 74 68 65 20 43 65 6c 6c  some of the Cell
22c90 73 20 6f 6e 20 70 50 61 67 65 0a 2a 2a 20 6d 69  s on pPage.** mi
22ca0 67 68 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  ght not actually
22cb0 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 70 50   be stored in pP
22cc0 61 67 65 2d 3e 61 44 61 74 61 5b 5d 2e 20 20 54  age->aData[].  T
22cd0 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a  his can happen.*
22ce0 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  * if the page is
22cf0 20 6f 76 65 72 66 75 6c 6c 2e 20 20 50 61 72 74   overfull.  Part
22d00 20 6f 66 20 74 68 65 20 6a 6f 62 20 6f 66 20 74   of the job of t
22d10 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
22d20 6f 0a 2a 2a 20 6d 61 6b 65 20 73 75 72 65 20 61  o.** make sure a
22d30 6c 6c 20 43 65 6c 6c 73 20 66 6f 72 20 70 50 61  ll Cells for pPa
22d40 67 65 20 6f 6e 63 65 20 61 67 61 69 6e 20 66 69  ge once again fi
22d50 74 20 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74  t in pPage->aDat
22d60 61 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  a[]..**.** In th
22d70 65 20 63 6f 75 72 73 65 20 6f 66 20 62 61 6c 61  e course of bala
22d80 6e 63 69 6e 67 20 74 68 65 20 73 69 62 6c 69 6e  ncing the siblin
22d90 67 73 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65  gs of pPage, the
22da0 20 70 61 72 65 6e 74 20 6f 66 20 70 50 61 67 65   parent of pPage
22db0 0a 2a 2a 20 6d 69 67 68 74 20 62 65 63 6f 6d 65  .** might become
22dc0 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64   overfull or und
22dd0 65 72 66 75 6c 6c 2e 20 20 49 66 20 74 68 61 74  erfull.  If that
22de0 20 68 61 70 70 65 6e 73 2c 20 74 68 65 6e 20 74   happens, then t
22df0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
22e00 73 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69  s called recursi
22e10 76 65 6c 79 20 6f 6e 20 74 68 65 20 70 61 72 65  vely on the pare
22e20 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  nt..**.** If thi
22e30 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20  s routine fails 
22e40 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20  for any reason, 
22e50 69 74 20 6d 69 67 68 74 20 6c 65 61 76 65 20 74  it might leave t
22e60 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69  he database.** i
22e70 6e 20 61 20 63 6f 72 72 75 70 74 65 64 20 73 74  n a corrupted st
22e80 61 74 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73  ate.  So if this
22e90 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 2c 20   routine fails, 
22ea0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 68 6f  the database sho
22eb0 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65 64  uld.** be rolled
22ec0 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   back..*/.static
22ed0 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e   int balance_non
22ee0 72 6f 6f 74 28 4d 65 6d 50 61 67 65 20 2a 70 50  root(MemPage *pP
22ef0 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  age){.  MemPage 
22f00 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20  *pParent;       
22f10 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65       /* The pare
22f20 6e 74 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 20  nt of pPage */. 
22f30 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
22f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f50 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 64 61   /* The whole da
22f60 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
22f70 6e 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20  nCell = 0;      
22f80 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
22f90 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61  er of cells in a
22fa0 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74  pCell[] */.  int
22fb0 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20   nMaxCells = 0; 
22fc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
22fd0 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61  ocated size of a
22fe0 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61  pCell, szCell, a
22ff0 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e  From. */.  int n
23000 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  Old;            
23010 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
23020 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70  r of pages in ap
23030 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  Old[] */.  int n
23040 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
23050 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
23060 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70  r of pages in ap
23070 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  New[] */.  int n
23080 44 69 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  Div;            
23090 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
230a0 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70  r of cells in ap
230b0 44 69 76 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69  Div[] */.  int i
230c0 2c 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20  , j, k;         
230d0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
230e0 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
230f0 74 20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20  t idx;          
23100 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
23110 64 65 78 20 6f 66 20 70 50 61 67 65 20 69 6e 20  dex of pPage in 
23120 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d  pParent->aCell[]
23130 20 2a 2f 0a 20 20 69 6e 74 20 6e 78 44 69 76 3b   */.  int nxDiv;
23140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23150 20 20 20 2f 2a 20 4e 65 78 74 20 64 69 76 69 64     /* Next divid
23160 65 72 20 73 6c 6f 74 20 69 6e 20 70 50 61 72 65  er slot in pPare
23170 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20  nt->aCell[] */. 
23180 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
23190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
231a0 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   The return code
231b0 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66 43 6f   */.  int leafCo
231c0 72 72 65 63 74 69 6f 6e 3b 20 20 20 20 20 20 20  rrection;       
231d0 20 20 20 2f 2a 20 34 20 69 66 20 70 50 61 67 65     /* 4 if pPage
231e0 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69   is a leaf.  0 i
231f0 66 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6c  f not */.  int l
23200 65 61 66 44 61 74 61 3b 20 20 20 20 20 20 20 20  eafData;        
23210 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
23220 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65  if pPage is a le
23230 61 66 20 6f 66 20 61 20 4c 45 41 46 44 41 54 41  af of a LEAFDATA
23240 20 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75   tree */.  int u
23250 73 61 62 6c 65 53 70 61 63 65 3b 20 20 20 20 20  sableSpace;     
23260 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
23270 20 69 6e 20 70 50 61 67 65 20 62 65 79 6f 6e 64   in pPage beyond
23280 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20   the header */. 
23290 20 69 6e 74 20 70 61 67 65 46 6c 61 67 73 3b 20   int pageFlags; 
232a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
232b0 20 56 61 6c 75 65 20 6f 66 20 70 50 61 67 65 2d   Value of pPage-
232c0 3e 61 44 61 74 61 5b 30 5d 20 2a 2f 0a 20 20 69  >aData[0] */.  i
232d0 6e 74 20 73 75 62 74 6f 74 61 6c 3b 20 20 20 20  nt subtotal;    
232e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
232f0 75 62 74 6f 74 61 6c 20 6f 66 20 62 79 74 65 73  ubtotal of bytes
23300 20 69 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65   in cells on one
23310 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69   page */.  int i
23320 53 70 61 63 65 20 3d 20 30 3b 20 20 20 20 20 20  Space = 0;      
23330 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
23340 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20   unused byte of 
23350 61 53 70 61 63 65 5b 5d 20 2a 2f 0a 20 20 4d 65  aSpace[] */.  Me
23360 6d 50 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d  mPage *apOld[NB]
23370 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 50  ;          /* pP
23380 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 74 77  age and up to tw
23390 6f 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20  o siblings */.  
233a0 50 67 6e 6f 20 70 67 6e 6f 4f 6c 64 5b 4e 42 5d  Pgno pgnoOld[NB]
233b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
233c0 50 61 67 65 20 6e 75 6d 62 65 72 73 20 66 6f 72  Page numbers for
233d0 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 61 70   each page in ap
233e0 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61  Old[] */.  MemPa
233f0 67 65 20 2a 61 70 43 6f 70 79 5b 4e 42 5d 3b 20  ge *apCopy[NB]; 
23400 20 20 20 20 20 20 20 20 2f 2a 20 50 72 69 76 61          /* Priva
23410 74 65 20 63 6f 70 69 65 73 20 6f 66 20 61 70 4f  te copies of apO
23420 6c 64 5b 5d 20 70 61 67 65 73 20 2a 2f 0a 20 20  ld[] pages */.  
23430 4d 65 6d 50 61 67 65 20 2a 61 70 4e 65 77 5b 4e  MemPage *apNew[N
23440 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20  B+2];        /* 
23450 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20  pPage and up to 
23460 4e 42 20 73 69 62 6c 69 6e 67 73 20 61 66 74 65  NB siblings afte
23470 72 20 62 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20  r balancing */. 
23480 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 5b 4e 42   Pgno pgnoNew[NB
23490 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  +2];          /*
234a0 20 50 61 67 65 20 6e 75 6d 62 65 72 73 20 66 6f   Page numbers fo
234b0 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 61  r each page in a
234c0 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  pNew[] */.  u8 *
234d0 61 70 44 69 76 5b 4e 42 5d 3b 20 20 20 20 20 20  apDiv[NB];      
234e0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 76 69           /* Divi
234f0 64 65 72 20 63 65 6c 6c 73 20 69 6e 20 70 50 61  der cells in pPa
23500 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6e  rent */.  int cn
23510 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20  tNew[NB+2];     
23520 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
23530 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63 65  in aCell[] of ce
23540 6c 6c 20 61 66 74 65 72 20 69 2d 74 68 20 70 61  ll after i-th pa
23550 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65  ge */.  int szNe
23560 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20  w[NB+2];        
23570 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64       /* Combined
23580 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70   size of cells p
23590 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20 70 61 67  lace on i-th pag
235a0 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
235b0 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ll = 0;         
235c0 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73      /* All cells
235d0 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20   begin balanced 
235e0 2a 2f 0a 20 20 69 6e 74 20 2a 73 7a 43 65 6c 6c  */.  int *szCell
235f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23600 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20    /* Local size 
23610 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20  of all cells in 
23620 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38  apCell[] */.  u8
23630 20 2a 61 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20   *aCopy[NB];    
23640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
23650 61 63 65 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20  ace for holding 
23660 64 61 74 61 20 6f 66 20 61 70 43 6f 70 79 5b 5d  data of apCopy[]
23670 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61 63 65   */.  u8 *aSpace
23680 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23690 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 68     /* Space to h
236a0 6f 6c 64 20 63 6f 70 69 65 73 20 6f 66 20 64 69  old copies of di
236b0 76 69 64 65 72 73 20 63 65 6c 6c 73 20 2a 2f 0a  viders cells */.
236c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
236d0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
236e0 20 75 38 20 2a 61 46 72 6f 6d 20 3d 20 30 3b 0a   u8 *aFrom = 0;.
236f0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 0a 20 20  #endif..  /* .  
23700 2a 2a 20 46 69 6e 64 20 74 68 65 20 70 61 72 65  ** Find the pare
23710 6e 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  nt page..  */.  
23720 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
23730 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72  sInit );.  asser
23740 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
23750 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
23760 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
23770 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
23780 3b 0a 20 20 70 50 61 72 65 6e 74 20 3d 20 70 50  ;.  pParent = pP
23790 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20  age->pParent;.  
237a0 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 20  assert( pParent 
237b0 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
237c0 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
237d0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 72  3PagerWrite(pPar
237e0 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 29 20 29  ent->pDbPage)) )
237f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
23800 0a 20 20 7d 0a 20 20 54 52 41 43 45 28 28 22 42  .  }.  TRACE(("B
23810 41 4c 41 4e 43 45 3a 20 62 65 67 69 6e 20 70 61  ALANCE: begin pa
23820 67 65 20 25 64 20 63 68 69 6c 64 20 6f 66 20 25  ge %d child of %
23830 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e  d\n", pPage->pgn
23840 6f 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  o, pParent->pgno
23850 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ));..#ifndef SQL
23860 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41  ITE_OMIT_QUICKBA
23870 4c 41 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20  LANCE.  /*.  ** 
23880 41 20 73 70 65 63 69 61 6c 20 63 61 73 65 3a 20  A special case: 
23890 20 49 66 20 61 20 6e 65 77 20 65 6e 74 72 79 20   If a new entry 
238a0 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 69 6e  has just been in
238b0 73 65 72 74 65 64 20 69 6e 74 6f 20 61 0a 20 20  serted into a.  
238c0 2a 2a 20 74 61 62 6c 65 20 28 74 68 61 74 20 69  ** table (that i
238d0 73 2c 20 61 20 62 74 72 65 65 20 77 69 74 68 20  s, a btree with 
238e0 69 6e 74 65 67 65 72 20 6b 65 79 73 20 61 6e 64  integer keys and
238f0 20 61 6c 6c 20 64 61 74 61 20 61 74 20 74 68 65   all data at the
23900 20 6c 65 61 76 65 73 29 0a 20 20 2a 2a 20 61 6e   leaves).  ** an
23910 64 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  d the new entry 
23920 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  is the right-mos
23930 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
23940 72 65 65 20 28 69 74 20 68 61 73 20 74 68 65 0a  ree (it has the.
23950 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 6b 65 79    ** largest key
23960 29 20 74 68 65 6e 20 75 73 65 20 74 68 65 20 73  ) then use the s
23970 70 65 63 69 61 6c 20 62 61 6c 61 6e 63 65 5f 71  pecial balance_q
23980 75 69 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66  uick() routine f
23990 6f 72 0a 20 20 2a 2a 20 62 61 6c 61 6e 63 69 6e  or.  ** balancin
239a0 67 2e 20 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  g.  balance_quic
239b0 6b 28 29 20 69 73 20 6d 75 63 68 20 66 61 73 74  k() is much fast
239c0 65 72 20 61 6e 64 20 72 65 73 75 6c 74 73 20 69  er and results i
239d0 6e 20 61 20 74 69 67 68 74 65 72 0a 20 20 2a 2a  n a tighter.  **
239e0 20 70 61 63 6b 69 6e 67 20 6f 66 20 64 61 74 61   packing of data
239f0 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   in the common c
23a00 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ase..  */.  if( 
23a10 70 50 61 67 65 2d 3e 6c 65 61 66 20 26 26 0a 20  pPage->leaf &&. 
23a20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b       pPage->intK
23a30 65 79 20 26 26 0a 20 20 20 20 20 20 70 50 61 67  ey &&.      pPag
23a40 65 2d 3e 6c 65 61 66 44 61 74 61 20 26 26 0a 20  e->leafData &&. 
23a50 20 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65       pPage->nOve
23a60 72 66 6c 6f 77 3d 3d 31 20 26 26 0a 20 20 20 20  rflow==1 &&.    
23a70 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30    pPage->aOvfl[0
23a80 5d 2e 69 64 78 3d 3d 70 50 61 67 65 2d 3e 6e 43  ].idx==pPage->nC
23a90 65 6c 6c 20 26 26 0a 20 20 20 20 20 20 70 50 61  ell &&.      pPa
23aa0 67 65 2d 3e 70 50 61 72 65 6e 74 2d 3e 70 67 6e  ge->pParent->pgn
23ab0 6f 21 3d 31 20 26 26 0a 20 20 20 20 20 20 67 65  o!=1 &&.      ge
23ac0 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
23ad0 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
23ae0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 70  hdrOffset+8])==p
23af0 50 61 67 65 2d 3e 70 67 6e 6f 0a 20 20 29 7b 0a  Page->pgno.  ){.
23b00 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 4f      /*.    ** TO
23b10 44 4f 3a 20 43 68 65 63 6b 20 74 68 65 20 73 69  DO: Check the si
23b20 62 6c 69 6e 67 73 20 74 6f 20 74 68 65 20 6c 65  blings to the le
23b30 66 74 20 6f 66 20 70 50 61 67 65 2e 20 49 74 20  ft of pPage. It 
23b40 6d 61 79 20 62 65 20 74 68 61 74 0a 20 20 20 20  may be that.    
23b50 2a 2a 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20  ** they are not 
23b60 66 75 6c 6c 20 61 6e 64 20 6e 6f 20 6e 65 77 20  full and no new 
23b70 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64  page is required
23b80 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74  ..    */.    ret
23b90 75 72 6e 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  urn balance_quic
23ba0 6b 28 70 50 61 67 65 2c 20 70 50 61 72 65 6e 74  k(pPage, pParent
23bb0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
23bc0 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68   /*.  ** Find th
23bd0 65 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 70 61  e cell in the pa
23be0 72 65 6e 74 20 70 61 67 65 20 77 68 6f 73 65 20  rent page whose 
23bf0 6c 65 66 74 20 63 68 69 6c 64 20 70 6f 69 6e 74  left child point
23c00 73 20 62 61 63 6b 0a 20 20 2a 2a 20 74 6f 20 70  s back.  ** to p
23c10 50 61 67 65 2e 20 20 54 68 65 20 22 69 64 78 22  Page.  The "idx"
23c20 20 76 61 72 69 61 62 6c 65 20 69 73 20 74 68 65   variable is the
23c30 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20 63   index of that c
23c40 65 6c 6c 2e 20 20 49 66 20 70 50 61 67 65 0a 20  ell.  If pPage. 
23c50 20 2a 2a 20 69 73 20 74 68 65 20 72 69 67 68 74   ** is the right
23c60 6d 6f 73 74 20 63 68 69 6c 64 20 6f 66 20 70 50  most child of pP
23c70 61 72 65 6e 74 20 74 68 65 6e 20 73 65 74 20 69  arent then set i
23c80 64 78 20 74 6f 20 70 50 61 72 65 6e 74 2d 3e 6e  dx to pParent->n
23c90 43 65 6c 6c 20 0a 20 20 2a 2f 0a 20 20 69 66 28  Cell .  */.  if(
23ca0 20 70 50 61 72 65 6e 74 2d 3e 69 64 78 53 68 69   pParent->idxShi
23cb0 66 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70  ft ){.    Pgno p
23cc0 67 6e 6f 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20  gno;.    pgno = 
23cd0 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 20  pPage->pgno;.   
23ce0 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3d 3d 73   assert( pgno==s
23cf0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
23d00 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62  umber(pPage->pDb
23d10 50 61 67 65 29 20 29 3b 0a 20 20 20 20 66 6f 72  Page) );.    for
23d20 28 69 64 78 3d 30 3b 20 69 64 78 3c 70 50 61 72  (idx=0; idx<pPar
23d30 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 20 69 64 78 2b  ent->nCell; idx+
23d40 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 67 65  +){.      if( ge
23d50 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
23d60 70 50 61 72 65 6e 74 2c 20 69 64 78 29 29 3d 3d  pParent, idx))==
23d70 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  pgno ){.        
23d80 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
23d90 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
23da0 20 69 64 78 3c 70 50 61 72 65 6e 74 2d 3e 6e 43   idx<pParent->nC
23db0 65 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ell.            
23dc0 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70 50   || get4byte(&pP
23dd0 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61  arent->aData[pPa
23de0 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  rent->hdrOffset+
23df0 38 5d 29 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 7d  8])==pgno );.  }
23e00 65 6c 73 65 7b 0a 20 20 20 20 69 64 78 20 3d 20  else{.    idx = 
23e10 70 50 61 67 65 2d 3e 69 64 78 50 61 72 65 6e 74  pPage->idxParent
23e20 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
23e30 20 49 6e 69 74 69 61 6c 69 7a 65 20 76 61 72 69   Initialize vari
23e40 61 62 6c 65 73 20 73 6f 20 74 68 61 74 20 69 74  ables so that it
23e50 20 77 69 6c 6c 20 62 65 20 73 61 66 65 20 74 6f   will be safe to
23e60 20 6a 75 6d 70 0a 20 20 2a 2a 20 64 69 72 65 63   jump.  ** direc
23e70 74 6c 79 20 74 6f 20 62 61 6c 61 6e 63 65 5f 63  tly to balance_c
23e80 6c 65 61 6e 75 70 20 61 74 20 61 6e 79 20 6d 6f  leanup at any mo
23e90 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 6c  ment..  */.  nOl
23ea0 64 20 3d 20 6e 4e 65 77 20 3d 20 30 3b 0a 20 20  d = nNew = 0;.  
23eb0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
23ec0 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
23ed0 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69  );..  /*.  ** Fi
23ee0 6e 64 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  nd sibling pages
23ef0 20 74 6f 20 70 50 61 67 65 20 61 6e 64 20 74 68   to pPage and th
23f00 65 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65  e cells in pPare
23f10 6e 74 20 74 68 61 74 20 64 69 76 69 64 65 0a 20  nt that divide. 
23f20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67 73   ** the siblings
23f30 2e 20 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73  .  An attempt is
23f40 20 6d 61 64 65 20 74 6f 20 66 69 6e 64 20 4e 4e   made to find NN
23f50 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65 69 74   siblings on eit
23f60 68 65 72 0a 20 20 2a 2a 20 73 69 64 65 20 6f 66  her.  ** side of
23f70 20 70 50 61 67 65 2e 20 20 4d 6f 72 65 20 73 69   pPage.  More si
23f80 62 6c 69 6e 67 73 20 61 72 65 20 74 61 6b 65 6e  blings are taken
23f90 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c 20   from one side, 
23fa0 68 6f 77 65 76 65 72 2c 20 69 66 0a 20 20 2a 2a  however, if.  **
23fb0 20 70 50 61 67 65 20 74 68 65 72 65 20 61 72 65   pPage there are
23fc0 20 66 65 77 65 72 20 74 68 61 6e 20 4e 4e 20 73   fewer than NN s
23fd0 69 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f  iblings on the o
23fe0 74 68 65 72 20 73 69 64 65 2e 20 20 49 66 20 70  ther side.  If p
23ff0 50 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61 73 20  Parent.  ** has 
24000 4e 42 20 6f 72 20 66 65 77 65 72 20 63 68 69 6c  NB or fewer chil
24010 64 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20 63 68  dren then all ch
24020 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 72 65 6e  ildren of pParen
24030 74 20 61 72 65 20 74 61 6b 65 6e 2e 0a 20 20 2a  t are taken..  *
24040 2f 0a 20 20 6e 78 44 69 76 20 3d 20 69 64 78 20  /.  nxDiv = idx 
24050 2d 20 4e 4e 3b 0a 20 20 69 66 28 20 6e 78 44 69  - NN;.  if( nxDi
24060 76 20 2b 20 4e 42 20 3e 20 70 50 61 72 65 6e 74  v + NB > pParent
24070 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 6e  ->nCell ){.    n
24080 78 44 69 76 20 3d 20 70 50 61 72 65 6e 74 2d 3e  xDiv = pParent->
24090 6e 43 65 6c 6c 20 2d 20 4e 42 20 2b 20 31 3b 0a  nCell - NB + 1;.
240a0 20 20 7d 0a 20 20 69 66 28 20 6e 78 44 69 76 3c    }.  if( nxDiv<
240b0 30 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d  0 ){.    nxDiv =
240c0 20 30 3b 0a 20 20 7d 0a 20 20 6e 44 69 76 20 3d   0;.  }.  nDiv =
240d0 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6b   0;.  for(i=0, k
240e0 3d 6e 78 44 69 76 3b 20 69 3c 4e 42 3b 20 69 2b  =nxDiv; i<NB; i+
240f0 2b 2c 20 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, k++){.    if(
24100 20 6b 3c 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c   k<pParent->nCel
24110 6c 20 29 7b 0a 20 20 20 20 20 20 61 70 44 69 76  l ){.      apDiv
24120 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  [i] = findCell(p
24130 50 61 72 65 6e 74 2c 20 6b 29 3b 0a 20 20 20 20  Parent, k);.    
24140 20 20 6e 44 69 76 2b 2b 3b 0a 20 20 20 20 20 20    nDiv++;.      
24150 61 73 73 65 72 74 28 20 21 70 50 61 72 65 6e 74  assert( !pParent
24160 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20 20 20  ->leaf );.      
24170 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65 74  pgnoOld[i] = get
24180 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b  4byte(apDiv[i]);
24190 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b  .    }else if( k
241a0 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  ==pParent->nCell
241b0 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f 4f 6c   ){.      pgnoOl
241c0 64 5b 69 5d 20 3d 20 67 65 74 34 62 79 74 65 28  d[i] = get4byte(
241d0 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
241e0 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
241f0 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  et+8]);.    }els
24200 65 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e{.      break;.
24210 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 67      }.    rc = g
24220 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
24230 74 2c 20 70 67 6e 6f 4f 6c 64 5b 69 5d 2c 20 26  t, pgnoOld[i], &
24240 61 70 4f 6c 64 5b 69 5d 2c 20 70 50 61 72 65 6e  apOld[i], pParen
24250 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  t);.    if( rc )
24260 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
24270 65 61 6e 75 70 3b 0a 20 20 20 20 61 70 4f 6c 64  eanup;.    apOld
24280 5b 69 5d 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d  [i]->idxParent =
24290 20 6b 3b 0a 20 20 20 20 61 70 43 6f 70 79 5b 69   k;.    apCopy[i
242a0 5d 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  ] = 0;.    asser
242b0 74 28 20 69 3d 3d 6e 4f 6c 64 20 29 3b 0a 20 20  t( i==nOld );.  
242c0 20 20 6e 4f 6c 64 2b 2b 3b 0a 20 20 20 20 6e 4d    nOld++;.    nM
242d0 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f  axCells += 1+apO
242e0 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f  ld[i]->nCell+apO
242f0 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77  ld[i]->nOverflow
24300 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
24310 20 6e 4d 61 78 43 65 6c 6c 73 20 61 20 6d 75 6c   nMaxCells a mul
24320 74 69 70 6c 65 20 6f 66 20 32 20 69 6e 20 6f 72  tiple of 2 in or
24330 64 65 72 20 74 6f 20 70 72 65 73 65 72 76 65 20  der to preserve 
24340 38 2d 62 79 74 65 0a 20 20 2a 2a 20 61 6c 69 67  8-byte.  ** alig
24350 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78 43  nment */.  nMaxC
24360 65 6c 6c 73 20 3d 20 28 6e 4d 61 78 43 65 6c 6c  ells = (nMaxCell
24370 73 20 2b 20 31 29 26 7e 31 3b 0a 0a 20 20 2f 2a  s + 1)&~1;..  /*
24380 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  ** Allocate s
24390 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20  pace for memory 
243a0 73 74 72 75 63 74 75 72 65 73 0a 20 20 2a 2f 0a  structures.  */.
243b0 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74    apCell = sqlit
243c0 65 4d 61 6c 6c 6f 63 52 61 77 28 20 0a 20 20 20  eMallocRaw( .   
243d0 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69      nMaxCells*si
243e0 7a 65 6f 66 28 75 38 2a 29 20 20 20 20 20 20 20  zeof(u8*)       
243f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24400 20 20 20 20 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f      /* apCell */
24410 0a 20 20 20 20 20 2b 20 6e 4d 61 78 43 65 6c 6c  .     + nMaxCell
24420 73 2a 73 69 7a 65 6f 66 28 69 6e 74 29 20 20 20  s*sizeof(int)   
24430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24440 20 20 20 20 20 20 20 20 2f 2a 20 73 7a 43 65 6c          /* szCel
24450 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 52 4f 55 4e  l */.     + ROUN
24460 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67  D8(sizeof(MemPag
24470 65 29 29 2a 4e 42 20 20 20 20 20 20 20 20 20 20  e))*NB          
24480 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
24490 43 6f 70 79 20 2a 2f 0a 20 20 20 20 20 2b 20 70  Copy */.     + p
244a0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 35 2b  Bt->pageSize*(5+
244b0 4e 42 29 20 20 20 20 20 20 20 20 20 20 20 20 20  NB)             
244c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
244d0 2a 20 61 53 70 61 63 65 20 2a 2f 0a 20 20 20 20  * aSpace */.    
244e0 20 2b 20 28 49 53 41 55 54 4f 56 41 43 55 55 4d   + (ISAUTOVACUUM
244f0 20 3f 20 6e 4d 61 78 43 65 6c 6c 73 20 3a 20 30   ? nMaxCells : 0
24500 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
24510 20 20 20 2f 2a 20 61 46 72 6f 6d 20 2a 2f 0a 20     /* aFrom */. 
24520 20 29 3b 0a 20 20 69 66 28 20 61 70 43 65 6c 6c   );.  if( apCell
24530 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
24540 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
24550 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
24560 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 7a  leanup;.  }.  sz
24570 43 65 6c 6c 20 3d 20 28 69 6e 74 2a 29 26 61 70  Cell = (int*)&ap
24580 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b  Cell[nMaxCells];
24590 0a 20 20 61 43 6f 70 79 5b 30 5d 20 3d 20 28 75  .  aCopy[0] = (u
245a0 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43  8*)&szCell[nMaxC
245b0 65 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74 28  ells];.  assert(
245c0 20 28 28 61 43 6f 70 79 5b 30 5d 20 2d 20 28 75   ((aCopy[0] - (u
245d0 38 2a 29 61 70 43 65 6c 6c 29 20 26 20 37 29 3d  8*)apCell) & 7)=
245e0 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20  =0 ); /* 8-byte 
245f0 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72  alignment requir
24600 65 64 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b  ed */.  for(i=1;
24610 20 69 3c 4e 42 3b 20 69 2b 2b 29 7b 0a 20 20 20   i<NB; i++){.   
24620 20 61 43 6f 70 79 5b 69 5d 20 3d 20 26 61 43 6f   aCopy[i] = &aCo
24630 70 79 5b 69 2d 31 5d 5b 70 42 74 2d 3e 70 61 67  py[i-1][pBt->pag
24640 65 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a  eSize+ROUND8(siz
24650 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a  eof(MemPage))];.
24660 20 20 20 20 61 73 73 65 72 74 28 20 28 28 61 43      assert( ((aC
24670 6f 70 79 5b 69 5d 20 2d 20 28 75 38 2a 29 61 70  opy[i] - (u8*)ap
24680 43 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29 3b  Cell) & 7)==0 );
24690 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   /* 8-byte align
246a0 6d 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a 2f  ment required */
246b0 0a 20 20 7d 0a 20 20 61 53 70 61 63 65 20 3d 20  .  }.  aSpace = 
246c0 26 61 43 6f 70 79 5b 4e 42 2d 31 5d 5b 70 42 74  &aCopy[NB-1][pBt
246d0 2d 3e 70 61 67 65 53 69 7a 65 2b 52 4f 55 4e 44  ->pageSize+ROUND
246e0 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65  8(sizeof(MemPage
246f0 29 29 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28  ))];.  assert( (
24700 28 61 53 70 61 63 65 20 2d 20 28 75 38 2a 29 61  (aSpace - (u8*)a
24710 70 43 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29  pCell) & 7)==0 )
24720 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67  ; /* 8-byte alig
24730 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a  nment required *
24740 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
24750 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
24760 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f  .  if( pBt->auto
24770 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 61 46  Vacuum ){.    aF
24780 72 6f 6d 20 3d 20 26 61 53 70 61 63 65 5b 35 2a  rom = &aSpace[5*
24790 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a  pBt->pageSize];.
247a0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
247b0 2f 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 63 6f 70  /*.  ** Make cop
247c0 69 65 73 20 6f 66 20 74 68 65 20 63 6f 6e 74 65  ies of the conte
247d0 6e 74 20 6f 66 20 70 50 61 67 65 20 61 6e 64 20  nt of pPage and 
247e0 69 74 73 20 73 69 62 6c 69 6e 67 73 20 69 6e 74  its siblings int
247f0 6f 20 61 4f 6c 64 5b 5d 2e 0a 20 20 2a 2a 20 54  o aOld[]..  ** T
24800 68 65 20 72 65 73 74 20 6f 66 20 74 68 69 73 20  he rest of this 
24810 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73  function will us
24820 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  e data from the 
24830 63 6f 70 69 65 73 20 72 61 74 68 65 72 0a 20 20  copies rather.  
24840 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 72 69 67  ** that the orig
24850 69 6e 61 6c 20 70 61 67 65 73 20 73 69 6e 63 65  inal pages since
24860 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
24870 67 65 73 20 77 69 6c 6c 20 62 65 20 69 6e 20 74  ges will be in t
24880 68 65 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 20  he.  ** process 
24890 6f 66 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69  of being overwri
248a0 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  tten..  */.  for
248b0 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b  (i=0; i<nOld; i+
248c0 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  +){.    MemPage 
248d0 2a 70 20 3d 20 61 70 43 6f 70 79 5b 69 5d 20 3d  *p = apCopy[i] =
248e0 20 28 4d 65 6d 50 61 67 65 2a 29 26 61 43 6f 70   (MemPage*)&aCop
248f0 79 5b 69 5d 5b 70 42 74 2d 3e 70 61 67 65 53 69  y[i][pBt->pageSi
24900 7a 65 5d 3b 0a 20 20 20 20 70 2d 3e 61 44 61 74  ze];.    p->aDat
24910 61 20 3d 20 26 28 28 75 38 2a 29 70 29 5b 2d 70  a = &((u8*)p)[-p
24920 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20  Bt->pageSize];. 
24930 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 61 44 61     memcpy(p->aDa
24940 74 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e 61 44  ta, apOld[i]->aD
24950 61 74 61 2c 20 70 42 74 2d 3e 70 61 67 65 53 69  ata, pBt->pageSi
24960 7a 65 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 50  ze + sizeof(MemP
24970 61 67 65 29 29 3b 0a 20 20 20 20 2f 2a 20 54 68  age));.    /* Th
24980 65 20 6d 65 6d 63 70 79 28 29 20 61 62 6f 76 65  e memcpy() above
24990 20 63 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c   changes the val
249a0 75 65 20 6f 66 20 70 2d 3e 61 44 61 74 61 20 73  ue of p->aData s
249b0 6f 20 77 65 20 68 61 76 65 20 74 6f 0a 20 20 20  o we have to.   
249c0 20 2a 2a 20 73 65 74 20 69 74 20 61 67 61 69 6e   ** set it again
249d0 2e 20 2a 2f 0a 20 20 20 20 70 2d 3e 61 44 61 74  . */.    p->aDat
249e0 61 20 3d 20 26 28 28 75 38 2a 29 70 29 5b 2d 70  a = &((u8*)p)[-p
249f0 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20  Bt->pageSize];. 
24a00 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f   }..  /*.  ** Lo
24a10 61 64 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61  ad pointers to a
24a20 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c  ll cells on sibl
24a30 69 6e 67 20 70 61 67 65 73 20 61 6e 64 20 74 68  ing pages and th
24a40 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a  e divider cells.
24a50 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f    ** into the lo
24a60 63 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72  cal apCell[] arr
24a70 61 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65 73  ay.  Make copies
24a80 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20   of the divider 
24a90 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20  cells.  ** into 
24aa0 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66  space obtained f
24ab0 6f 72 6d 20 61 53 70 61 63 65 5b 5d 20 61 6e 64  orm aSpace[] and
24ac0 20 72 65 6d 6f 76 65 20 74 68 65 20 74 68 65 20   remove the the 
24ad0 64 69 76 69 64 65 72 20 43 65 6c 6c 73 0a 20 20  divider Cells.  
24ae0 2a 2a 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2e  ** from pParent.
24af0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
24b00 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6f  e siblings are o
24b10 6e 20 6c 65 61 66 20 70 61 67 65 73 2c 20 74 68  n leaf pages, th
24b20 65 6e 20 74 68 65 20 63 68 69 6c 64 20 70 6f 69  en the child poi
24b30 6e 74 65 72 73 20 6f 66 20 74 68 65 0a 20 20 2a  nters of the.  *
24b40 2a 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20  * divider cells 
24b50 61 72 65 20 73 74 72 69 70 70 65 64 20 66 72 6f  are stripped fro
24b60 6d 20 74 68 65 20 63 65 6c 6c 73 20 62 65 66 6f  m the cells befo
24b70 72 65 20 74 68 65 79 20 61 72 65 20 63 6f 70 69  re they are copi
24b80 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 53 70  ed.  ** into aSp
24b90 61 63 65 5b 5d 2e 20 20 49 6e 20 74 68 69 73 20  ace[].  In this 
24ba0 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69  way, all cells i
24bb0 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 72 65 20 77  n apCell[] are w
24bc0 69 74 68 6f 75 74 0a 20 20 2a 2a 20 63 68 69 6c  ithout.  ** chil
24bd0 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 49 66 20  d pointers.  If 
24be0 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74  siblings are not
24bf0 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 61 6c   leaves, then al
24c00 6c 20 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61  l cell in.  ** a
24c10 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65 20  pCell[] include 
24c20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20  child pointers. 
24c30 20 45 69 74 68 65 72 20 77 61 79 2c 20 61 6c 6c   Either way, all
24c40 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
24c50 5b 5d 0a 20 20 2a 2a 20 61 72 65 20 61 6c 69 6b  [].  ** are alik
24c60 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61  e..  **.  ** lea
24c70 66 43 6f 72 72 65 63 74 69 6f 6e 3a 20 20 34 20  fCorrection:  4 
24c80 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65  if pPage is a le
24c90 61 66 2e 20 20 30 20 69 66 20 70 50 61 67 65 20  af.  0 if pPage 
24ca0 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 2e 0a 20  is not a leaf.. 
24cb0 20 2a 2a 20 20 20 20 20 20 20 6c 65 61 66 44 61   **       leafDa
24cc0 74 61 3a 20 20 31 20 69 66 20 70 50 61 67 65 20  ta:  1 if pPage 
24cd0 68 6f 6c 64 73 20 6b 65 79 2b 64 61 74 61 20 61  holds key+data a
24ce0 6e 64 20 70 50 61 72 65 6e 74 20 68 6f 6c 64 73  nd pParent holds
24cf0 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20 20 2a 2f   only keys..  */
24d00 0a 20 20 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20  .  nCell = 0;.  
24d10 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 3d  leafCorrection =
24d20 20 70 50 61 67 65 2d 3e 6c 65 61 66 2a 34 3b 0a   pPage->leaf*4;.
24d30 20 20 6c 65 61 66 44 61 74 61 20 3d 20 70 50 61    leafData = pPa
24d40 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 26 26 20  ge->leafData && 
24d50 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 66  pPage->leaf;.  f
24d60 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20  or(i=0; i<nOld; 
24d70 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  i++){.    MemPag
24d80 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79  e *pOld = apCopy
24d90 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6c 69 6d  [i];.    int lim
24da0 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c  it = pOld->nCell
24db0 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77  +pOld->nOverflow
24dc0 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
24dd0 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20  <limit; j++){.  
24de0 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
24df0 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  l<nMaxCells );. 
24e00 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c       apCell[nCel
24e10 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f  l] = findOverflo
24e20 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a  wCell(pOld, j);.
24e30 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
24e40 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ll] = cellSizePt
24e50 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e  r(pOld, apCell[n
24e60 43 65 6c 6c 5d 29 3b 0a 23 69 66 6e 64 65 66 20  Cell]);.#ifndef 
24e70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
24e80 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28  VACUUM.      if(
24e90 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
24ea0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
24eb0 61 3b 0a 20 20 20 20 20 20 20 20 61 46 72 6f 6d  a;.        aFrom
24ec0 5b 6e 43 65 6c 6c 5d 20 3d 20 69 3b 0a 20 20 20  [nCell] = i;.   
24ed0 20 20 20 20 20 66 6f 72 28 61 3d 30 3b 20 61 3c       for(a=0; a<
24ee0 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  pOld->nOverflow;
24ef0 20 61 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   a++){.         
24f00 20 69 66 28 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c   if( pOld->aOvfl
24f10 5b 61 5d 2e 70 43 65 6c 6c 3d 3d 61 70 43 65 6c  [a].pCell==apCel
24f20 6c 5b 6e 43 65 6c 6c 5d 20 29 7b 0a 20 20 20 20  l[nCell] ){.    
24f30 20 20 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43          aFrom[nC
24f40 65 6c 6c 5d 20 3d 20 30 78 46 46 3b 0a 20 20 20  ell] = 0xFF;.   
24f50 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
24f60 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
24f70 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65      }.      }.#e
24f80 6e 64 69 66 0a 20 20 20 20 20 20 6e 43 65 6c 6c  ndif.      nCell
24f90 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ++;.    }.    if
24fa0 28 20 69 3c 6e 4f 6c 64 2d 31 20 29 7b 0a 20 20  ( i<nOld-1 ){.  
24fb0 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 63 65 6c      int sz = cel
24fc0 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74  lSizePtr(pParent
24fd0 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20  , apDiv[i]);.   
24fe0 20 20 20 69 66 28 20 6c 65 61 66 44 61 74 61 20     if( leafData 
24ff0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 69  ){.        /* Wi
25000 74 68 20 74 68 65 20 4c 45 41 46 44 41 54 41 20  th the LEAFDATA 
25010 66 6c 61 67 2c 20 70 50 61 72 65 6e 74 20 63 65  flag, pParent ce
25020 6c 6c 73 20 68 6f 6c 64 20 6f 6e 6c 79 20 49 4e  lls hold only IN
25030 54 4b 45 59 73 20 74 68 61 74 0a 20 20 20 20 20  TKEYs that.     
25040 20 20 20 2a 2a 20 61 72 65 20 64 75 70 6c 69 63     ** are duplic
25050 61 74 65 73 20 6f 66 20 6b 65 79 73 20 6f 6e 20  ates of keys on 
25060 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 73 2e  the child pages.
25070 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 65 6d    We need to rem
25080 6f 76 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ove.        ** t
25090 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  he divider cells
250a0 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2c 20 62   from pParent, b
250b0 75 74 20 74 68 65 20 64 69 76 69 64 65 72 73 20  ut the dividers 
250c0 63 65 6c 6c 73 20 61 72 65 20 6e 6f 74 0a 20 20  cells are not.  
250d0 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20 74        ** added t
250e0 6f 20 61 70 43 65 6c 6c 5b 5d 20 62 65 63 61 75  o apCell[] becau
250f0 73 65 20 74 68 65 79 20 61 72 65 20 64 75 70 6c  se they are dupl
25100 69 63 61 74 65 73 20 6f 66 20 63 68 69 6c 64 20  icates of child 
25110 63 65 6c 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a  cells..        *
25120 2f 0a 20 20 20 20 20 20 20 20 64 72 6f 70 43 65  /.        dropCe
25130 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69  ll(pParent, nxDi
25140 76 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 7d 65  v, sz);.      }e
25150 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75 38 20  lse{.        u8 
25160 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20  *pTemp;.        
25170 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d  assert( nCell<nM
25180 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20  axCells );.     
25190 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     szCell[nCell]
251a0 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 70   = sz;.        p
251b0 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65 5b 69  Temp = &aSpace[i
251c0 53 70 61 63 65 5d 3b 0a 20 20 20 20 20 20 20 20  Space];.        
251d0 69 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20  iSpace += sz;.  
251e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53        assert( iS
251f0 70 61 63 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53  pace<=pBt->pageS
25200 69 7a 65 2a 35 20 29 3b 0a 20 20 20 20 20 20 20  ize*5 );.       
25210 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20 61   memcpy(pTemp, a
25220 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20  pDiv[i], sz);.  
25230 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65        apCell[nCe
25240 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61 66  ll] = pTemp+leaf
25250 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 23 69 66 6e  Correction;.#ifn
25260 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
25270 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
25280 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
25290 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
252a0 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d      aFrom[nCell]
252b0 20 3d 20 30 78 46 46 3b 0a 20 20 20 20 20 20 20   = 0xFF;.       
252c0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
252d0 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65    dropCell(pPare
252e0 6e 74 2c 20 6e 78 44 69 76 2c 20 73 7a 29 3b 0a  nt, nxDiv, sz);.
252f0 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e          szCell[n
25300 43 65 6c 6c 5d 20 2d 3d 20 6c 65 61 66 43 6f 72  Cell] -= leafCor
25310 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20  rection;.       
25320 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74   assert( get4byt
25330 65 28 70 54 65 6d 70 29 3d 3d 70 67 6e 6f 4f 6c  e(pTemp)==pgnoOl
25340 64 5b 69 5d 20 29 3b 0a 20 20 20 20 20 20 20 20  d[i] );.        
25350 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66 20  if( !pOld->leaf 
25360 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
25370 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74  ert( leafCorrect
25380 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ion==0 );.      
25390 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
253a0 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20   pointer of the 
253b0 63 68 69 6c 64 20 70 61 67 65 20 70 4f 6c 64 20  child page pOld 
253c0 62 65 63 6f 6d 65 73 20 74 68 65 20 6c 65 66 74  becomes the left
253d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  .          ** po
253e0 69 6e 74 65 72 20 6f 66 20 74 68 65 20 64 69 76  inter of the div
253f0 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 20  ider cell */.   
25400 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 70         memcpy(ap
25410 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f  Cell[nCell], &pO
25420 6c 64 2d 3e 61 44 61 74 61 5b 70 4f 6c 64 2d 3e  ld->aData[pOld->
25430 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 34 29  hdrOffset+8], 4)
25440 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
25450 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
25460 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  t( leafCorrectio
25470 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20 20  n==4 );.        
25480 7d 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 2b  }.        nCell+
25490 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
254a0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
254b0 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 6e  Figure out the n
254c0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6e  umber of pages n
254d0 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c  eeded to hold al
254e0 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20  l nCell cells.. 
254f0 20 2a 2a 20 53 74 6f 72 65 20 74 68 69 73 20 6e   ** Store this n
25500 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20 20 41  umber in "k".  A
25510 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65  lso compute szNe
25520 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68 65  w[] which is the
25530 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65   total.  ** size
25540 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e   of all cells on
25550 20 74 68 65 20 69 2d 74 68 20 70 61 67 65 20 61   the i-th page a
25560 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63  nd cntNew[] whic
25570 68 20 69 73 20 74 68 65 20 69 6e 64 65 78 0a 20  h is the index. 
25580 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20   ** in apCell[] 
25590 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68 61 74  of the cell that
255a0 20 64 69 76 69 64 65 73 20 70 61 67 65 20 69 20   divides page i 
255b0 66 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e 20 20  from page i+1.  
255c0 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20  .  ** cntNew[k] 
255d0 73 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e 43 65  should equal nCe
255e0 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61  ll..  **.  ** Va
255f0 6c 75 65 73 20 63 6f 6d 70 75 74 65 64 20 62 79  lues computed by
25600 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a   this block:.  *
25610 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  *.  **          
25620 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20 6e 75   k: The total nu
25630 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 20  mber of sibling 
25640 70 61 67 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a  pages.  **    sz
25650 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65 64 20 75  New[i]: Spaced u
25660 73 65 64 20 6f 6e 20 74 68 65 20 69 2d 74 68 20  sed on the i-th 
25670 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20  sibling page..  
25680 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20  **   cntNew[i]: 
25690 49 6e 64 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b  Index in apCell[
256a0 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66  ] and szCell[] f
256b0 6f 72 20 74 68 65 20 66 69 72 73 74 20 63 65 6c  or the first cel
256c0 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20  l to.  **       
256d0 20 20 20 20 20 20 20 74 68 65 20 72 69 67 68 74         the right
256e0 20 6f 66 20 74 68 65 20 69 2d 74 68 20 73 69 62   of the i-th sib
256f0 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20  ling page..  ** 
25700 75 73 61 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d  usableSpace: Num
25710 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
25720 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20  space available 
25730 6f 6e 20 65 61 63 68 20 73 69 62 6c 69 6e 67 2e  on each sibling.
25740 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73  .  ** .  */.  us
25750 61 62 6c 65 53 70 61 63 65 20 3d 20 70 42 74 2d  ableSpace = pBt-
25760 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 31 32  >usableSize - 12
25770 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f   + leafCorrectio
25780 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f 74 61  n;.  for(subtota
25790 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  l=k=i=0; i<nCell
257a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
257b0 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( i<nMaxCells 
257c0 29 3b 0a 20 20 20 20 73 75 62 74 6f 74 61 6c 20  );.    subtotal 
257d0 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32  += szCell[i] + 2
257e0 3b 0a 20 20 20 20 69 66 28 20 73 75 62 74 6f 74  ;.    if( subtot
257f0 61 6c 20 3e 20 75 73 61 62 6c 65 53 70 61 63 65  al > usableSpace
25800 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b   ){.      szNew[
25810 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20  k] = subtotal - 
25820 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20  szCell[i];.     
25830 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a   cntNew[k] = i;.
25840 20 20 20 20 20 20 69 66 28 20 6c 65 61 66 44 61        if( leafDa
25850 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20  ta ){ i--; }.   
25860 20 20 20 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b     subtotal = 0;
25870 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20  .      k++;.    
25880 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d  }.  }.  szNew[k]
25890 20 3d 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63   = subtotal;.  c
258a0 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c  ntNew[k] = nCell
258b0 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20  ;.  k++;..  /*. 
258c0 20 2a 2a 20 54 68 65 20 70 61 63 6b 69 6e 67 20   ** The packing 
258d0 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68 65 20  computed by the 
258e0 70 72 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69  previous block i
258f0 73 20 62 69 61 73 65 64 20 74 6f 77 61 72 64 20  s biased toward 
25900 74 68 65 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a  the siblings.  *
25910 2a 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 73 69  * on the left si
25920 64 65 2e 20 20 54 68 65 20 6c 65 66 74 20 73 69  de.  The left si
25930 62 6c 69 6e 67 73 20 61 72 65 20 61 6c 77 61 79  blings are alway
25940 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77  s nearly full, w
25950 68 69 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72 69  hile the.  ** ri
25960 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67  ght-most sibling
25970 20 6d 69 67 68 74 20 62 65 20 6e 65 61 72 6c 79   might be nearly
25980 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20 62 6c   empty.  This bl
25990 6f 63 6b 20 6f 66 20 63 6f 64 65 20 61 74 74 65  ock of code atte
259a0 6d 70 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a  mpts.  ** to adj
259b0 75 73 74 20 74 68 65 20 70 61 63 6b 69 6e 67 20  ust the packing 
259c0 6f 66 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 67  of siblings to g
259d0 65 74 20 61 20 62 65 74 74 65 72 20 62 61 6c 61  et a better bala
259e0 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  nce..  **.  ** T
259f0 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69  his adjustment i
25a00 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f  s more than an o
25a10 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68  ptimization.  Th
25a20 65 20 70 61 63 6b 69 6e 67 20 61 62 6f 76 65 20  e packing above 
25a30 6d 69 67 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f  might.  ** be so
25a40 20 6f 75 74 20 6f 66 20 62 61 6c 61 6e 63 65 20   out of balance 
25a50 61 73 20 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c  as to be illegal
25a60 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
25a70 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20  the right-most. 
25a80 20 2a 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67 68   ** sibling migh
25a90 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20  t be completely 
25aa0 65 6d 70 74 79 2e 20 20 54 68 69 73 20 61 64 6a  empty.  This adj
25ab0 75 73 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f  ustment is not o
25ac0 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20  ptional..  */.  
25ad0 66 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20  for(i=k-1; i>0; 
25ae0 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a  i--){.    int sz
25af0 52 69 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d  Right = szNew[i]
25b00 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69  ;  /* Size of si
25b10 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 72 69 67  bling on the rig
25b20 68 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a  ht */.    int sz
25b30 4c 65 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31  Left = szNew[i-1
25b40 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69  ]; /* Size of si
25b50 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66  bling on the lef
25b60 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20  t */.    int r; 
25b70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25b80 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d 6d  Index of right-m
25b90 6f 73 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74  ost cell in left
25ba0 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20   sibling */.    
25bb0 69 6e 74 20 64 3b 20 20 20 20 20 20 20 20 20 20  int d;          
25bc0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
25bd0 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 20 74 68  first cell to th
25be0 65 20 6c 65 66 74 20 6f 66 20 72 69 67 68 74 20  e left of right 
25bf0 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20  sibling */..    
25c00 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20  r = cntNew[i-1] 
25c10 2d 20 31 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b  - 1;.    d = r +
25c20 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20   1 - leafData;. 
25c30 20 20 20 61 73 73 65 72 74 28 20 64 3c 6e 4d 61     assert( d<nMa
25c40 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73  xCells );.    as
25c50 73 65 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c  sert( r<nMaxCell
25c60 73 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  s );.    while( 
25c70 73 7a 52 69 67 68 74 3d 3d 30 20 7c 7c 20 73 7a  szRight==0 || sz
25c80 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b  Right+szCell[d]+
25c90 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a 43 65 6c  2<=szLeft-(szCel
25ca0 6c 5b 72 5d 2b 32 29 20 29 7b 0a 20 20 20 20 20  l[r]+2) ){.     
25cb0 20 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a 43 65   szRight += szCe
25cc0 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20 20 20  ll[d] + 2;.     
25cd0 20 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43 65 6c   szLeft -= szCel
25ce0 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20  l[r] + 2;.      
25cf0 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20  cntNew[i-1]--;. 
25d00 20 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b       r = cntNew[
25d10 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 20 20  i-1] - 1;.      
25d20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66  d = r + 1 - leaf
25d30 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Data;.    }.    
25d40 73 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69 67  szNew[i] = szRig
25d50 68 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b 69 2d  ht;.    szNew[i-
25d60 31 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20 20 7d  1] = szLeft;.  }
25d70 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 77 65  ..  /* Either we
25d80 20 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f   found one or mo
25d90 72 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e 65 77  re cells (cntnew
25da0 5b 30 5d 29 3e 30 29 20 6f 72 20 77 65 20 61 72  [0])>0) or we ar
25db0 65 20 74 68 65 0a 20 20 2a 2a 20 61 20 76 69 72  e the.  ** a vir
25dc0 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20  tual root page. 
25dd0 20 41 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20   A virtual root 
25de0 70 61 67 65 20 69 73 20 77 68 65 6e 20 74 68 65  page is when the
25df0 20 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20   real root.  ** 
25e00 70 61 67 65 20 69 73 20 70 61 67 65 20 31 20 61  page is page 1 a
25e10 6e 64 20 77 65 20 61 72 65 20 74 68 65 20 6f 6e  nd we are the on
25e20 6c 79 20 63 68 69 6c 64 20 6f 66 20 74 68 61 74  ly child of that
25e30 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   page..  */.  as
25e40 73 65 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e  sert( cntNew[0]>
25e50 30 20 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70  0 || (pParent->p
25e60 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 72 65 6e  gno==1 && pParen
25e70 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a  t->nCell==0) );.
25e80 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63  .  /*.  ** Alloc
25e90 61 74 65 20 6b 20 6e 65 77 20 70 61 67 65 73 2e  ate k new pages.
25ea0 20 20 52 65 75 73 65 20 6f 6c 64 20 70 61 67 65    Reuse old page
25eb0 73 20 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65  s where possible
25ec0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
25ed0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3e 31 20 29   pPage->pgno>1 )
25ee0 3b 0a 20 20 70 61 67 65 46 6c 61 67 73 20 3d 20  ;.  pageFlags = 
25ef0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3b  pPage->aData[0];
25f00 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b  .  for(i=0; i<k;
25f10 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61   i++){.    MemPa
25f20 67 65 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66  ge *pNew;.    if
25f30 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20  ( i<nOld ){.    
25f40 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69    pNew = apNew[i
25f50 5d 20 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20  ] = apOld[i];.  
25f60 20 20 20 20 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d      pgnoNew[i] =
25f70 20 70 67 6e 6f 4f 6c 64 5b 69 5d 3b 0a 20 20 20   pgnoOld[i];.   
25f80 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b     apOld[i] = 0;
25f90 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
25fa0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e  te3PagerWrite(pN
25fb0 65 77 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ew->pDbPage);.  
25fc0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
25fd0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
25fe0 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  p;.    }else{.  
25ff0 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 30 20      assert( i>0 
26000 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c  );.      rc = al
26010 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
26020 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e  pBt, &pNew, &pgn
26030 6f 4e 65 77 5b 69 5d 2c 20 70 67 6e 6f 4e 65 77  oNew[i], pgnoNew
26040 5b 69 2d 31 5d 2c 20 30 29 3b 0a 20 20 20 20 20  [i-1], 0);.     
26050 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
26060 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
26070 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d        apNew[i] =
26080 20 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20 20   pNew;.    }.   
26090 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 7a 65 72   nNew++;.    zer
260a0 6f 50 61 67 65 28 70 4e 65 77 2c 20 70 61 67 65  oPage(pNew, page
260b0 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Flags);.  }..  /
260c0 2a 20 46 72 65 65 20 61 6e 79 20 6f 6c 64 20 70  * Free any old p
260d0 61 67 65 73 20 74 68 61 74 20 77 65 72 65 20 6e  ages that were n
260e0 6f 74 20 72 65 75 73 65 64 20 61 73 20 6e 65 77  ot reused as new
260f0 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77   pages..  */.  w
26100 68 69 6c 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a  hile( i<nOld ){.
26110 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
26120 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20  e(apOld[i]);.   
26130 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
26140 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
26150 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
26160 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61  apOld[i]);.    a
26170 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  pOld[i] = 0;.   
26180 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a   i++;.  }..  /*.
26190 20 20 2a 2a 20 50 75 74 20 74 68 65 20 6e 65 77    ** Put the new
261a0 20 70 61 67 65 73 20 69 6e 20 61 63 63 65 6e 64   pages in accend
261b0 69 6e 67 20 6f 72 64 65 72 2e 20 20 54 68 69 73  ing order.  This
261c0 20 68 65 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b   helps to.  ** k
261d0 65 65 70 20 65 6e 74 72 69 65 73 20 69 6e 20 74  eep entries in t
261e0 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69 6e 20  he disk file in 
261f0 6f 72 64 65 72 20 73 6f 20 74 68 61 74 20 61 20  order so that a 
26200 73 63 61 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65  scan.  ** of the
26210 20 74 61 62 6c 65 20 69 73 20 61 20 6c 69 6e 65   table is a line
26220 61 72 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20  ar scan through 
26230 74 68 65 20 66 69 6c 65 2e 20 20 54 68 61 74 0a  the file.  That.
26240 20 20 2a 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c    ** in turn hel
26250 70 73 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  ps the operating
26260 20 73 79 73 74 65 6d 20 74 6f 20 64 65 6c 69 76   system to deliv
26270 65 72 20 70 61 67 65 73 0a 20 20 2a 2a 20 66 72  er pages.  ** fr
26280 6f 6d 20 74 68 65 20 64 69 73 6b 20 6d 6f 72 65  om the disk more
26290 20 72 61 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20   rapidly..  **. 
262a0 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29 20 69 6e   ** An O(n^2) in
262b0 73 65 72 74 69 6f 6e 20 73 6f 72 74 20 61 6c 67  sertion sort alg
262c0 6f 72 69 74 68 6d 20 69 73 20 75 73 65 64 2c 20  orithm is used, 
262d0 62 75 74 20 73 69 6e 63 65 0a 20 20 2a 2a 20 6e  but since.  ** n
262e0 20 69 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 74   is never more t
262f0 68 61 6e 20 4e 42 20 28 61 20 73 6d 61 6c 6c 20  han NB (a small 
26300 63 6f 6e 73 74 61 6e 74 29 2c 20 74 68 61 74 20  constant), that 
26310 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20  should.  ** not 
26320 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20  be a problem..  
26330 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 4e 42 3d  **.  ** When NB=
26340 3d 33 2c 20 74 68 69 73 20 6f 6e 65 20 6f 70 74  =3, this one opt
26350 69 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b 65 73 20  imization makes 
26360 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a  the database.  *
26370 2a 20 61 62 6f 75 74 20 32 35 25 20 66 61 73 74  * about 25% fast
26380 65 72 20 66 6f 72 20 6c 61 72 67 65 20 69 6e 73  er for large ins
26390 65 72 74 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65  ertions and dele
263a0 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  tions..  */.  fo
263b0 72 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b  r(i=0; i<k-1; i+
263c0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 56  +){.    int minV
263d0 20 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20   = pgnoNew[i];. 
263e0 20 20 20 69 6e 74 20 6d 69 6e 49 20 3d 20 69 3b     int minI = i;
263f0 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20  .    for(j=i+1; 
26400 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  j<k; j++){.     
26410 20 69 66 28 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3c   if( pgnoNew[j]<
26420 28 75 6e 73 69 67 6e 65 64 29 6d 69 6e 56 20 29  (unsigned)minV )
26430 7b 0a 20 20 20 20 20 20 20 20 6d 69 6e 49 20 3d  {.        minI =
26440 20 6a 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e 56   j;.        minV
26450 20 3d 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3b 0a 20   = pgnoNew[j];. 
26460 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
26470 20 69 66 28 20 6d 69 6e 49 3e 69 20 29 7b 0a 20   if( minI>i ){. 
26480 20 20 20 20 20 69 6e 74 20 74 3b 0a 20 20 20 20       int t;.    
26490 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 3b 0a 20    MemPage *pT;. 
264a0 20 20 20 20 20 74 20 3d 20 70 67 6e 6f 4e 65 77       t = pgnoNew
264b0 5b 69 5d 3b 0a 20 20 20 20 20 20 70 54 20 3d 20  [i];.      pT = 
264c0 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20  apNew[i];.      
264d0 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70 67 6e  pgnoNew[i] = pgn
264e0 6f 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20  oNew[minI];.    
264f0 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4e    apNew[i] = apN
26500 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20  ew[minI];.      
26510 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20  pgnoNew[minI] = 
26520 74 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 6d  t;.      apNew[m
26530 69 6e 49 5d 20 3d 20 70 54 3b 0a 20 20 20 20 7d  inI] = pT;.    }
26540 0a 20 20 7d 0a 20 20 54 52 41 43 45 28 28 22 42  .  }.  TRACE(("B
26550 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20  ALANCE: old: %d 
26560 25 64 20 25 64 20 20 6e 65 77 3a 20 25 64 28 25  %d %d  new: %d(%
26570 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29  d) %d(%d) %d(%d)
26580 20 25 64 28 25 64 29 20 25 64 28 25 64 29 5c 6e   %d(%d) %d(%d)\n
26590 22 2c 0a 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 30  ",.    pgnoOld[0
265a0 5d 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32 20  ], .    nOld>=2 
265b0 3f 20 70 67 6e 6f 4f 6c 64 5b 31 5d 20 3a 20 30  ? pgnoOld[1] : 0
265c0 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20  ,.    nOld>=3 ? 
265d0 70 67 6e 6f 4f 6c 64 5b 32 5d 20 3a 20 30 2c 0a  pgnoOld[2] : 0,.
265e0 20 20 20 20 70 67 6e 6f 4e 65 77 5b 30 5d 2c 20      pgnoNew[0], 
265f0 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e  szNew[0],.    nN
26600 65 77 3e 3d 32 20 3f 20 70 67 6e 6f 4e 65 77 5b  ew>=2 ? pgnoNew[
26610 31 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32 20  1] : 0, nNew>=2 
26620 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a  ? szNew[1] : 0,.
26630 20 20 20 20 6e 4e 65 77 3e 3d 33 20 3f 20 70 67      nNew>=3 ? pg
26640 6e 6f 4e 65 77 5b 32 5d 20 3a 20 30 2c 20 6e 4e  noNew[2] : 0, nN
26650 65 77 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b 32 5d  ew>=3 ? szNew[2]
26660 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d   : 0,.    nNew>=
26670 34 20 3f 20 70 67 6e 6f 4e 65 77 5b 33 5d 20 3a  4 ? pgnoNew[3] :
26680 20 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a   0, nNew>=4 ? sz
26690 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a 20 20 20 20  New[3] : 0,.    
266a0 6e 4e 65 77 3e 3d 35 20 3f 20 70 67 6e 6f 4e 65  nNew>=5 ? pgnoNe
266b0 77 5b 34 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d  w[4] : 0, nNew>=
266c0 35 20 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a 20 30  5 ? szNew[4] : 0
266d0 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45  ));..  /*.  ** E
266e0 76 65 6e 6c 79 20 64 69 73 74 72 69 62 75 74 65  venly distribute
266f0 20 74 68 65 20 64 61 74 61 20 69 6e 20 61 70 43   the data in apC
26700 65 6c 6c 5b 5d 20 61 63 72 6f 73 73 20 74 68 65  ell[] across the
26710 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a   new pages..  **
26720 20 49 6e 73 65 72 74 20 64 69 76 69 64 65 72 20   Insert divider 
26730 63 65 6c 6c 73 20 69 6e 74 6f 20 70 50 61 72 65  cells into pPare
26740 6e 74 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  nt as necessary.
26750 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20  .  */.  j = 0;. 
26760 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77   for(i=0; i<nNew
26770 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 41  ; i++){.    /* A
26780 73 73 65 6d 62 6c 65 20 74 68 65 20 6e 65 77 20  ssemble the new 
26790 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f  sibling page. */
267a0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  .    MemPage *pN
267b0 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20  ew = apNew[i];. 
267c0 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61     assert( j<nMa
267d0 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73  xCells );.    as
267e0 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 67 6e 6f  sert( pNew->pgno
267f0 3d 3d 70 67 6e 6f 4e 65 77 5b 69 5d 20 29 3b 0a  ==pgnoNew[i] );.
26800 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65      assemblePage
26810 28 70 4e 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d  (pNew, cntNew[i]
26820 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20  -j, &apCell[j], 
26830 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20  &szCell[j]);.   
26840 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e   assert( pNew->n
26850 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d  Cell>0 || (nNew=
26860 3d 31 20 26 26 20 63 6e 74 4e 65 77 5b 30 5d 3d  =1 && cntNew[0]=
26870 3d 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  =0) );.    asser
26880 74 28 20 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c  t( pNew->nOverfl
26890 6f 77 3d 3d 30 20 29 3b 0a 0a 23 69 66 6e 64 65  ow==0 );..#ifnde
268a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
268b0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 2f 2a 20  TOVACUUM.    /* 
268c0 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75  If this is an au
268d0 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
268e0 73 65 2c 20 75 70 64 61 74 65 20 74 68 65 20 70  se, update the p
268f0 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69  ointer map entri
26900 65 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 70  es.    ** that p
26910 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 69 62 6c  oint to the sibl
26920 69 6e 67 73 20 74 68 61 74 20 77 65 72 65 20 72  ings that were r
26930 65 61 72 72 61 6e 67 65 64 2e 20 54 68 65 73 65  earranged. These
26940 20 63 61 6e 20 62 65 3a 20 6c 65 66 74 0a 20 20   can be: left.  
26950 20 20 2a 2a 20 63 68 69 6c 64 72 65 6e 20 6f 66    ** children of
26960 20 63 65 6c 6c 73 2c 20 74 68 65 20 72 69 67 68   cells, the righ
26970 74 2d 63 68 69 6c 64 20 6f 66 20 74 68 65 20 70  t-child of the p
26980 61 67 65 2c 20 6f 72 20 6f 76 65 72 66 6c 6f 77  age, or overflow
26990 20 70 61 67 65 73 0a 20 20 20 20 2a 2a 20 70 6f   pages.    ** po
269a0 69 6e 74 65 64 20 74 6f 20 62 79 20 63 65 6c 6c  inted to by cell
269b0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
269c0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
269d0 6d 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6b  m ){.      for(k
269e0 3d 6a 3b 20 6b 3c 63 6e 74 4e 65 77 5b 69 5d 3b  =j; k<cntNew[i];
269f0 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61   k++){.        a
26a00 73 73 65 72 74 28 20 6b 3c 6e 4d 61 78 43 65 6c  ssert( k<nMaxCel
26a10 6c 73 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ls );.        if
26a20 28 20 61 46 72 6f 6d 5b 6b 5d 3d 3d 30 78 46 46  ( aFrom[k]==0xFF
26a30 20 7c 7c 20 61 70 43 6f 70 79 5b 61 46 72 6f 6d   || apCopy[aFrom
26a40 5b 6b 5d 5d 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77  [k]]->pgno!=pNew
26a50 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  ->pgno ){.      
26a60 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
26a70 75 74 4f 76 66 6c 28 70 4e 65 77 2c 20 6b 2d 6a  utOvfl(pNew, k-j
26a80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
26a90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
26aa0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  {.            go
26ab0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
26ac0 75 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  up;.          }.
26ad0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26ae0 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
26af0 20 20 20 20 6a 20 3d 20 63 6e 74 4e 65 77 5b 69      j = cntNew[i
26b00 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  ];..    /* If th
26b10 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 61  e sibling page a
26b20 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 77  ssembled above w
26b30 61 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74  as not the right
26b40 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 2c 0a 20  -most sibling,. 
26b50 20 20 20 2a 2a 20 69 6e 73 65 72 74 20 61 20 64     ** insert a d
26b60 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f  ivider cell into
26b70 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
26b80 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
26b90 20 69 3c 6e 4e 65 77 2d 31 20 26 26 20 6a 3c 6e   i<nNew-1 && j<n
26ba0 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 75 38  Cell ){.      u8
26bb0 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 75   *pCell;.      u
26bc0 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20  8 *pTemp;.      
26bd0 69 6e 74 20 73 7a 3b 0a 0a 20 20 20 20 20 20 61  int sz;..      a
26be0 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c  ssert( j<nMaxCel
26bf0 6c 73 20 29 3b 0a 20 20 20 20 20 20 70 43 65 6c  ls );.      pCel
26c00 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20  l = apCell[j];. 
26c10 20 20 20 20 20 73 7a 20 3d 20 73 7a 43 65 6c 6c       sz = szCell
26c20 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f 72 72 65 63  [j] + leafCorrec
26c30 74 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  tion;.      if( 
26c40 21 70 4e 65 77 2d 3e 6c 65 61 66 20 29 7b 0a 20  !pNew->leaf ){. 
26c50 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
26c60 4e 65 77 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 70  New->aData[8], p
26c70 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20  Cell, 4);.      
26c80 20 20 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20    pTemp = 0;.   
26c90 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 65 61     }else if( lea
26ca0 66 44 61 74 61 20 29 7b 0a 09 2f 2a 20 49 66 20  fData ){../* If 
26cb0 74 68 65 20 74 72 65 65 20 69 73 20 61 20 6c 65  the tree is a le
26cc0 61 66 2d 64 61 74 61 20 74 72 65 65 2c 20 61 6e  af-data tree, an
26cd0 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61  d the siblings a
26ce0 72 65 20 6c 65 61 76 65 73 2c 20 0a 20 20 20 20  re leaves, .    
26cf0 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72      ** then ther
26d00 65 20 69 73 20 6e 6f 20 64 69 76 69 64 65 72 20  e is no divider 
26d10 63 65 6c 6c 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  cell in apCell[]
26d20 2e 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 64  . Instead, the d
26d30 69 76 69 64 65 72 20 0a 20 20 20 20 20 20 20 20  ivider .        
26d40 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73  ** cell consists
26d50 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20   of the integer 
26d60 6b 65 79 20 66 6f 72 20 74 68 65 20 72 69 67 68  key for the righ
26d70 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f 66 20 0a  t-most cell of .
26d80 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73          ** the s
26d90 69 62 6c 69 6e 67 2d 70 61 67 65 20 61 73 73 65  ibling-page asse
26da0 6d 62 6c 65 64 20 61 62 6f 76 65 20 6f 6e 6c 79  mbled above only
26db0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
26dc0 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e       CellInfo in
26dd0 66 6f 3b 0a 20 20 20 20 20 20 20 20 6a 2d 2d 3b  fo;.        j--;
26de0 0a 20 20 20 20 20 20 20 20 70 61 72 73 65 43 65  .        parseCe
26df0 6c 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43 65  llPtr(pNew, apCe
26e00 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20  ll[j], &info);. 
26e10 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 26         pCell = &
26e20 61 53 70 61 63 65 5b 69 53 70 61 63 65 5d 3b 0a  aSpace[iSpace];.
26e30 20 20 20 20 20 20 20 20 66 69 6c 6c 49 6e 43 65          fillInCe
26e40 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 43 65 6c  ll(pParent, pCel
26e50 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c  l, 0, info.nKey,
26e60 20 30 2c 20 30 2c 20 26 73 7a 29 3b 0a 20 20 20   0, 0, &sz);.   
26e70 20 20 20 20 20 69 53 70 61 63 65 20 2b 3d 20 73       iSpace += s
26e80 7a 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  z;.        asser
26e90 74 28 20 69 53 70 61 63 65 3c 3d 70 42 74 2d 3e  t( iSpace<=pBt->
26ea0 70 61 67 65 53 69 7a 65 2a 35 20 29 3b 0a 20 20  pageSize*5 );.  
26eb0 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 30 3b        pTemp = 0;
26ec0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
26ed0 20 20 20 20 20 20 70 43 65 6c 6c 20 2d 3d 20 34        pCell -= 4
26ee0 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70 20  ;.        pTemp 
26ef0 3d 20 26 61 53 70 61 63 65 5b 69 53 70 61 63 65  = &aSpace[iSpace
26f00 5d 3b 0a 20 20 20 20 20 20 20 20 69 53 70 61 63  ];.        iSpac
26f10 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20  e += sz;.       
26f20 20 61 73 73 65 72 74 28 20 69 53 70 61 63 65 3c   assert( iSpace<
26f30 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 35  =pBt->pageSize*5
26f40 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
26f50 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c    rc = insertCel
26f60 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76  l(pParent, nxDiv
26f70 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54 65  , pCell, sz, pTe
26f80 6d 70 2c 20 34 29 3b 0a 20 20 20 20 20 20 69 66  mp, 4);.      if
26f90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
26fa0 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
26fb0 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 70 75  leanup;.      pu
26fc0 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66  t4byte(findOverf
26fd0 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  lowCell(pParent,
26fe0 6e 78 44 69 76 29 2c 20 70 4e 65 77 2d 3e 70 67  nxDiv), pNew->pg
26ff0 6e 6f 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  no);.#ifndef SQL
27000 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
27010 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  UUM.      /* If 
27020 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d  this is an auto-
27030 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c  vacuum database,
27040 20 61 6e 64 20 6e 6f 74 20 61 20 6c 65 61 66 2d   and not a leaf-
27050 64 61 74 61 20 74 72 65 65 2c 0a 20 20 20 20 20  data tree,.     
27060 20 2a 2a 20 74 68 65 6e 20 75 70 64 61 74 65 20   ** then update 
27070 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
27080 77 69 74 68 20 61 6e 20 65 6e 74 72 79 20 66 6f  with an entry fo
27090 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
270a0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  age.      ** tha
270b0 74 20 74 68 65 20 63 65 6c 6c 20 6a 75 73 74 20  t the cell just 
270c0 69 6e 73 65 72 74 65 64 20 70 6f 69 6e 74 73 20  inserted points 
270d0 74 6f 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20  to (if any)..   
270e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
270f0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
27100 26 26 20 21 6c 65 61 66 44 61 74 61 20 29 7b 0a  && !leafData ){.
27110 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72          rc = ptr
27120 6d 61 70 50 75 74 4f 76 66 6c 28 70 50 61 72 65  mapPutOvfl(pPare
27130 6e 74 2c 20 6e 78 44 69 76 29 3b 0a 20 20 20 20  nt, nxDiv);.    
27140 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
27150 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
27160 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
27170 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20  cleanup;.       
27180 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
27190 66 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20  f.      j++;.   
271a0 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20 20 20     nxDiv++;.    
271b0 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
271c0 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  j==nCell );.  as
271d0 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20 29 3b 0a  sert( nOld>0 );.
271e0 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 30    assert( nNew>0
271f0 20 29 3b 0a 20 20 69 66 28 20 28 70 61 67 65 46   );.  if( (pageF
27200 6c 61 67 73 20 26 20 50 54 46 5f 4c 45 41 46 29  lags & PTF_LEAF)
27210 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  ==0 ){.    memcp
27220 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d  y(&apNew[nNew-1]
27230 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 61 70 43  ->aData[8], &apC
27240 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61  opy[nOld-1]->aDa
27250 74 61 5b 38 5d 2c 20 34 29 3b 0a 20 20 7d 0a 20  ta[8], 4);.  }. 
27260 20 69 66 28 20 6e 78 44 69 76 3d 3d 70 50 61 72   if( nxDiv==pPar
27270 65 6e 74 2d 3e 6e 43 65 6c 6c 2b 70 50 61 72 65  ent->nCell+pPare
27280 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b  nt->nOverflow ){
27290 0a 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 6d 6f  .    /* Right-mo
272a0 73 74 20 73 69 62 6c 69 6e 67 20 69 73 20 74 68  st sibling is th
272b0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69  e right-most chi
272c0 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 20 2a 2f  ld of pParent */
272d0 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70  .    put4byte(&p
272e0 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
272f0 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
27300 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e 65  +8], pgnoNew[nNe
27310 77 2d 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  w-1]);.  }else{.
27320 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 6d 6f 73      /* Right-mos
27330 74 20 73 69 62 6c 69 6e 67 20 69 73 20 74 68 65  t sibling is the
27340 20 6c 65 66 74 20 63 68 69 6c 64 20 6f 66 20 74   left child of t
27350 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
27360 6e 20 70 50 61 72 65 6e 74 0a 20 20 20 20 2a 2a  n pParent.    **
27370 20 70 61 73 74 20 74 68 65 20 72 69 67 68 74 2d   past the right-
27380 6d 6f 73 74 20 64 69 76 69 64 65 72 20 65 6e 74  most divider ent
27390 72 79 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79  ry */.    put4by
273a0 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43  te(findOverflowC
273b0 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44  ell(pParent, nxD
273c0 69 76 29 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e 65  iv), pgnoNew[nNe
273d0 77 2d 31 5d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  w-1]);.  }..  /*
273e0 0a 20 20 2a 2a 20 52 65 70 61 72 65 6e 74 20 63  .  ** Reparent c
273f0 68 69 6c 64 72 65 6e 20 6f 66 20 61 6c 6c 20 63  hildren of all c
27400 65 6c 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ells..  */.  for
27410 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b  (i=0; i<nNew; i+
27420 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 70  +){.    rc = rep
27430 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73 28  arentChildPages(
27440 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 69  apNew[i]);.    i
27450 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
27460 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
27470 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 72  cleanup;.  }.  r
27480 63 20 3d 20 72 65 70 61 72 65 6e 74 43 68 69 6c  c = reparentChil
27490 64 50 61 67 65 73 28 70 50 61 72 65 6e 74 29 3b  dPages(pParent);
274a0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
274b0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61  E_OK ) goto bala
274c0 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 0a 20 20  nce_cleanup;..  
274d0 2f 2a 0a 20 20 2a 2a 20 42 61 6c 61 6e 63 65 20  /*.  ** Balance 
274e0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
274f0 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20    Note that the 
27500 63 75 72 72 65 6e 74 20 70 61 67 65 20 28 70 50  current page (pP
27510 61 67 65 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20  age) might.  ** 
27520 68 61 76 65 20 62 65 65 6e 20 61 64 64 65 64 20  have been added 
27530 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  to the freelist 
27540 73 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f 20 6c  so it might no l
27550 6f 6e 67 65 72 20 62 65 20 69 6e 69 74 69 61 6c  onger be initial
27560 69 7a 65 64 2e 0a 20 20 2a 2a 20 42 75 74 20 74  ized..  ** But t
27570 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 77  he parent page w
27580 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 69 6e  ill always be in
27590 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a  itialized..  */.
275a0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
275b0 74 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 72  t->isInit );.  r
275c0 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61 72  c = balance(pPar
275d0 65 6e 74 2c 20 30 29 3b 0a 20 20 0a 20 20 2f 2a  ent, 0);.  .  /*
275e0 0a 20 20 2a 2a 20 43 6c 65 61 6e 75 70 20 62 65  .  ** Cleanup be
275f0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
27600 20 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f 63 6c 65    */.balance_cle
27610 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 46 72  anup:.  sqliteFr
27620 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 66 6f  ee(apCell);.  fo
27630 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69  r(i=0; i<nOld; i
27640 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  ++){.    release
27650 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a  Page(apOld[i]);.
27660 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
27670 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nNew; i++){.   
27680 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4e   releasePage(apN
27690 65 77 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65  ew[i]);.  }.  re
276a0 6c 65 61 73 65 50 61 67 65 28 70 50 61 72 65 6e  leasePage(pParen
276b0 74 29 3b 0a 20 20 54 52 41 43 45 28 28 22 42 41  t);.  TRACE(("BA
276c0 4c 41 4e 43 45 3a 20 66 69 6e 69 73 68 65 64 20  LANCE: finished 
276d0 77 69 74 68 20 25 64 3a 20 6f 6c 64 3d 25 64 20  with %d: old=%d 
276e0 6e 65 77 3d 25 64 20 63 65 6c 6c 73 3d 25 64 5c  new=%d cells=%d\
276f0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 50  n",.          pP
27700 61 67 65 2d 3e 70 67 6e 6f 2c 20 6e 4f 6c 64 2c  age->pgno, nOld,
27710 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c 29 29 3b 0a   nNew, nCell));.
27720 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
27730 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
27740 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  ne is called for
27750 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
27760 66 20 61 20 62 74 72 65 65 20 77 68 65 6e 20 74  f a btree when t
27770 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20  he root.** page 
27780 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c  contains no cell
27790 73 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20 6f  s.  This is an o
277a0 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 6d 61  pportunity to ma
277b0 6b 65 20 74 68 65 20 74 72 65 65 0a 2a 2a 20 73  ke the tree.** s
277c0 68 61 6c 6c 6f 77 65 72 20 62 79 20 6f 6e 65 20  hallower by one 
277d0 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
277e0 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 73 68 61   int balance_sha
277f0 6c 6c 6f 77 65 72 28 4d 65 6d 50 61 67 65 20 2a  llower(MemPage *
27800 70 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67  pPage){.  MemPag
27810 65 20 2a 70 43 68 69 6c 64 3b 20 20 20 20 20 20  e *pChild;      
27820 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e         /* The on
27830 6c 79 20 63 68 69 6c 64 20 70 61 67 65 20 6f 66  ly child page of
27840 20 70 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f   pPage */.  Pgno
27850 20 70 67 6e 6f 43 68 69 6c 64 3b 20 20 20 20 20   pgnoChild;     
27860 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
27870 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 43 68 69   number for pChi
27880 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ld */.  int rc =
27890 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
278a0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
278b0 6f 64 65 20 66 72 6f 6d 20 73 75 62 70 72 6f 63  ode from subproc
278c0 65 64 75 72 65 73 20 2a 2f 0a 20 20 42 74 53 68  edures */.  BtSh
278d0 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20  ared *pBt;      
278e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
278f0 68 65 20 6d 61 69 6e 20 42 54 72 65 65 20 73 74  he main BTree st
27900 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74  ructure */.  int
27910 20 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 3b 20   mxCellPerPage; 
27920 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
27930 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63  imum number of c
27940 65 6c 6c 73 20 70 65 72 20 70 61 67 65 20 2a 2f  ells per page */
27950 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 3b 20  .  u8 **apCell; 
27960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27970 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 66 72 6f  /* All cells fro
27980 6d 20 70 61 67 65 73 20 62 65 69 6e 67 20 62 61  m pages being ba
27990 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20  lanced */.  int 
279a0 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  *szCell;        
279b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61           /* Loca
279c0 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65  l size of all ce
279d0 6c 6c 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  lls */..  assert
279e0 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  ( pPage->pParent
279f0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
27a00 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30   pPage->nCell==0
27a10 20 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67   );.  pBt = pPag
27a20 65 2d 3e 70 42 74 3b 0a 20 20 6d 78 43 65 6c 6c  e->pBt;.  mxCell
27a30 50 65 72 50 61 67 65 20 3d 20 4d 58 5f 43 45 4c  PerPage = MX_CEL
27a40 4c 28 70 42 74 29 3b 0a 20 20 61 70 43 65 6c 6c  L(pBt);.  apCell
27a50 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
27a60 61 77 28 20 6d 78 43 65 6c 6c 50 65 72 50 61 67  aw( mxCellPerPag
27a70 65 2a 28 73 69 7a 65 6f 66 28 75 38 2a 29 2b 73  e*(sizeof(u8*)+s
27a80 69 7a 65 6f 66 28 69 6e 74 29 29 20 29 3b 0a 20  izeof(int)) );. 
27a90 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29   if( apCell==0 )
27aa0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
27ab0 4f 4d 45 4d 3b 0a 20 20 73 7a 43 65 6c 6c 20 3d  OMEM;.  szCell =
27ac0 20 28 69 6e 74 2a 29 26 61 70 43 65 6c 6c 5b 6d   (int*)&apCell[m
27ad0 78 43 65 6c 6c 50 65 72 50 61 67 65 5d 3b 0a 20  xCellPerPage];. 
27ae0 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
27af0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 74   ){.    /* The t
27b00 61 62 6c 65 20 69 73 20 63 6f 6d 70 6c 65 74 65  able is complete
27b10 6c 79 20 65 6d 70 74 79 20 2a 2f 0a 20 20 20 20  ly empty */.    
27b20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
27b30 20 65 6d 70 74 79 20 74 61 62 6c 65 20 25 64 5c   empty table %d\
27b40 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  n", pPage->pgno)
27b50 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
27b60 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65  /* The root page
27b70 20 69 73 20 65 6d 70 74 79 20 62 75 74 20 68 61   is empty but ha
27b80 73 20 6f 6e 65 20 63 68 69 6c 64 2e 20 20 54 72  s one child.  Tr
27b90 61 6e 73 66 65 72 20 74 68 65 0a 20 20 20 20 2a  ansfer the.    *
27ba0 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  * information fr
27bb0 6f 6d 20 74 68 61 74 20 6f 6e 65 20 63 68 69 6c  om that one chil
27bc0 64 20 69 6e 74 6f 20 74 68 65 20 72 6f 6f 74 20  d into the root 
27bd0 70 61 67 65 20 69 66 20 69 74 20 0a 20 20 20 20  page if it .    
27be0 2a 2a 20 77 69 6c 6c 20 66 69 74 2e 20 20 54 68  ** will fit.  Th
27bf0 69 73 20 72 65 64 75 63 65 73 20 74 68 65 20 64  is reduces the d
27c00 65 70 74 68 20 6f 66 20 74 68 65 20 74 72 65 65  epth of the tree
27c10 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a   by one..    **.
27c20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 72 6f      ** If the ro
27c30 6f 74 20 70 61 67 65 20 69 73 20 70 61 67 65 20  ot page is page 
27c40 31 2c 20 69 74 20 68 61 73 20 6c 65 73 73 20 73  1, it has less s
27c50 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 74  pace available t
27c60 68 61 6e 0a 20 20 20 20 2a 2a 20 69 74 73 20 63  han.    ** its c
27c70 68 69 6c 64 20 28 64 75 65 20 74 6f 20 74 68 65  hild (due to the
27c80 20 31 30 30 20 62 79 74 65 20 68 65 61 64 65 72   100 byte header
27c90 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 74 20   that occurs at 
27ca0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20  the beginning.  
27cb0 20 20 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61    ** of the data
27cc0 62 61 73 65 20 66 6c 65 29 2c 20 73 6f 20 69 74  base fle), so it
27cd0 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61 62   might not be ab
27ce0 6c 65 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6f  le to hold all o
27cf0 66 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 69 6e  f the .    ** in
27d00 66 6f 72 6d 61 74 69 6f 6e 20 63 75 72 72 65 6e  formation curren
27d10 74 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  tly contained in
27d20 20 74 68 65 20 63 68 69 6c 64 2e 20 20 49 66 20   the child.  If 
27d30 74 68 69 73 20 69 73 20 74 68 65 20 0a 20 20 20  this is the .   
27d40 20 2a 2a 20 63 61 73 65 2c 20 74 68 65 6e 20 64   ** case, then d
27d50 6f 20 6e 6f 74 20 64 6f 20 74 68 65 20 74 72 61  o not do the tra
27d60 6e 73 66 65 72 2e 20 20 4c 65 61 76 65 20 70 61  nsfer.  Leave pa
27d70 67 65 20 31 20 65 6d 70 74 79 20 65 78 63 65 70  ge 1 empty excep
27d80 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65  t.    ** for the
27d90 20 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 20 74   right-pointer t
27da0 6f 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  o the child page
27db0 2e 20 20 54 68 65 20 63 68 69 6c 64 20 70 61 67  .  The child pag
27dc0 65 20 62 65 63 6f 6d 65 73 0a 20 20 20 20 2a 2a  e becomes.    **
27dd0 20 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f   the virtual roo
27de0 74 20 6f 66 20 74 68 65 20 74 72 65 65 2e 0a 20  t of the tree.. 
27df0 20 20 20 2a 2f 0a 20 20 20 20 70 67 6e 6f 43 68     */.    pgnoCh
27e00 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28 26  ild = get4byte(&
27e10 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
27e20 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
27e30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
27e40 67 6e 6f 43 68 69 6c 64 3e 30 20 29 3b 0a 20 20  gnoChild>0 );.  
27e50 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 43 68    assert( pgnoCh
27e60 69 6c 64 3c 3d 73 71 6c 69 74 65 33 50 61 67 65  ild<=sqlite3Page
27e70 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
27e80 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29  ->pBt->pPager) )
27e90 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 50 61  ;.    rc = getPa
27ea0 67 65 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70  ge(pPage->pBt, p
27eb0 67 6e 6f 43 68 69 6c 64 2c 20 26 70 43 68 69 6c  gnoChild, &pChil
27ec0 64 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  d, 0);.    if( r
27ed0 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61  c ) goto end_sha
27ee0 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20  llow_balance;.  
27ef0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 67 6e    if( pPage->pgn
27f00 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 63  o==1 ){.      rc
27f10 20 3d 20 69 6e 69 74 50 61 67 65 28 70 43 68 69   = initPage(pChi
27f20 6c 64 2c 20 70 50 61 67 65 29 3b 0a 20 20 20 20  ld, pPage);.    
27f30 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
27f40 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61  end_shallow_bala
27f50 6e 63 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nce;.      asser
27f60 74 28 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72  t( pChild->nOver
27f70 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20  flow==0 );.     
27f80 20 69 66 28 20 70 43 68 69 6c 64 2d 3e 6e 46 72   if( pChild->nFr
27f90 65 65 3e 3d 31 30 30 20 29 7b 0a 20 20 20 20 20  ee>=100 ){.     
27fa0 20 20 20 2f 2a 20 54 68 65 20 63 68 69 6c 64 20     /* The child 
27fb0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 6c 6c  information will
27fc0 20 66 69 74 20 6f 6e 20 74 68 65 20 72 6f 6f 74   fit on the root
27fd0 20 70 61 67 65 2c 20 73 6f 20 64 6f 20 74 68 65   page, so do the
27fe0 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 79  .        ** copy
27ff0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
28000 69 3b 0a 20 20 20 20 20 20 20 20 7a 65 72 6f 50  i;.        zeroP
28010 61 67 65 28 70 50 61 67 65 2c 20 70 43 68 69 6c  age(pPage, pChil
28020 64 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20  d->aData[0]);.  
28030 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
28040 3c 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20  <pChild->nCell; 
28050 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
28060 61 70 43 65 6c 6c 5b 69 5d 20 3d 20 66 69 6e 64  apCell[i] = find
28070 43 65 6c 6c 28 70 43 68 69 6c 64 2c 69 29 3b 0a  Cell(pChild,i);.
28080 20 20 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c            szCell
28090 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  [i] = cellSizePt
280a0 72 28 70 43 68 69 6c 64 2c 20 61 70 43 65 6c 6c  r(pChild, apCell
280b0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  [i]);.        }.
280c0 20 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 65          assemble
280d0 50 61 67 65 28 70 50 61 67 65 2c 20 70 43 68 69  Page(pPage, pChi
280e0 6c 64 2d 3e 6e 43 65 6c 6c 2c 20 61 70 43 65 6c  ld->nCell, apCel
280f0 6c 2c 20 73 7a 43 65 6c 6c 29 3b 0a 20 20 20 20  l, szCell);.    
28100 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20      /* Copy the 
28110 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 20 6f 66  right-pointer of
28120 20 74 68 65 20 63 68 69 6c 64 20 74 6f 20 74 68   the child to th
28130 65 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20  e parent. */.   
28140 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
28150 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
28160 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  e->hdrOffset+8],
28170 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 65   .            ge
28180 74 34 62 79 74 65 28 26 70 43 68 69 6c 64 2d 3e  t4byte(&pChild->
28190 61 44 61 74 61 5b 70 43 68 69 6c 64 2d 3e 68 64  aData[pChild->hd
281a0 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20  rOffset+8]));.  
281b0 20 20 20 20 20 20 66 72 65 65 50 61 67 65 28 70        freePage(p
281c0 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 20 20  Child);.        
281d0 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
281e0 20 63 68 69 6c 64 20 25 64 20 74 72 61 6e 73 66   child %d transf
281f0 65 72 20 74 6f 20 70 61 67 65 20 31 5c 6e 22 2c  er to page 1\n",
28200 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b   pChild->pgno));
28210 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
28220 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68 69        /* The chi
28230 6c 64 20 68 61 73 20 6d 6f 72 65 20 69 6e 66 6f  ld has more info
28240 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 77 69 6c  rmation that wil
28250 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 72 6f 6f  l fit on the roo
28260 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  t..        ** Th
28270 65 20 74 72 65 65 20 69 73 20 61 6c 72 65 61 64  e tree is alread
28280 79 20 62 61 6c 61 6e 63 65 64 2e 20 20 44 6f 20  y balanced.  Do 
28290 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  nothing. */.    
282a0 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c 41      TRACE(("BALA
282b0 4e 43 45 3a 20 63 68 69 6c 64 20 25 64 20 77 69  NCE: child %d wi
282c0 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20 70 61  ll not fit on pa
282d0 67 65 20 31 5c 6e 22 2c 20 70 43 68 69 6c 64 2d  ge 1\n", pChild-
282e0 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d  >pgno));.      }
282f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
28300 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 2d 3e    memcpy(pPage->
28310 61 44 61 74 61 2c 20 70 43 68 69 6c 64 2d 3e 61  aData, pChild->a
28320 44 61 74 61 2c 20 70 50 61 67 65 2d 3e 70 42 74  Data, pPage->pBt
28330 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  ->usableSize);. 
28340 20 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e       pPage->isIn
28350 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  it = 0;.      pP
28360 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 30  age->pParent = 0
28370 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 69  ;.      rc = ini
28380 74 50 61 67 65 28 70 50 61 67 65 2c 20 30 29 3b  tPage(pPage, 0);
28390 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
283a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
283b0 20 20 20 20 20 20 66 72 65 65 50 61 67 65 28 70        freePage(p
283c0 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 54 52  Child);.      TR
283d0 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 74  ACE(("BALANCE: t
283e0 72 61 6e 73 66 65 72 20 63 68 69 6c 64 20 25 64  ransfer child %d
283f0 20 69 6e 74 6f 20 72 6f 6f 74 20 25 64 5c 6e 22   into root %d\n"
28400 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
28410 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c 20 70 50  pChild->pgno, pP
28420 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  age->pgno));.   
28430 20 7d 0a 20 20 20 20 72 63 20 3d 20 72 65 70 61   }.    rc = repa
28440 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73 28 70  rentChildPages(p
28450 50 61 67 65 29 3b 0a 20 20 20 20 61 73 73 65 72  Page);.    asser
28460 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
28470 6c 6f 77 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65  low==0 );.#ifnde
28480 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
28490 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
284a0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
284b0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
284c0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
284d0 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20  i<pPage->nCell; 
284e0 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 20 20 72  i++){ .        r
284f0 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66  c = ptrmapPutOvf
28500 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20  l(pPage, i);.   
28510 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
28520 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
28530 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61      goto end_sha
28540 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20  llow_balance;.  
28550 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
28560 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
28570 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
28580 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 68  OK ) goto end_sh
28590 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20  allow_balance;. 
285a0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
285b0 43 68 69 6c 64 29 3b 0a 20 20 7d 0a 65 6e 64 5f  Child);.  }.end_
285c0 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3a  shallow_balance:
285d0 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 61 70  .  sqliteFree(ap
285e0 43 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20  Cell);.  return 
285f0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
28600 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 6f  e root page is o
28610 76 65 72 66 75 6c 6c 0a 2a 2a 0a 2a 2a 20 57 68  verfull.**.** Wh
28620 65 6e 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c  en this happens,
28630 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 68   Create a new ch
28640 69 6c 64 20 70 61 67 65 20 61 6e 64 20 63 6f 70  ild page and cop
28650 79 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  y the.** content
28660 73 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 69 6e  s of the root in
28670 74 6f 20 74 68 65 20 63 68 69 6c 64 2e 20 20 54  to the child.  T
28680 68 65 6e 20 6d 61 6b 65 20 74 68 65 20 72 6f 6f  hen make the roo
28690 74 0a 2a 2a 20 70 61 67 65 20 61 6e 20 65 6d 70  t.** page an emp
286a0 74 79 20 70 61 67 65 20 77 69 74 68 20 72 69 67  ty page with rig
286b0 68 74 43 68 69 6c 64 20 70 6f 69 6e 74 69 6e 67  htChild pointing
286c0 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20 63   to the new.** c
286d0 68 69 6c 64 2e 20 20 20 46 69 6e 61 6c 6c 79 2c  hild.   Finally,
286e0 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 69 6e   call balance_in
286f0 74 65 72 6e 61 6c 28 29 20 6f 6e 20 74 68 65 20  ternal() on the 
28700 6e 65 77 20 63 68 69 6c 64 0a 2a 2a 20 74 6f 20  new child.** to 
28710 63 61 75 73 65 20 69 74 20 74 6f 20 73 70 6c 69  cause it to spli
28720 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
28730 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28   balance_deeper(
28740 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
28750 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
28760 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
28770 20 76 61 6c 75 65 20 66 72 6f 6d 20 73 75 62 70   value from subp
28780 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20 4d  rocedures */.  M
28790 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 3b 20  emPage *pChild; 
287a0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
287b0 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67   a new child pag
287c0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
287d0 43 68 69 6c 64 3b 20 20 20 20 20 2f 2a 20 50 61  Child;     /* Pa
287e0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
287f0 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20   new child page 
28800 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
28810 42 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  Bt;         /* T
28820 68 65 20 42 54 72 65 65 20 2a 2f 0a 20 20 69 6e  he BTree */.  in
28830 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20  t usableSize;   
28840 20 20 2f 2a 20 54 6f 74 61 6c 20 75 73 61 62 6c    /* Total usabl
28850 65 20 73 69 7a 65 20 6f 66 20 61 20 70 61 67 65  e size of a page
28860 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
28870 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
28880 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 72 65  tent of the pare
28890 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  nt page */.  u8 
288a0 2a 63 64 61 74 61 3b 20 20 20 20 20 20 20 20 20  *cdata;         
288b0 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74   /* Content of t
288c0 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f  he child page */
288d0 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20  .  int hdr;     
288e0 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
288f0 20 74 6f 20 70 61 67 65 20 68 65 61 64 65 72 20   to page header 
28900 69 6e 20 70 61 72 65 6e 74 20 2a 2f 0a 20 20 69  in parent */.  i
28910 6e 74 20 62 72 6b 3b 20 20 20 20 20 20 20 20 20  nt brk;         
28920 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
28930 63 6f 6e 74 65 6e 74 20 6f 66 20 66 69 72 73 74  content of first
28940 20 63 65 6c 6c 20 69 6e 20 70 61 72 65 6e 74 20   cell in parent 
28950 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
28960 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20  age->pParent==0 
28970 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
28980 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20  ge->nOverflow>0 
28990 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65  );.  pBt = pPage
289a0 2d 3e 70 42 74 3b 0a 20 20 72 63 20 3d 20 61 6c  ->pBt;.  rc = al
289b0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
289c0 70 42 74 2c 20 26 70 43 68 69 6c 64 2c 20 26 70  pBt, &pChild, &p
289d0 67 6e 6f 43 68 69 6c 64 2c 20 70 50 61 67 65 2d  gnoChild, pPage-
289e0 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 69 66 28  >pgno, 0);.  if(
289f0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
28a00 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
28a10 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
28a20 6c 65 28 70 43 68 69 6c 64 2d 3e 70 44 62 50 61  le(pChild->pDbPa
28a30 67 65 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53  ge) );.  usableS
28a40 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
28a50 65 53 69 7a 65 3b 0a 20 20 64 61 74 61 20 3d 20  eSize;.  data = 
28a60 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
28a70 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
28a80 4f 66 66 73 65 74 3b 0a 20 20 62 72 6b 20 3d 20  Offset;.  brk = 
28a90 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
28aa0 64 72 2b 35 5d 29 3b 0a 20 20 63 64 61 74 61 20  dr+5]);.  cdata 
28ab0 3d 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 3b  = pChild->aData;
28ac0 0a 20 20 6d 65 6d 63 70 79 28 63 64 61 74 61 2c  .  memcpy(cdata,
28ad0 20 26 64 61 74 61 5b 68 64 72 5d 2c 20 70 50 61   &data[hdr], pPa
28ae0 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32  ge->cellOffset+2
28af0 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 68 64  *pPage->nCell-hd
28b00 72 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 63 64  r);.  memcpy(&cd
28b10 61 74 61 5b 62 72 6b 5d 2c 20 26 64 61 74 61 5b  ata[brk], &data[
28b20 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65  brk], usableSize
28b30 2d 62 72 6b 29 3b 0a 20 20 61 73 73 65 72 74 28  -brk);.  assert(
28b40 20 70 43 68 69 6c 64 2d 3e 69 73 49 6e 69 74 3d   pChild->isInit=
28b50 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 69 6e 69  =0 );.  rc = ini
28b60 74 50 61 67 65 28 70 43 68 69 6c 64 2c 20 70 50  tPage(pChild, pP
28b70 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
28b80 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 64 65 65   goto balancedee
28b90 70 65 72 5f 6f 75 74 3b 0a 20 20 6d 65 6d 63 70  per_out;.  memcp
28ba0 79 28 70 43 68 69 6c 64 2d 3e 61 4f 76 66 6c 2c  y(pChild->aOvfl,
28bb0 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 2c 20 70   pPage->aOvfl, p
28bc0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2a  Page->nOverflow*
28bd0 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f  sizeof(pPage->aO
28be0 76 66 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 68 69  vfl[0]));.  pChi
28bf0 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  ld->nOverflow = 
28c00 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
28c10 3b 0a 20 20 69 66 28 20 70 43 68 69 6c 64 2d 3e  ;.  if( pChild->
28c20 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  nOverflow ){.   
28c30 20 70 43 68 69 6c 64 2d 3e 6e 46 72 65 65 20 3d   pChild->nFree =
28c40 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   0;.  }.  assert
28c50 28 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3d  ( pChild->nCell=
28c60 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  =pPage->nCell );
28c70 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67  .  zeroPage(pPag
28c80 65 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61  e, pChild->aData
28c90 5b 30 5d 20 26 20 7e 50 54 46 5f 4c 45 41 46 29  [0] & ~PTF_LEAF)
28ca0 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
28cb0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
28cc0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
28cd0 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 20 20 54 52  pgnoChild);.  TR
28ce0 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63  ACE(("BALANCE: c
28cf0 6f 70 79 20 72 6f 6f 74 20 25 64 20 69 6e 74 6f  opy root %d into
28d00 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70   %d\n", pPage->p
28d10 67 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e  gno, pChild->pgn
28d20 6f 29 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  o));.#ifndef SQL
28d30 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
28d40 55 55 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e 61  UUM.  if( pBt->a
28d50 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
28d60 20 69 6e 74 20 69 3b 0a 20 20 20 20 72 63 20 3d   int i;.    rc =
28d70 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
28d80 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c 20 50 54  pChild->pgno, PT
28d90 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 67  RMAP_BTREE, pPag
28da0 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66  e->pgno);.    if
28db0 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
28dc0 6e 63 65 64 65 65 70 65 72 5f 6f 75 74 3b 0a 20  ncedeeper_out;. 
28dd0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43     for(i=0; i<pC
28de0 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  hild->nCell; i++
28df0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74  ){.      rc = pt
28e00 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 43 68 69  rmapPutOvfl(pChi
28e10 6c 64 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66  ld, i);.      if
28e20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
28e30 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
28e40 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
28e50 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
28e60 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f   rc = balance_no
28e70 6e 72 6f 6f 74 28 70 43 68 69 6c 64 29 3b 0a 0a  nroot(pChild);..
28e80 62 61 6c 61 6e 63 65 64 65 65 70 65 72 5f 6f 75  balancedeeper_ou
28e90 74 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  t:.  releasePage
28ea0 28 70 43 68 69 6c 64 29 3b 0a 20 20 72 65 74 75  (pChild);.  retu
28eb0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
28ec0 44 65 63 69 64 65 20 69 66 20 74 68 65 20 70 61  Decide if the pa
28ed0 67 65 20 70 50 61 67 65 20 6e 65 65 64 73 20 74  ge pPage needs t
28ee0 6f 20 62 65 20 62 61 6c 61 6e 63 65 64 2e 20 20  o be balanced.  
28ef0 49 66 20 62 61 6c 61 6e 63 69 6e 67 20 69 73 0a  If balancing is.
28f00 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 63 61 6c  ** required, cal
28f10 6c 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  l the appropriat
28f20 65 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74  e balancing rout
28f30 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ine..*/.static i
28f40 6e 74 20 62 61 6c 61 6e 63 65 28 4d 65 6d 50 61  nt balance(MemPa
28f50 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
28f60 6e 73 65 72 74 29 7b 0a 20 20 69 6e 74 20 72 63  nsert){.  int rc
28f70 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
28f80 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65  if( pPage->pPare
28f90 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  nt==0 ){.    if(
28fa0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
28fb0 77 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  w>0 ){.      rc 
28fc0 3d 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72  = balance_deeper
28fd0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  (pPage);.    }. 
28fe0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
28ff0 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 2d 3e 6e  E_OK && pPage->n
29000 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Cell==0 ){.     
29010 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 73 68   rc = balance_sh
29020 61 6c 6c 6f 77 65 72 28 70 50 61 67 65 29 3b 0a  allower(pPage);.
29030 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
29040 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f     if( pPage->nO
29050 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20 0a 20 20  verflow>0 || .  
29060 20 20 20 20 20 20 28 21 69 6e 73 65 72 74 20 26        (!insert &
29070 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 70  & pPage->nFree>p
29080 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
29090 65 53 69 7a 65 2a 32 2f 33 29 20 29 7b 0a 20 20  eSize*2/3) ){.  
290a0 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
290b0 5f 6e 6f 6e 72 6f 6f 74 28 70 50 61 67 65 29 3b  _nonroot(pPage);
290c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
290d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
290e0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
290f0 65 63 6b 73 20 61 6c 6c 20 63 75 72 73 6f 72 73  ecks all cursors
29100 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 74   that point to t
29110 61 62 6c 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a  able pgnoRoot..*
29120 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 6f 73  * If any of thos
29130 65 20 63 75 72 73 6f 72 73 20 77 65 72 65 20 6f  e cursors were o
29140 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61  pened with wrFla
29150 67 3d 3d 30 20 69 6e 20 61 20 64 69 66 66 65 72  g==0 in a differ
29160 65 6e 74 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ent.** database 
29170 63 6f 6e 6e 65 63 74 69 6f 6e 20 28 61 20 64 61  connection (a da
29180 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
29190 6e 20 74 68 61 74 20 73 68 61 72 65 73 20 74 68  n that shares th
291a0 65 20 70 61 67 65 72 0a 2a 2a 20 63 61 63 68 65  e pager.** cache
291b0 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e   with the curren
291c0 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 20 61 6e  t connection) an
291d0 64 20 74 68 61 74 20 6f 74 68 65 72 20 63 6f 6e  d that other con
291e0 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20 6e  nection .** is n
291f0 6f 74 20 69 6e 20 74 68 65 20 52 65 61 64 55 6e  ot in the ReadUn
29200 63 6f 6d 6d 6d 69 74 74 65 64 20 73 74 61 74 65  commmitted state
29210 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
29220 69 6e 65 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20  ine returns .** 
29230 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 2a  SQLITE_LOCKED..*
29240 2a 0a 2a 2a 20 49 6e 20 61 64 64 69 74 69 6f 6e  *.** In addition
29250 20 74 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f 72   to checking for
29260 20 72 65 61 64 2d 6c 6f 63 6b 73 20 28 77 68 65   read-locks (whe
29270 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 0a  re a read-lock .
29280 2a 2a 20 6d 65 61 6e 73 20 61 20 63 75 72 73 6f  ** means a curso
29290 72 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72  r opened with wr
292a0 46 6c 61 67 3d 3d 30 29 20 74 68 69 73 20 72 6f  Flag==0) this ro
292b0 75 74 69 6e 65 20 61 6c 73 6f 20 6d 6f 76 65 73  utine also moves
292c0 0a 2a 2a 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  .** all cursors 
292d0 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 73 6f  write cursors so
292e0 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20 70   that they are p
292f0 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 0a  ointing to the .
29300 2a 2a 20 66 69 72 73 74 20 43 65 6c 6c 20 6f 6e  ** first Cell on
29310 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2e 20   the root page. 
29320 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
29330 72 79 20 62 65 63 61 75 73 65 20 61 6e 20 69 6e  ry because an in
29340 73 65 72 74 20 0a 2a 2a 20 6f 72 20 64 65 6c 65  sert .** or dele
29350 74 65 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  te might change 
29360 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 65  the number of ce
29370 6c 6c 73 20 6f 6e 20 61 20 70 61 67 65 20 6f 72  lls on a page or
29380 20 64 65 6c 65 74 65 0a 2a 2a 20 61 20 70 61 67   delete.** a pag
29390 65 20 65 6e 74 69 72 65 6c 79 20 61 6e 64 20 77  e entirely and w
293a0 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f  e do not want to
293b0 20 6c 65 61 76 65 20 61 6e 79 20 63 75 72 73 6f   leave any curso
293c0 72 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20  rs .** pointing 
293d0 74 6f 20 6e 6f 6e 2d 65 78 69 73 74 61 6e 74 20  to non-existant 
293e0 70 61 67 65 73 20 6f 72 20 63 65 6c 6c 73 2e 0a  pages or cells..
293f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68  */.static int ch
29400 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 42 74 72  eckReadLocks(Btr
29410 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f  ee *pBtree, Pgno
29420 20 70 67 6e 6f 52 6f 6f 74 2c 20 42 74 43 75 72   pgnoRoot, BtCur
29430 73 6f 72 20 2a 70 45 78 63 6c 75 64 65 29 7b 0a  sor *pExclude){.
29440 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
29450 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
29460 20 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20   pBtree->pBt;.  
29470 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 42  sqlite3 *db = pB
29480 74 72 65 65 2d 3e 70 53 71 6c 69 74 65 3b 0a 20  tree->pSqlite;. 
29490 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72   for(p=pBt->pCur
294a0 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
294b0 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 3d 3d  xt){.    if( p==
294c0 70 45 78 63 6c 75 64 65 20 29 20 63 6f 6e 74 69  pExclude ) conti
294d0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  nue;.    if( p->
294e0 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
294f0 41 4c 49 44 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ALID ) continue;
29500 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f  .    if( p->pgno
29510 52 6f 6f 74 21 3d 70 67 6e 6f 52 6f 6f 74 20 29  Root!=pgnoRoot )
29520 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
29530 66 28 20 70 2d 3e 77 72 46 6c 61 67 3d 3d 30 20  f( p->wrFlag==0 
29540 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
29550 20 2a 64 62 4f 74 68 65 72 20 3d 20 70 2d 3e 70   *dbOther = p->p
29560 42 74 72 65 65 2d 3e 70 53 71 6c 69 74 65 3b 0a  Btree->pSqlite;.
29570 20 20 20 20 20 20 69 66 28 20 64 62 4f 74 68 65        if( dbOthe
29580 72 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20 20 20  r==0 ||.        
29590 20 28 64 62 4f 74 68 65 72 21 3d 64 62 20 26 26   (dbOther!=db &&
295a0 20 28 64 62 4f 74 68 65 72 2d 3e 66 6c 61 67 73   (dbOther->flags
295b0 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e   & SQLITE_ReadUn
295c0 63 6f 6d 6d 69 74 74 65 64 29 3d 3d 30 29 20 29  committed)==0) )
295d0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
295e0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a   SQLITE_LOCKED;.
295f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
29600 65 20 69 66 28 20 70 2d 3e 70 50 61 67 65 2d 3e  e if( p->pPage->
29610 70 67 6e 6f 21 3d 70 2d 3e 70 67 6e 6f 52 6f 6f  pgno!=p->pgnoRoo
29620 74 20 29 7b 0a 20 20 20 20 20 20 6d 6f 76 65 54  t ){.      moveT
29630 6f 52 6f 6f 74 28 70 29 3b 0a 20 20 20 20 7d 0a  oRoot(p);.    }.
29640 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
29650 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
29660 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65   Insert a new re
29670 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 42 54  cord into the BT
29680 72 65 65 2e 20 20 54 68 65 20 6b 65 79 20 69 73  ree.  The key is
29690 20 67 69 76 65 6e 20 62 79 20 28 70 4b 65 79 2c   given by (pKey,
296a0 6e 4b 65 79 29 0a 2a 2a 20 61 6e 64 20 74 68 65  nKey).** and the
296b0 20 64 61 74 61 20 69 73 20 67 69 76 65 6e 20 62   data is given b
296c0 79 20 28 70 44 61 74 61 2c 6e 44 61 74 61 29 2e  y (pData,nData).
296d0 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
296e0 75 73 65 64 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20  used only to.** 
296f0 64 65 66 69 6e 65 20 77 68 61 74 20 74 61 62 6c  define what tabl
29700 65 20 74 68 65 20 72 65 63 6f 72 64 20 73 68 6f  e the record sho
29710 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65 64 20  uld be inserted 
29720 69 6e 74 6f 2e 20 20 54 68 65 20 63 75 72 73 6f  into.  The curso
29730 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f 69  r.** is left poi
29740 6e 74 69 6e 67 20 61 74 20 61 20 72 61 6e 64 6f  nting at a rando
29750 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  m location..**.*
29760 2a 20 46 6f 72 20 61 6e 20 49 4e 54 4b 45 59 20  * For an INTKEY 
29770 74 61 62 6c 65 2c 20 6f 6e 6c 79 20 74 68 65 20  table, only the 
29780 6e 4b 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68  nKey value of th
29790 65 20 6b 65 79 20 69 73 20 75 73 65 64 2e 20 20  e key is used.  
297a0 70 4b 65 79 20 69 73 0a 2a 2a 20 69 67 6e 6f 72  pKey is.** ignor
297b0 65 64 2e 20 20 46 6f 72 20 61 20 5a 45 52 4f 44  ed.  For a ZEROD
297c0 41 54 41 20 74 61 62 6c 65 2c 20 74 68 65 20 70  ATA table, the p
297d0 44 61 74 61 20 61 6e 64 20 6e 44 61 74 61 20 61  Data and nData a
297e0 72 65 20 62 6f 74 68 20 69 67 6e 6f 72 65 64 2e  re both ignored.
297f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
29800 74 72 65 65 49 6e 73 65 72 74 28 0a 20 20 42 74  treeInsert(.  Bt
29810 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
29820 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29830 49 6e 73 65 72 74 20 64 61 74 61 20 69 6e 74 6f  Insert data into
29840 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20 74 68   the table of th
29850 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63  is cursor */.  c
29860 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
29870 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a   i64 nKey,    /*
29880 20 54 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20   The key of the 
29890 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  new record */.  
298a0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74  const void *pDat
298b0 61 2c 20 69 6e 74 20 6e 44 61 74 61 20 20 20 2f  a, int nData   /
298c0 2a 20 54 68 65 20 64 61 74 61 20 6f 66 20 74 68  * The data of th
298d0 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a  e new record */.
298e0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
298f0 6e 74 20 6c 6f 63 3b 0a 20 20 69 6e 74 20 73 7a  nt loc;.  int sz
29900 4e 65 77 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  New;.  MemPage *
29910 70 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65  pPage;.  BtShare
29920 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
29930 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20 75 6e  Btree->pBt;.  un
29940 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 6c 64  signed char *old
29950 43 65 6c 6c 3b 0a 20 20 75 6e 73 69 67 6e 65 64  Cell;.  unsigned
29960 20 63 68 61 72 20 2a 6e 65 77 43 65 6c 6c 20 3d   char *newCell =
29970 20 30 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e   0;..  if( pBt->
29980 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d 54  inTransaction!=T
29990 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
299a0 20 20 2f 2a 20 4d 75 73 74 20 73 74 61 72 74 20    /* Must start 
299b0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65  a transaction be
299c0 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 20 69 6e  fore doing an in
299d0 73 65 72 74 20 2a 2f 0a 20 20 20 20 72 65 74 75  sert */.    retu
299e0 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  rn pBt->readOnly
299f0 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   ? SQLITE_READON
29a00 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f  LY : SQLITE_ERRO
29a10 52 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  R;.  }.  assert(
29a20 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20   !pBt->readOnly 
29a30 29 3b 0a 20 20 69 66 28 20 21 70 43 75 72 2d 3e  );.  if( !pCur->
29a40 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 72 65  wrFlag ){.    re
29a50 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
29a60 3b 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 6f  ;   /* Cursor no
29a70 74 20 6f 70 65 6e 20 66 6f 72 20 77 72 69 74 69  t open for writi
29a80 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  ng */.  }.  if( 
29a90 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70  checkReadLocks(p
29aa0 43 75 72 2d 3e 70 42 74 72 65 65 2c 20 70 43 75  Cur->pBtree, pCu
29ab0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75  r->pgnoRoot, pCu
29ac0 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  r) ){.    return
29ad0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 20   SQLITE_LOCKED; 
29ae0 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 70 43 75  /* The table pCu
29af0 72 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20  r points to has 
29b00 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20  a read lock */. 
29b10 20 7d 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74 68   }..  /* Save th
29b20 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61  e positions of a
29b30 6e 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73  ny other cursors
29b40 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 74 61   open on this ta
29b50 62 6c 65 20 2a 2f 0a 20 20 72 65 73 74 6f 72 65  ble */.  restore
29b60 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73  OrClearCursorPos
29b70 69 74 69 6f 6e 28 70 43 75 72 2c 20 30 29 3b 0a  ition(pCur, 0);.
29b80 20 20 69 66 28 20 0a 20 20 20 20 53 51 4c 49 54    if( .    SQLIT
29b90 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76 65  E_OK!=(rc = save
29ba0 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
29bb0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
29bc0 70 43 75 72 29 29 20 7c 7c 0a 20 20 20 20 53 51  pCur)) ||.    SQ
29bd0 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
29be0 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
29bf0 6f 28 70 43 75 72 2c 20 70 4b 65 79 2c 20 6e 4b  o(pCur, pKey, nK
29c00 65 79 2c 20 26 6c 6f 63 29 29 0a 20 20 29 7b 0a  ey, &loc)).  ){.
29c10 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
29c20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43   }..  pPage = pC
29c30 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73  ur->pPage;.  ass
29c40 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
29c50 65 79 20 7c 7c 20 6e 4b 65 79 3e 3d 30 20 29 3b  ey || nKey>=0 );
29c60 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
29c70 2d 3e 6c 65 61 66 20 7c 7c 20 21 70 50 61 67 65  ->leaf || !pPage
29c80 2d 3e 6c 65 61 66 44 61 74 61 20 29 3b 0a 20 20  ->leafData );.  
29c90 54 52 41 43 45 28 28 22 49 4e 53 45 52 54 3a 20  TRACE(("INSERT: 
29ca0 74 61 62 6c 65 3d 25 64 20 6e 6b 65 79 3d 25 6c  table=%d nkey=%l
29cb0 6c 64 20 6e 64 61 74 61 3d 25 64 20 70 61 67 65  ld ndata=%d page
29cc0 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  =%d %s\n",.     
29cd0 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52       pCur->pgnoR
29ce0 6f 6f 74 2c 20 6e 4b 65 79 2c 20 6e 44 61 74 61  oot, nKey, nData
29cf0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 0a 20  , pPage->pgno,. 
29d00 20 20 20 20 20 20 20 20 20 6c 6f 63 3d 3d 30 20           loc==0 
29d10 3f 20 22 6f 76 65 72 77 72 69 74 65 22 20 3a 20  ? "overwrite" : 
29d20 22 6e 65 77 20 65 6e 74 72 79 22 29 29 3b 0a 20  "new entry"));. 
29d30 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
29d40 69 73 49 6e 69 74 20 29 3b 0a 20 20 72 63 20 3d  isInit );.  rc =
29d50 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
29d60 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
29d70 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  e);.  if( rc ) r
29d80 65 74 75 72 6e 20 72 63 3b 0a 20 20 6e 65 77 43  eturn rc;.  newC
29d90 65 6c 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ell = sqliteMall
29da0 6f 63 52 61 77 28 20 4d 58 5f 43 45 4c 4c 5f 53  ocRaw( MX_CELL_S
29db0 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 69 66  IZE(pBt) );.  if
29dc0 28 20 6e 65 77 43 65 6c 6c 3d 3d 30 20 29 20 72  ( newCell==0 ) r
29dd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
29de0 45 4d 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49  EM;.  rc = fillI
29df0 6e 43 65 6c 6c 28 70 50 61 67 65 2c 20 6e 65 77  nCell(pPage, new
29e00 43 65 6c 6c 2c 20 70 4b 65 79 2c 20 6e 4b 65 79  Cell, pKey, nKey
29e10 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61 2c 20  , pData, nData, 
29e20 26 73 7a 4e 65 77 29 3b 0a 20 20 69 66 28 20 72  &szNew);.  if( r
29e30 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73  c ) goto end_ins
29e40 65 72 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ert;.  assert( s
29e50 7a 4e 65 77 3d 3d 63 65 6c 6c 53 69 7a 65 50 74  zNew==cellSizePt
29e60 72 28 70 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c  r(pPage, newCell
29e70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
29e80 7a 4e 65 77 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49  zNew<=MX_CELL_SI
29e90 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 69 66 28  ZE(pBt) );.  if(
29ea0 20 6c 6f 63 3d 3d 30 20 26 26 20 43 55 52 53 4f   loc==0 && CURSO
29eb0 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  R_VALID==pCur->e
29ec0 53 74 61 74 65 20 29 7b 0a 20 20 20 20 69 6e 74  State ){.    int
29ed0 20 73 7a 4f 6c 64 3b 0a 20 20 20 20 61 73 73 65   szOld;.    asse
29ee0 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30  rt( pCur->idx>=0
29ef0 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 50   && pCur->idx<pP
29f00 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
29f10 20 20 6f 6c 64 43 65 6c 6c 20 3d 20 66 69 6e 64    oldCell = find
29f20 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72  Cell(pPage, pCur
29f30 2d 3e 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20  ->idx);.    if( 
29f40 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
29f50 20 20 20 20 20 20 6d 65 6d 63 70 79 28 6e 65 77        memcpy(new
29f60 43 65 6c 6c 2c 20 6f 6c 64 43 65 6c 6c 2c 20 34  Cell, oldCell, 4
29f70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4f  );.    }.    szO
29f80 6c 64 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ld = cellSizePtr
29f90 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29  (pPage, oldCell)
29fa0 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72  ;.    rc = clear
29fb0 43 65 6c 6c 28 70 50 61 67 65 2c 20 6f 6c 64 43  Cell(pPage, oldC
29fc0 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ell);.    if( rc
29fd0 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65   ) goto end_inse
29fe0 72 74 3b 0a 20 20 20 20 64 72 6f 70 43 65 6c 6c  rt;.    dropCell
29ff0 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64  (pPage, pCur->id
2a000 78 2c 20 73 7a 4f 6c 64 29 3b 0a 20 20 7d 65 6c  x, szOld);.  }el
2a010 73 65 20 69 66 28 20 6c 6f 63 3c 30 20 26 26 20  se if( loc<0 && 
2a020 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29  pPage->nCell>0 )
2a030 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
2a040 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20  age->leaf );.   
2a050 20 70 43 75 72 2d 3e 69 64 78 2b 2b 3b 0a 20 20   pCur->idx++;.  
2a060 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
2a070 7a 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ze = 0;.  }else{
2a080 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2a090 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 7d 0a  ge->leaf );.  }.
2a0a0 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c    rc = insertCel
2a0b0 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  l(pPage, pCur->i
2a0c0 64 78 2c 20 6e 65 77 43 65 6c 6c 2c 20 73 7a 4e  dx, newCell, szN
2a0d0 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28  ew, 0, 0);.  if(
2a0e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2a0f0 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74   goto end_insert
2a100 3b 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65  ;.  rc = balance
2a110 28 70 50 61 67 65 2c 20 31 29 3b 0a 20 20 2f 2a  (pPage, 1);.  /*
2a120 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67   sqlite3BtreePag
2a130 65 44 75 6d 70 28 70 43 75 72 2d 3e 70 42 74 2c  eDump(pCur->pBt,
2a140 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
2a150 20 31 29 3b 20 2a 2f 0a 20 20 2f 2a 20 66 66 6c   1); */.  /* ffl
2a160 75 73 68 28 73 74 64 6f 75 74 29 3b 20 2a 2f 0a  ush(stdout); */.
2a170 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2a180 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54  _OK ){.    moveT
2a190 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d  oRoot(pCur);.  }
2a1a0 0a 65 6e 64 5f 69 6e 73 65 72 74 3a 0a 20 20 73  .end_insert:.  s
2a1b0 71 6c 69 74 65 46 72 65 65 28 6e 65 77 43 65 6c  qliteFree(newCel
2a1c0 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  l);.  return rc;
2a1d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
2a1e0 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
2a1f0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f  the cursor is po
2a200 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20  inting to.  The 
2a210 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66  cursor.** is lef
2a220 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20  t pointing at a 
2a230 72 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e  random location.
2a240 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
2a250 74 72 65 65 44 65 6c 65 74 65 28 42 74 43 75 72  treeDelete(BtCur
2a260 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65  sor *pCur){.  Me
2a270 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
2a280 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 75 6e  Cur->pPage;.  un
2a290 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
2a2a0 6c 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ll;.  int rc;.  
2a2b0 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 20 3d  Pgno pgnoChild =
2a2c0 20 30 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a   0;.  BtShared *
2a2d0 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 72  pBt = pCur->pBtr
2a2e0 65 65 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65  ee->pBt;..  asse
2a2f0 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
2a300 74 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  t );.  if( pBt->
2a310 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d 54  inTransaction!=T
2a320 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
2a330 20 20 2f 2a 20 4d 75 73 74 20 73 74 61 72 74 20    /* Must start 
2a340 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65  a transaction be
2a350 66 6f 72 65 20 64 6f 69 6e 67 20 61 20 64 65 6c  fore doing a del
2a360 65 74 65 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ete */.    retur
2a370 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  n pBt->readOnly 
2a380 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  ? SQLITE_READONL
2a390 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  Y : SQLITE_ERROR
2a3a0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2a3b0 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  !pBt->readOnly )
2a3c0 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 64  ;.  if( pCur->id
2a3d0 78 20 3e 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  x >= pPage->nCel
2a3e0 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  l ){.    return 
2a3f0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 20 2f  SQLITE_ERROR;  /
2a400 2a 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20  * The cursor is 
2a410 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  not pointing to 
2a420 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a  anything */.  }.
2a430 20 20 69 66 28 20 21 70 43 75 72 2d 3e 77 72 46    if( !pCur->wrF
2a440 6c 61 67 20 29 7b 0a 20 20 20 20 72 65 74 75 72  lag ){.    retur
2a450 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 20 20  n SQLITE_PERM;  
2a460 20 2f 2a 20 44 69 64 20 6e 6f 74 20 6f 70 65 6e   /* Did not open
2a470 20 74 68 69 73 20 63 75 72 73 6f 72 20 66 6f 72   this cursor for
2a480 20 77 72 69 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a   writing */.  }.
2a490 20 20 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c    if( checkReadL
2a4a0 6f 63 6b 73 28 70 43 75 72 2d 3e 70 42 74 72 65  ocks(pCur->pBtre
2a4b0 65 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  e, pCur->pgnoRoo
2a4c0 74 2c 20 70 43 75 72 29 20 29 7b 0a 20 20 20 20  t, pCur) ){.    
2a4d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
2a4e0 43 4b 45 44 3b 20 2f 2a 20 54 68 65 20 74 61 62  CKED; /* The tab
2a4f0 6c 65 20 70 43 75 72 20 70 6f 69 6e 74 73 20 74  le pCur points t
2a500 6f 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  o has a read loc
2a510 6b 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  k */.  }..  /* R
2a520 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 72 65  estore the curre
2a530 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  nt cursor positi
2a540 6f 6e 20 28 61 20 6e 6f 2d 6f 70 20 69 66 20 74  on (a no-op if t
2a550 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
2a560 20 69 6e 20 0a 20 20 2a 2a 20 43 55 52 53 4f 52   in .  ** CURSOR
2a570 5f 52 45 51 55 49 52 45 53 45 45 4b 20 73 74 61  _REQUIRESEEK sta
2a580 74 65 29 20 61 6e 64 20 73 61 76 65 20 74 68 65  te) and save the
2a590 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e   positions of an
2a5a0 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20  y other cursors 
2a5b0 0a 20 20 2a 2a 20 6f 70 65 6e 20 6f 6e 20 74 68  .  ** open on th
2a5c0 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 54 68  e same table. Th
2a5d0 65 6e 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  en call sqlite3P
2a5e0 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74  agerWrite() on t
2a5f0 68 65 20 70 61 67 65 0a 20 20 2a 2a 20 74 68 61  he page.  ** tha
2a600 74 20 74 68 65 20 65 6e 74 72 79 20 77 69 6c 6c  t the entry will
2a610 20 62 65 20 64 65 6c 65 74 65 64 20 66 72 6f 6d   be deleted from
2a620 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20  ..  */.  if( .  
2a630 20 20 28 72 63 20 3d 20 72 65 73 74 6f 72 65 4f    (rc = restoreO
2a640 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69  rClearCursorPosi
2a650 74 69 6f 6e 28 70 43 75 72 2c 20 31 29 29 21 3d  tion(pCur, 1))!=
2a660 30 20 7c 7c 0a 20 20 20 20 28 72 63 20 3d 20 73  0 ||.    (rc = s
2a670 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
2a680 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t, pCur->pgnoRoo
2a690 74 2c 20 70 43 75 72 29 29 21 3d 30 20 7c 7c 0a  t, pCur))!=0 ||.
2a6a0 20 20 20 20 28 72 63 20 3d 20 73 71 6c 69 74 65      (rc = sqlite
2a6b0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
2a6c0 65 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30 0a  e->pDbPage))!=0.
2a6d0 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
2a6e0 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f  rc;.  }..  /* Lo
2a6f0 63 61 74 65 20 74 68 65 20 63 65 6c 6c 20 77 69  cate the cell wi
2a700 74 68 69 6e 20 69 74 27 73 20 70 61 67 65 20 61  thin it's page a
2a710 6e 64 20 6c 65 61 76 65 20 70 43 65 6c 6c 20 70  nd leave pCell p
2a720 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 0a 20  ointing to the. 
2a730 20 2a 2a 20 64 61 74 61 2e 20 54 68 65 20 63 6c   ** data. The cl
2a740 65 61 72 43 65 6c 6c 28 29 20 63 61 6c 6c 20 66  earCell() call f
2a750 72 65 65 73 20 61 6e 79 20 6f 76 65 72 66 6c 6f  rees any overflo
2a760 77 20 70 61 67 65 73 20 61 73 73 6f 63 69 61 74  w pages associat
2a770 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a  ed with the.  **
2a780 20 63 65 6c 6c 2e 20 54 68 65 20 63 65 6c 6c 20   cell. The cell 
2a790 69 74 73 65 6c 66 20 69 73 20 73 74 69 6c 6c 20  itself is still 
2a7a0 69 6e 74 61 63 74 2e 0a 20 20 2a 2f 0a 20 20 70  intact..  */.  p
2a7b0 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
2a7c0 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78  pPage, pCur->idx
2a7d0 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  );.  if( !pPage-
2a7e0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e  >leaf ){.    pgn
2a7f0 6f 43 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74  oChild = get4byt
2a800 65 28 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20  e(pCell);.  }.  
2a810 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70  rc = clearCell(p
2a820 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20  Page, pCell);.  
2a830 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2a840 72 63 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67  rc;..  if( !pPag
2a850 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 2f  e->leaf ){.    /
2a860 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 65 6e 74  *.    ** The ent
2a870 72 79 20 77 65 20 61 72 65 20 61 62 6f 75 74 20  ry we are about 
2a880 74 6f 20 64 65 6c 65 74 65 20 69 73 20 6e 6f 74  to delete is not
2a890 20 61 20 6c 65 61 66 20 73 6f 20 69 66 20 77 65   a leaf so if we
2a8a0 20 64 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 64   do not.    ** d
2a8b0 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 65 20 77  o something we w
2a8c0 69 6c 6c 20 6c 65 61 76 65 20 61 20 68 6f 6c 65  ill leave a hole
2a8d0 20 6f 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   on an internal 
2a8e0 70 61 67 65 2e 0a 20 20 20 20 2a 2a 20 57 65 20  page..    ** We 
2a8f0 68 61 76 65 20 74 6f 20 66 69 6c 6c 20 74 68 65  have to fill the
2a900 20 68 6f 6c 65 20 62 79 20 6d 6f 76 69 6e 67 20   hole by moving 
2a910 69 6e 20 61 20 63 65 6c 6c 20 66 72 6f 6d 20 61  in a cell from a
2a920 20 6c 65 61 66 2e 20 20 54 68 65 0a 20 20 20 20   leaf.  The.    
2a930 2a 2a 20 6e 65 78 74 20 43 65 6c 6c 20 61 66 74  ** next Cell aft
2a940 65 72 20 74 68 65 20 6f 6e 65 20 74 6f 20 62 65  er the one to be
2a950 20 64 65 6c 65 74 65 64 20 69 73 20 67 75 61 72   deleted is guar
2a960 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74 20  anteed to exist 
2a970 61 6e 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65  and.    ** to be
2a980 20 61 20 6c 65 61 66 20 73 6f 20 77 65 20 63 61   a leaf so we ca
2a990 6e 20 75 73 65 20 69 74 2e 0a 20 20 20 20 2a 2f  n use it..    */
2a9a0 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 6c 65  .    BtCursor le
2a9b0 61 66 43 75 72 3b 0a 20 20 20 20 75 6e 73 69 67  afCur;.    unsig
2a9c0 6e 65 64 20 63 68 61 72 20 2a 70 4e 65 78 74 3b  ned char *pNext;
2a9d0 0a 20 20 20 20 69 6e 74 20 73 7a 4e 65 78 74 3b  .    int szNext;
2a9e0 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 69 6c 65    /* The compile
2a9f0 72 20 77 61 72 6e 69 6e 67 20 69 73 20 77 72 6f  r warning is wro
2aa00 6e 67 3a 20 73 7a 4e 65 78 74 20 69 73 20 61 6c  ng: szNext is al
2aa10 77 61 79 73 20 0a 20 20 20 20 20 20 20 20 20 20  ways .          
2aa20 20 20 20 20 20 20 20 2a 2a 20 69 6e 69 74 69 61         ** initia
2aa30 6c 69 7a 65 64 20 62 65 66 6f 72 65 20 75 73 65  lized before use
2aa40 2e 20 20 41 64 64 69 6e 67 20 61 6e 20 65 78 74  .  Adding an ext
2aa50 72 61 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ra initializatio
2aa60 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n.              
2aa70 20 20 20 2a 2a 20 74 6f 20 73 69 6c 65 6e 63 65     ** to silence
2aa80 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 73 6c   the compiler sl
2aa90 6f 77 73 20 64 6f 77 6e 20 74 68 65 20 63 6f 64  ows down the cod
2aaa0 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 6f  e. */.    int no
2aab0 74 55 73 65 64 3b 0a 20 20 20 20 75 6e 73 69 67  tUsed;.    unsig
2aac0 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70 43 65  ned char *tempCe
2aad0 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  ll = 0;.    asse
2aae0 72 74 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  rt( !pPage->leaf
2aaf0 44 61 74 61 20 29 3b 0a 20 20 20 20 67 65 74 54  Data );.    getT
2ab00 65 6d 70 43 75 72 73 6f 72 28 70 43 75 72 2c 20  empCursor(pCur, 
2ab10 26 6c 65 61 66 43 75 72 29 3b 0a 20 20 20 20 72  &leafCur);.    r
2ab20 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2ab30 4e 65 78 74 28 26 6c 65 61 66 43 75 72 2c 20 26  Next(&leafCur, &
2ab40 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 69 66  notUsed);.    if
2ab50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2ab60 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  ){.      if( rc!
2ab70 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b  =SQLITE_NOMEM ){
2ab80 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
2ab90 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2aba0 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T; .      }.    
2abb0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
2abc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2abd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2abe0 65 72 57 72 69 74 65 28 6c 65 61 66 43 75 72 2e  erWrite(leafCur.
2abf0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
2ac00 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
2ac10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2ac20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 44 45        TRACE(("DE
2ac30 4c 45 54 45 3a 20 74 61 62 6c 65 3d 25 64 20 64  LETE: table=%d d
2ac40 65 6c 65 74 65 20 69 6e 74 65 72 6e 61 6c 20 66  elete internal f
2ac50 72 6f 6d 20 25 64 20 72 65 70 6c 61 63 65 20 66  rom %d replace f
2ac60 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e 22 2c 0a  rom leaf %d\n",.
2ac70 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70           pCur->p
2ac80 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67 65 2d 3e  gnoRoot, pPage->
2ac90 70 67 6e 6f 2c 20 6c 65 61 66 43 75 72 2e 70 50  pgno, leafCur.pP
2aca0 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  age->pgno));.   
2acb0 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67     dropCell(pPag
2acc0 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 63 65  e, pCur->idx, ce
2acd0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
2ace0 20 70 43 65 6c 6c 29 29 3b 0a 20 20 20 20 20 20   pCell));.      
2acf0 70 4e 65 78 74 20 3d 20 66 69 6e 64 43 65 6c 6c  pNext = findCell
2ad00 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2c 20  (leafCur.pPage, 
2ad10 6c 65 61 66 43 75 72 2e 69 64 78 29 3b 0a 20 20  leafCur.idx);.  
2ad20 20 20 20 20 73 7a 4e 65 78 74 20 3d 20 63 65 6c      szNext = cel
2ad30 6c 53 69 7a 65 50 74 72 28 6c 65 61 66 43 75 72  lSizePtr(leafCur
2ad40 2e 70 50 61 67 65 2c 20 70 4e 65 78 74 29 3b 0a  .pPage, pNext);.
2ad50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 4d 58        assert( MX
2ad60 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 3e  _CELL_SIZE(pBt)>
2ad70 3d 73 7a 4e 65 78 74 2b 34 20 29 3b 0a 20 20 20  =szNext+4 );.   
2ad80 20 20 20 74 65 6d 70 43 65 6c 6c 20 3d 20 73 71     tempCell = sq
2ad90 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 4d  liteMallocRaw( M
2ada0 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
2adb0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65   );.      if( te
2adc0 6d 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  mpCell==0 ){.   
2add0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2ade0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
2adf0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
2ae00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2ae10 20 20 20 20 20 72 63 20 3d 20 69 6e 73 65 72 74       rc = insert
2ae20 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72  Cell(pPage, pCur
2ae30 2d 3e 69 64 78 2c 20 70 4e 65 78 74 2d 34 2c 20  ->idx, pNext-4, 
2ae40 73 7a 4e 65 78 74 2b 34 2c 20 74 65 6d 70 43 65  szNext+4, tempCe
2ae50 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  ll, 0);.    }.  
2ae60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2ae70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 75 74  _OK ){.      put
2ae80 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c  4byte(findOverfl
2ae90 6f 77 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  owCell(pPage, pC
2aea0 75 72 2d 3e 69 64 78 29 2c 20 70 67 6e 6f 43 68  ur->idx), pgnoCh
2aeb0 69 6c 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ild);.      rc =
2aec0 20 62 61 6c 61 6e 63 65 28 70 50 61 67 65 2c 20   balance(pPage, 
2aed0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  0);.    }.    if
2aee0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2aef0 29 7b 0a 20 20 20 20 20 20 64 72 6f 70 43 65 6c  ){.      dropCel
2af00 6c 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2c  l(leafCur.pPage,
2af10 20 6c 65 61 66 43 75 72 2e 69 64 78 2c 20 73 7a   leafCur.idx, sz
2af20 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 72 63 20  Next);.      rc 
2af30 3d 20 62 61 6c 61 6e 63 65 28 6c 65 61 66 43 75  = balance(leafCu
2af40 72 2e 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20  r.pPage, 0);.   
2af50 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65   }.    sqliteFre
2af60 65 28 74 65 6d 70 43 65 6c 6c 29 3b 0a 20 20 20  e(tempCell);.   
2af70 20 72 65 6c 65 61 73 65 54 65 6d 70 43 75 72 73   releaseTempCurs
2af80 6f 72 28 26 6c 65 61 66 43 75 72 29 3b 0a 20 20  or(&leafCur);.  
2af90 7d 65 6c 73 65 7b 0a 20 20 20 20 54 52 41 43 45  }else{.    TRACE
2afa0 28 28 22 44 45 4c 45 54 45 3a 20 74 61 62 6c 65  (("DELETE: table
2afb0 3d 25 64 20 64 65 6c 65 74 65 20 66 72 6f 6d 20  =%d delete from 
2afc0 6c 65 61 66 20 25 64 5c 6e 22 2c 0a 20 20 20 20  leaf %d\n",.    
2afd0 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f     pCur->pgnoRoo
2afe0 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29  t, pPage->pgno))
2aff0 3b 0a 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70  ;.    dropCell(p
2b000 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c  Page, pCur->idx,
2b010 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
2b020 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a 20 20 20  ge, pCell));.   
2b030 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 50   rc = balance(pP
2b040 61 67 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  age, 0);.  }.  i
2b050 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2b060 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f   ){.    moveToRo
2b070 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20  ot(pCur);.  }.  
2b080 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2b090 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
2b0a0 20 42 54 72 65 65 20 74 61 62 6c 65 2e 20 20 57   BTree table.  W
2b0b0 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 54 61 62  rite into *piTab
2b0c0 6c 65 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e  le the page.** n
2b0d0 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 72 6f  umber for the ro
2b0e0 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 6e  ot page of the n
2b0f0 65 77 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ew table..**.** 
2b100 54 68 65 20 74 79 70 65 20 6f 66 20 74 79 70 65  The type of type
2b110 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   is determined b
2b120 79 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61  y the flags para
2b130 6d 65 74 65 72 2e 20 20 4f 6e 6c 79 20 74 68 65  meter.  Only the
2b140 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  .** following va
2b150 6c 75 65 73 20 6f 66 20 66 6c 61 67 73 20 61 72  lues of flags ar
2b160 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75  e currently in u
2b170 73 65 2e 20 20 4f 74 68 65 72 20 76 61 6c 75 65  se.  Other value
2b180 73 20 66 6f 72 0a 2a 2a 20 66 6c 61 67 73 20 6d  s for.** flags m
2b190 69 67 68 74 20 6e 6f 74 20 77 6f 72 6b 3a 0a 2a  ight not work:.*
2b1a0 2a 0a 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 49  *.**     BTREE_I
2b1b0 4e 54 4b 45 59 7c 42 54 52 45 45 5f 4c 45 41 46  NTKEY|BTREE_LEAF
2b1c0 44 41 54 41 20 20 20 20 20 55 73 65 64 20 66 6f  DATA     Used fo
2b1d0 72 20 53 51 4c 20 74 61 62 6c 65 73 20 77 69 74  r SQL tables wit
2b1e0 68 20 72 6f 77 69 64 20 6b 65 79 73 0a 2a 2a 20  h rowid keys.** 
2b1f0 20 20 20 20 42 54 52 45 45 5f 5a 45 52 4f 44 41      BTREE_ZERODA
2b200 54 41 20 20 20 20 20 20 20 20 20 20 20 20 20 20  TA              
2b210 20 20 20 20 55 73 65 64 20 66 6f 72 20 53 51 4c      Used for SQL
2b220 20 69 6e 64 69 63 65 73 0a 2a 2f 0a 69 6e 74 20   indices.*/.int 
2b230 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61  sqlite3BtreeCrea
2b240 74 65 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70  teTable(Btree *p
2b250 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c 65 2c 20  , int *piTable, 
2b260 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 42 74  int flags){.  Bt
2b270 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2b280 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20  >pBt;.  MemPage 
2b290 2a 70 52 6f 6f 74 3b 0a 20 20 50 67 6e 6f 20 70  *pRoot;.  Pgno p
2b2a0 67 6e 6f 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72  gnoRoot;.  int r
2b2b0 63 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  c;.  if( pBt->in
2b2c0 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41  Transaction!=TRA
2b2d0 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
2b2e0 2f 2a 20 4d 75 73 74 20 73 74 61 72 74 20 61 20  /* Must start a 
2b2f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 72 73  transaction firs
2b300 74 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  t */.    return 
2b310 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20  pBt->readOnly ? 
2b320 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
2b330 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  : SQLITE_ERROR;.
2b340 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70    }.  assert( !p
2b350 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a  Bt->readOnly );.
2b360 0a 20 20 2f 2a 20 49 74 20 69 73 20 69 6c 6c 65  .  /* It is ille
2b370 67 61 6c 20 74 6f 20 63 72 65 61 74 65 20 61 20  gal to create a 
2b380 74 61 62 6c 65 20 69 66 20 61 6e 79 20 63 75 72  table if any cur
2b390 73 6f 72 73 20 61 72 65 20 6f 70 65 6e 20 6f 6e  sors are open on
2b3a0 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
2b3b0 73 65 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  se. This is beca
2b3c0 75 73 65 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  use in auto-vacu
2b3d0 75 6d 20 6d 6f 64 65 20 74 68 65 20 62 61 63 6b  um mode the back
2b3e0 65 6e 64 20 6d 61 79 0a 20 20 2a 2a 20 6e 65 65  end may.  ** nee
2b3f0 64 20 74 6f 20 6d 6f 76 65 20 61 20 64 61 74 61  d to move a data
2b400 62 61 73 65 20 70 61 67 65 20 74 6f 20 6d 61 6b  base page to mak
2b410 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20 6e  e room for the n
2b420 65 77 20 72 6f 6f 74 2d 70 61 67 65 2e 0a 20 20  ew root-page..  
2b430 2a 2a 20 49 66 20 61 6e 20 6f 70 65 6e 20 63 75  ** If an open cu
2b440 72 73 6f 72 20 77 61 73 20 75 73 69 6e 67 20 74  rsor was using t
2b450 68 65 20 70 61 67 65 20 61 20 70 72 6f 62 6c 65  he page a proble
2b460 6d 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 20  m would occur.. 
2b470 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 70   */.  if( pBt->p
2b480 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 72 65  Cursor ){.    re
2b490 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  turn SQLITE_LOCK
2b4a0 45 44 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20  ED;.  }..#ifdef 
2b4b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
2b4c0 56 41 43 55 55 4d 0a 20 20 72 63 20 3d 20 61 6c  VACUUM.  rc = al
2b4d0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
2b4e0 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67  pBt, &pRoot, &pg
2b4f0 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20  noRoot, 1, 0);. 
2b500 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2b510 20 72 63 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28   rc;.#else.  if(
2b520 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
2b530 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e   ){.    Pgno pgn
2b540 6f 4d 6f 76 65 3b 20 20 20 20 20 20 2f 2a 20 4d  oMove;      /* M
2b550 6f 76 65 20 61 20 70 61 67 65 20 68 65 72 65 20  ove a page here 
2b560 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72  to make room for
2b570 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 2a   the root-page *
2b580 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  /.    MemPage *p
2b590 50 61 67 65 4d 6f 76 65 3b 20 2f 2a 20 54 68 65  PageMove; /* The
2b5a0 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f   page to move to
2b5b0 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61  . */..    /* Rea
2b5c0 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d  d the value of m
2b5d0 65 74 61 5b 33 5d 20 66 72 6f 6d 20 74 68 65 20  eta[3] from the 
2b5e0 64 61 74 61 62 61 73 65 20 74 6f 20 64 65 74 65  database to dete
2b5f0 72 6d 69 6e 65 20 77 68 65 72 65 20 74 68 65 0a  rmine where the.
2b600 20 20 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65      ** root page
2b610 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
2b620 65 20 73 68 6f 75 6c 64 20 67 6f 2e 20 6d 65 74  e should go. met
2b630 61 5b 33 5d 20 69 73 20 74 68 65 20 6c 61 72 67  a[3] is the larg
2b640 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20  est root-page.  
2b650 20 20 2a 2a 20 63 72 65 61 74 65 64 20 73 6f 20    ** created so 
2b660 66 61 72 2c 20 73 6f 20 74 68 65 20 6e 65 77 20  far, so the new 
2b670 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 28 6d 65  root-page is (me
2b680 74 61 5b 33 5d 2b 31 29 2e 0a 20 20 20 20 2a 2f  ta[3]+1)..    */
2b690 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2b6a0 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 70 2c  3BtreeGetMeta(p,
2b6b0 20 34 2c 20 26 70 67 6e 6f 52 6f 6f 74 29 3b 0a   4, &pgnoRoot);.
2b6c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2b6d0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
2b6e0 63 3b 0a 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b  c;.    pgnoRoot+
2b6f0 2b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e  +;..    /* The n
2b700 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 6d 61 79  ew root-page may
2b710 20 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74 65   not be allocate
2b720 64 20 6f 6e 20 61 20 70 6f 69 6e 74 65 72 2d 6d  d on a pointer-m
2b730 61 70 20 70 61 67 65 2c 20 6f 72 20 74 68 65 0a  ap page, or the.
2b740 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42      ** PENDING_B
2b750 59 54 45 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  YTE page..    */
2b760 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 52 6f 6f  .    if( pgnoRoo
2b770 74 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f  t==PTRMAP_PAGENO
2b780 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 29 20  (pBt, pgnoRoot) 
2b790 7c 7c 0a 20 20 20 20 20 20 20 20 70 67 6e 6f 52  ||.        pgnoR
2b7a0 6f 6f 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  oot==PENDING_BYT
2b7b0 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
2b7c0 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b       pgnoRoot++;
2b7d0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
2b7e0 74 28 20 70 67 6e 6f 52 6f 6f 74 3e 3d 33 20 29  t( pgnoRoot>=3 )
2b7f0 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61  ;..    /* Alloca
2b800 74 65 20 61 20 70 61 67 65 2e 20 54 68 65 20 70  te a page. The p
2b810 61 67 65 20 74 68 61 74 20 63 75 72 72 65 6e 74  age that current
2b820 6c 79 20 72 65 73 69 64 65 73 20 61 74 20 70 67  ly resides at pg
2b830 6e 6f 52 6f 6f 74 20 77 69 6c 6c 0a 20 20 20 20  noRoot will.    
2b840 2a 2a 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 74  ** be moved to t
2b850 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  he allocated pag
2b860 65 20 28 75 6e 6c 65 73 73 20 74 68 65 20 61 6c  e (unless the al
2b870 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68 61 70  located page hap
2b880 70 65 6e 73 0a 20 20 20 20 2a 2a 20 74 6f 20 72  pens.    ** to r
2b890 65 73 69 64 65 20 61 74 20 70 67 6e 6f 52 6f 6f  eside at pgnoRoo
2b8a0 74 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  t)..    */.    r
2b8b0 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
2b8c0 65 50 61 67 65 28 70 42 74 2c 20 26 70 50 61 67  ePage(pBt, &pPag
2b8d0 65 4d 6f 76 65 2c 20 26 70 67 6e 6f 4d 6f 76 65  eMove, &pgnoMove
2b8e0 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b 0a  , pgnoRoot, 1);.
2b8f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2b900 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
2b910 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
2b920 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 4d 6f 76  .    if( pgnoMov
2b930 65 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20  e!=pgnoRoot ){. 
2b940 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20       u8 eType;. 
2b950 20 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61       Pgno iPtrPa
2b960 67 65 3b 0a 0a 20 20 20 20 20 20 72 65 6c 65 61  ge;..      relea
2b970 73 65 50 61 67 65 28 70 50 61 67 65 4d 6f 76 65  sePage(pPageMove
2b980 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65  );.      rc = ge
2b990 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 52  tPage(pBt, pgnoR
2b9a0 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29 3b  oot, &pRoot, 0);
2b9b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2b9c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b9d0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2b9e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
2b9f0 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
2ba00 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 65 54 79 70   pgnoRoot, &eTyp
2ba10 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20  e, &iPtrPage);. 
2ba20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2ba30 49 54 45 5f 4f 4b 20 7c 7c 20 65 54 79 70 65 3d  ITE_OK || eType=
2ba40 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
2ba50 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
2ba60 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20  P_FREEPAGE ){.  
2ba70 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2ba80 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20  e(pRoot);.      
2ba90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2baa0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
2bab0 74 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50  t( eType!=PTRMAP
2bac0 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 20  _ROOTPAGE );.   
2bad0 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65     assert( eType
2bae0 21 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  !=PTRMAP_FREEPAG
2baf0 45 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  E );.      rc = 
2bb00 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2bb10 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65  e(pRoot->pDbPage
2bb20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
2bb30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2bb40 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2bb50 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20  e(pRoot);.      
2bb60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2bb70 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
2bb80 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74  relocatePage(pBt
2bb90 2c 20 70 52 6f 6f 74 2c 20 65 54 79 70 65 2c 20  , pRoot, eType, 
2bba0 69 50 74 72 50 61 67 65 2c 20 70 67 6e 6f 4d 6f  iPtrPage, pgnoMo
2bbb0 76 65 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  ve);.      relea
2bbc0 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20  sePage(pRoot);. 
2bbd0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2bbe0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2bbf0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2bc00 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
2bc10 67 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  getPage(pBt, pgn
2bc20 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30  oRoot, &pRoot, 0
2bc30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
2bc40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2bc50 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2bc60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
2bc70 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2bc80 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62  Write(pRoot->pDb
2bc90 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
2bca0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2bcb0 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
2bcc0 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20  ePage(pRoot);.  
2bcd0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2bce0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
2bcf0 73 65 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 20  se{.      pRoot 
2bd00 3d 20 70 50 61 67 65 4d 6f 76 65 3b 0a 20 20 20  = pPageMove;.   
2bd10 20 7d 20 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61   } ..    /* Upda
2bd20 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  te the pointer-m
2bd30 61 70 20 61 6e 64 20 6d 65 74 61 2d 64 61 74 61  ap and meta-data
2bd40 20 77 69 74 68 20 74 68 65 20 6e 65 77 20 72 6f   with the new ro
2bd50 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20  ot-page number. 
2bd60 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d  */.    rc = ptrm
2bd70 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 52  apPut(pBt, pgnoR
2bd80 6f 6f 74 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54  oot, PTRMAP_ROOT
2bd90 50 41 47 45 2c 20 30 29 3b 0a 20 20 20 20 69 66  PAGE, 0);.    if
2bda0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
2bdb0 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29  leasePage(pRoot)
2bdc0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
2bdd0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
2bde0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70  = sqlite3BtreeUp
2bdf0 64 61 74 65 4d 65 74 61 28 70 2c 20 34 2c 20 70  dateMeta(p, 4, p
2be00 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66  gnoRoot);.    if
2be10 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
2be20 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29  leasePage(pRoot)
2be30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
2be40 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73  c;.    }..  }els
2be50 65 7b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f  e{.    rc = allo
2be60 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
2be70 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f  t, &pRoot, &pgno
2be80 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20  Root, 1, 0);.   
2be90 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2bea0 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   rc;.  }.#endif.
2beb0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2bec0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2bed0 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65  e(pRoot->pDbPage
2bee0 29 20 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28  ) );.  zeroPage(
2bef0 70 52 6f 6f 74 2c 20 66 6c 61 67 73 20 7c 20 50  pRoot, flags | P
2bf00 54 46 5f 4c 45 41 46 29 3b 0a 20 20 73 71 6c 69  TF_LEAF);.  sqli
2bf10 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 52  te3PagerUnref(pR
2bf20 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  oot->pDbPage);. 
2bf30 20 2a 70 69 54 61 62 6c 65 20 3d 20 28 69 6e 74   *piTable = (int
2bf40 29 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 72 65 74  )pgnoRoot;.  ret
2bf50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2bf60 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 74 68  ../*.** Erase th
2bf70 65 20 67 69 76 65 6e 20 64 61 74 61 62 61 73 65  e given database
2bf80 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 69 74   page and all it
2bf90 73 20 63 68 69 6c 64 72 65 6e 2e 20 20 52 65 74  s children.  Ret
2bfa0 75 72 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 20  urn.** the page 
2bfb0 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  to the freelist.
2bfc0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
2bfd0 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65  learDatabasePage
2bfe0 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
2bff0 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
2c000 54 68 65 20 42 54 72 65 65 20 74 68 61 74 20 63  The BTree that c
2c010 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 61 62 6c  ontains the tabl
2c020 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
2c030 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2c040 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 63  Page number to c
2c050 6c 65 61 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  lear */.  MemPag
2c060 65 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20  e *pParent,     
2c070 2f 2a 20 50 61 72 65 6e 74 20 70 61 67 65 2e 20  /* Parent page. 
2c080 20 4e 55 4c 4c 20 66 6f 72 20 74 68 65 20 72 6f   NULL for the ro
2c090 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 66 72 65 65  ot */.  int free
2c0a0 50 61 67 65 46 6c 61 67 20 20 20 20 20 20 2f 2a  PageFlag      /*
2c0b0 20 44 65 61 6c 6c 6f 63 61 74 65 20 70 61 67 65   Deallocate page
2c0c0 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   if true */.){. 
2c0d0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
2c0e0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
2c0f0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2c100 70 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a  pCell;.  int i;.
2c110 0a 20 20 69 66 28 20 70 67 6e 6f 3e 73 71 6c 69  .  if( pgno>sqli
2c120 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
2c130 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29  t(pBt->pPager) )
2c140 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2c150 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2c160 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 67 65  ;.  }..  rc = ge
2c170 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
2c180 2c 20 70 67 6e 6f 2c 20 26 70 50 61 67 65 2c 20  , pgno, &pPage, 
2c190 70 50 61 72 65 6e 74 29 3b 0a 20 20 69 66 28 20  pParent);.  if( 
2c1a0 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64  rc ) goto cleard
2c1b0 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b  atabasepage_out;
2c1c0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50  .  for(i=0; i<pP
2c1d0 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29  age->nCell; i++)
2c1e0 7b 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69  {.    pCell = fi
2c1f0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29  ndCell(pPage, i)
2c200 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ;.    if( !pPage
2c210 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
2c220 72 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61  rc = clearDataba
2c230 73 65 50 61 67 65 28 70 42 74 2c 20 67 65 74 34  sePage(pBt, get4
2c240 62 79 74 65 28 70 43 65 6c 6c 29 2c 20 70 50 61  byte(pCell), pPa
2c250 67 65 2d 3e 70 50 61 72 65 6e 74 2c 20 31 29 3b  ge->pParent, 1);
2c260 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
2c270 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61  goto cleardataba
2c280 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  sepage_out;.    
2c290 7d 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72  }.    rc = clear
2c2a0 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c  Cell(pPage, pCel
2c2b0 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  l);.    if( rc )
2c2c0 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62   goto cleardatab
2c2d0 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d  asepage_out;.  }
2c2e0 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
2c2f0 65 61 66 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  eaf ){.    rc = 
2c300 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67  clearDatabasePag
2c310 65 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28  e(pBt, get4byte(
2c320 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 38 5d  &pPage->aData[8]
2c330 29 2c 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e  ), pPage->pParen
2c340 74 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 72  t, 1);.    if( r
2c350 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61  c ) goto clearda
2c360 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a  tabasepage_out;.
2c370 20 20 7d 0a 20 20 69 66 28 20 66 72 65 65 50 61    }.  if( freePa
2c380 67 65 46 6c 61 67 20 29 7b 0a 20 20 20 20 72 63  geFlag ){.    rc
2c390 20 3d 20 66 72 65 65 50 61 67 65 28 70 50 61 67   = freePage(pPag
2c3a0 65 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  e);.  }else if( 
2c3b0 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67  (rc = sqlite3Pag
2c3c0 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
2c3d0 44 62 50 61 67 65 29 29 3d 3d 30 20 29 7b 0a 20  DbPage))==0 ){. 
2c3e0 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67     zeroPage(pPag
2c3f0 65 2c 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e, pPage->aData[
2c400 30 5d 20 7c 20 50 54 46 5f 4c 45 41 46 29 3b 0a  0] | PTF_LEAF);.
2c410 20 20 7d 0a 0a 63 6c 65 61 72 64 61 74 61 62 61    }..cleardataba
2c420 73 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 72 65  sepage_out:.  re
2c430 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
2c440 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2c450 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
2c460 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ll information f
2c470 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 74 61 62  rom a single tab
2c480 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  le in the databa
2c490 73 65 2e 20 20 69 54 61 62 6c 65 20 69 73 0a 2a  se.  iTable is.*
2c4a0 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * the page numbe
2c4b0 72 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 6f 66  r of the root of
2c4c0 20 74 68 65 20 74 61 62 6c 65 2e 20 20 41 66 74   the table.  Aft
2c4d0 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
2c4e0 72 65 74 75 72 6e 73 2c 0a 2a 2a 20 74 68 65 20  returns,.** the 
2c4f0 72 6f 6f 74 20 70 61 67 65 20 69 73 20 65 6d 70  root page is emp
2c500 74 79 2c 20 62 75 74 20 73 74 69 6c 6c 20 65 78  ty, but still ex
2c510 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ists..**.** This
2c520 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 66 61   routine will fa
2c530 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4c  il with SQLITE_L
2c540 4f 43 4b 45 44 20 69 66 20 74 68 65 72 65 20 61  OCKED if there a
2c550 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 72  re any open.** r
2c560 65 61 64 20 63 75 72 73 6f 72 73 20 6f 6e 20 74  ead cursors on t
2c570 68 65 20 74 61 62 6c 65 2e 20 20 4f 70 65 6e 20  he table.  Open 
2c580 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 72  write cursors ar
2c590 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a  e moved to the.*
2c5a0 2a 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61  * root of the ta
2c5b0 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ble..*/.int sqli
2c5c0 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62  te3BtreeClearTab
2c5d0 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  le(Btree *p, int
2c5e0 20 69 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20   iTable){.  int 
2c5f0 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
2c600 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
2c610 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d  if( p->inTrans!=
2c620 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
2c630 20 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 72     return pBt->r
2c640 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45  eadOnly ? SQLITE
2c650 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49  _READONLY : SQLI
2c660 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
2c670 72 63 20 3d 20 63 68 65 63 6b 52 65 61 64 4c 6f  rc = checkReadLo
2c680 63 6b 73 28 70 2c 20 69 54 61 62 6c 65 2c 20 30  cks(p, iTable, 0
2c690 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
2c6a0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2c6b0 7d 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74 68 65  }..  /* Save the
2c6c0 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 61 6c 6c   position of all
2c6d0 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
2c6e0 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20   this table */. 
2c6f0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
2c700 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72  (rc = saveAllCur
2c710 73 6f 72 73 28 70 42 74 2c 20 69 54 61 62 6c 65  sors(pBt, iTable
2c720 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 72 65 74  , 0)) ){.    ret
2c730 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 72  urn rc;.  }..  r
2c740 65 74 75 72 6e 20 63 6c 65 61 72 44 61 74 61 62  eturn clearDatab
2c750 61 73 65 50 61 67 65 28 70 42 74 2c 20 28 50 67  asePage(pBt, (Pg
2c760 6e 6f 29 69 54 61 62 6c 65 2c 20 30 2c 20 30 29  no)iTable, 0, 0)
2c770 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65  ;.}../*.** Erase
2c780 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
2c790 20 69 6e 20 61 20 74 61 62 6c 65 20 61 6e 64 20   in a table and 
2c7a0 61 64 64 20 74 68 65 20 72 6f 6f 74 20 6f 66 20  add the root of 
2c7b0 74 68 65 20 74 61 62 6c 65 20 74 6f 0a 2a 2a 20  the table to.** 
2c7c0 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 45  the freelist.  E
2c7d0 78 63 65 70 74 2c 20 74 68 65 20 72 6f 6f 74 20  xcept, the root 
2c7e0 6f 66 20 74 68 65 20 70 72 69 6e 63 69 70 6c 65  of the principle
2c7f0 20 74 61 62 6c 65 20 28 74 68 65 20 6f 6e 65 20   table (the one 
2c800 6f 6e 0a 2a 2a 20 70 61 67 65 20 31 29 20 69 73  on.** page 1) is
2c810 20 6e 65 76 65 72 20 61 64 64 65 64 20 74 6f 20   never added to 
2c820 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a  the freelist..**
2c830 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2c840 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20   will fail with 
2c850 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66  SQLITE_LOCKED if
2c860 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f   there are any o
2c870 70 65 6e 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f  pen.** cursors o
2c880 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  n the table..**.
2c890 2a 2a 20 49 66 20 41 55 54 4f 56 41 43 55 55 4d  ** If AUTOVACUUM
2c8a0 20 69 73 20 65 6e 61 62 6c 65 64 20 61 6e 64 20   is enabled and 
2c8b0 74 68 65 20 70 61 67 65 20 61 74 20 69 54 61 62  the page at iTab
2c8c0 6c 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61  le is not the la
2c8d0 73 74 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20  st.** root page 
2c8e0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
2c8f0 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 6c  file, then the l
2c900 61 73 74 20 72 6f 6f 74 20 70 61 67 65 20 0a 2a  ast root page .*
2c910 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  * in the databas
2c920 65 20 66 69 6c 65 20 69 73 20 6d 6f 76 65 64 20  e file is moved 
2c930 69 6e 74 6f 20 74 68 65 20 73 6c 6f 74 20 66 6f  into the slot fo
2c940 72 6d 65 72 6c 79 20 6f 63 63 75 70 69 65 64 20  rmerly occupied 
2c950 62 79 0a 2a 2a 20 69 54 61 62 6c 65 20 61 6e 64  by.** iTable and
2c960 20 74 68 61 74 20 6c 61 73 74 20 73 6c 6f 74 20   that last slot 
2c970 66 6f 72 6d 65 72 6c 79 20 6f 63 63 75 70 69 65  formerly occupie
2c980 64 20 62 79 20 74 68 65 20 6c 61 73 74 20 72 6f  d by the last ro
2c990 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 64  ot page.** is ad
2c9a0 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ded to the freel
2c9b0 69 73 74 20 69 6e 73 74 65 61 64 20 6f 66 20 69  ist instead of i
2c9c0 54 61 62 6c 65 2e 20 20 49 6e 20 74 68 69 73 20  Table.  In this 
2c9d0 73 61 79 2c 20 61 6c 6c 0a 2a 2a 20 72 6f 6f 74  say, all.** root
2c9e0 20 70 61 67 65 73 20 61 72 65 20 6b 65 70 74 20   pages are kept 
2c9f0 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
2ca00 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2ca10 20 66 69 6c 65 2c 20 77 68 69 63 68 0a 2a 2a 20   file, which.** 
2ca20 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72  is necessary for
2ca30 20 41 55 54 4f 56 41 43 55 55 4d 20 74 6f 20 77   AUTOVACUUM to w
2ca40 6f 72 6b 20 72 69 67 68 74 2e 20 20 2a 70 69 4d  ork right.  *piM
2ca50 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f 20 74  oved is set to t
2ca60 68 65 20 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62  he .** page numb
2ca70 65 72 20 74 68 61 74 20 75 73 65 64 20 74 6f 20  er that used to 
2ca80 62 65 20 74 68 65 20 6c 61 73 74 20 72 6f 6f 74  be the last root
2ca90 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c   page in the fil
2caa0 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  e before.** the 
2cab0 6d 6f 76 65 2e 20 20 49 66 20 6e 6f 20 70 61 67  move.  If no pag
2cac0 65 20 67 65 74 73 20 6d 6f 76 65 64 2c 20 2a 70  e gets moved, *p
2cad0 69 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f  iMoved is set to
2cae0 20 30 2e 0a 2a 2a 20 54 68 65 20 6c 61 73 74 20   0..** The last 
2caf0 72 6f 6f 74 20 70 61 67 65 20 69 73 20 72 65 63  root page is rec
2cb00 6f 72 64 65 64 20 69 6e 20 6d 65 74 61 5b 33 5d  orded in meta[3]
2cb10 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f   and the value o
2cb20 66 0a 2a 2a 20 6d 65 74 61 5b 33 5d 20 69 73 20  f.** meta[3] is 
2cb30 75 70 64 61 74 65 64 20 62 79 20 74 68 69 73 20  updated by this 
2cb40 70 72 6f 63 65 64 75 72 65 2e 0a 2a 2f 0a 69 6e  procedure..*/.in
2cb50 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72  t sqlite3BtreeDr
2cb60 6f 70 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70  opTable(Btree *p
2cb70 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e  , int iTable, in
2cb80 74 20 2a 70 69 4d 6f 76 65 64 29 7b 0a 20 20 69  t *piMoved){.  i
2cb90 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
2cba0 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 42   *pPage = 0;.  B
2cbb0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2cbc0 2d 3e 70 42 74 3b 0a 0a 20 20 69 66 28 20 70 2d  ->pBt;..  if( p-
2cbd0 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f  >inTrans!=TRANS_
2cbe0 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72 65 74  WRITE ){.    ret
2cbf0 75 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  urn pBt->readOnl
2cc00 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  y ? SQLITE_READO
2cc10 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52  NLY : SQLITE_ERR
2cc20 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 74  OR;.  }..  /* It
2cc30 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 64   is illegal to d
2cc40 72 6f 70 20 61 20 74 61 62 6c 65 20 69 66 20 61  rop a table if a
2cc50 6e 79 20 63 75 72 73 6f 72 73 20 61 72 65 20 6f  ny cursors are o
2cc60 70 65 6e 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  pen on the.  ** 
2cc70 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 69  database. This i
2cc80 73 20 62 65 63 61 75 73 65 20 69 6e 20 61 75 74  s because in aut
2cc90 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 74 68  o-vacuum mode th
2cca0 65 20 62 61 63 6b 65 6e 64 20 6d 61 79 0a 20 20  e backend may.  
2ccb0 2a 2a 20 6e 65 65 64 20 74 6f 20 6d 6f 76 65 20  ** need to move 
2ccc0 61 6e 6f 74 68 65 72 20 72 6f 6f 74 2d 70 61 67  another root-pag
2ccd0 65 20 74 6f 20 66 69 6c 6c 20 61 20 67 61 70 20  e to fill a gap 
2cce0 6c 65 66 74 20 62 79 20 74 68 65 20 64 65 6c 65  left by the dele
2ccf0 74 65 64 0a 20 20 2a 2a 20 72 6f 6f 74 20 70 61  ted.  ** root pa
2cd00 67 65 2e 20 49 66 20 61 6e 20 6f 70 65 6e 20 63  ge. If an open c
2cd10 75 72 73 6f 72 20 77 61 73 20 75 73 69 6e 67 20  ursor was using 
2cd20 74 68 69 73 20 70 61 67 65 20 61 20 70 72 6f 62  this page a prob
2cd30 6c 65 6d 20 77 6f 75 6c 64 20 0a 20 20 2a 2a 20  lem would .  ** 
2cd40 6f 63 63 75 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  occur..  */.  if
2cd50 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29  ( pBt->pCursor )
2cd60 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2cd70 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 7d 0a  ITE_LOCKED;.  }.
2cd80 0a 20 20 72 63 20 3d 20 67 65 74 50 61 67 65 28  .  rc = getPage(
2cd90 70 42 74 2c 20 28 50 67 6e 6f 29 69 54 61 62 6c  pBt, (Pgno)iTabl
2cda0 65 2c 20 26 70 50 61 67 65 2c 20 30 29 3b 0a 20  e, &pPage, 0);. 
2cdb0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2cdc0 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
2cdd0 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62  te3BtreeClearTab
2cde0 6c 65 28 70 2c 20 69 54 61 62 6c 65 29 3b 0a 20  le(p, iTable);. 
2cdf0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
2ce00 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
2ce10 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
2ce20 3b 0a 20 20 7d 0a 0a 20 20 2a 70 69 4d 6f 76 65  ;.  }..  *piMove
2ce30 64 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 69 54  d = 0;..  if( iT
2ce40 61 62 6c 65 3e 31 20 29 7b 0a 23 69 66 64 65 66  able>1 ){.#ifdef
2ce50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2ce60 4f 56 41 43 55 55 4d 0a 20 20 20 20 72 63 20 3d  OVACUUM.    rc =
2ce70 20 66 72 65 65 50 61 67 65 28 70 50 61 67 65 29   freePage(pPage)
2ce80 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
2ce90 65 28 70 50 61 67 65 29 3b 0a 23 65 6c 73 65 0a  e(pPage);.#else.
2cea0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
2ceb0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
2cec0 20 50 67 6e 6f 20 6d 61 78 52 6f 6f 74 50 67 6e   Pgno maxRootPgn
2ced0 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  o;.      rc = sq
2cee0 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74  lite3BtreeGetMet
2cef0 61 28 70 2c 20 34 2c 20 26 6d 61 78 52 6f 6f 74  a(p, 4, &maxRoot
2cf00 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  Pgno);.      if(
2cf10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2cf20 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
2cf30 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
2cf40 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2cf50 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
2cf60 69 66 28 20 69 54 61 62 6c 65 3d 3d 6d 61 78 52  if( iTable==maxR
2cf70 6f 6f 74 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20  ootPgno ){.     
2cf80 20 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61 62     /* If the tab
2cf90 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64  le being dropped
2cfa0 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 77 69   is the table wi
2cfb0 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 72  th the largest r
2cfc0 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 20 20 20  oot-page.       
2cfd0 20 2a 2a 20 6e 75 6d 62 65 72 20 69 6e 20 74 68   ** number in th
2cfe0 65 20 64 61 74 61 62 61 73 65 2c 20 70 75 74 20  e database, put 
2cff0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 6e  the root page on
2d000 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e 20   the free list. 
2d010 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2d020 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
2d030 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
2d040 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
2d050 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
2d060 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2d070 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
2d080 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
2d090 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
2d0a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
2d0b0 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65  ble being droppe
2d0c0 64 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  d does not have 
2d0d0 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74  the largest root
2d0e0 2d 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a  -page.        **
2d0f0 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20 64   number in the d
2d100 61 74 61 62 61 73 65 2e 20 53 6f 20 6d 6f 76 65  atabase. So move
2d110 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20 64   the page that d
2d120 6f 65 73 20 69 6e 74 6f 20 74 68 65 20 0a 20 20  oes into the .  
2d130 20 20 20 20 20 20 2a 2a 20 67 61 70 20 6c 65 66        ** gap lef
2d140 74 20 62 79 20 74 68 65 20 64 65 6c 65 74 65 64  t by the deleted
2d150 20 72 6f 6f 74 2d 70 61 67 65 2e 0a 20 20 20 20   root-page..    
2d160 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 4d      */.        M
2d170 65 6d 50 61 67 65 20 2a 70 4d 6f 76 65 3b 0a 20  emPage *pMove;. 
2d180 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
2d190 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ge(pPage);.     
2d1a0 20 20 20 72 63 20 3d 20 67 65 74 50 61 67 65 28     rc = getPage(
2d1b0 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f  pBt, maxRootPgno
2d1c0 2c 20 26 70 4d 6f 76 65 2c 20 30 29 3b 0a 20 20  , &pMove, 0);.  
2d1d0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2d1e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2d1f0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2d200 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d210 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50    rc = relocateP
2d220 61 67 65 28 70 42 74 2c 20 70 4d 6f 76 65 2c 20  age(pBt, pMove, 
2d230 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c  PTRMAP_ROOTPAGE,
2d240 20 30 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20   0, iTable);.   
2d250 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2d260 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20  (pMove);.       
2d270 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2d280 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2d290 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2d2a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
2d2b0 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c 20 6d  = getPage(pBt, m
2d2c0 61 78 52 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f  axRootPgno, &pMo
2d2d0 76 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ve, 0);.        
2d2e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2d2f0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
2d300 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2d310 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
2d320 20 66 72 65 65 50 61 67 65 28 70 4d 6f 76 65 29   freePage(pMove)
2d330 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
2d340 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20  ePage(pMove);.  
2d350 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2d360 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2d370 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2d380 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d390 20 20 2a 70 69 4d 6f 76 65 64 20 3d 20 6d 61 78    *piMoved = max
2d3a0 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20 20 20  RootPgno;.      
2d3b0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20  }..      /* Set 
2d3c0 74 68 65 20 6e 65 77 20 27 6d 61 78 2d 72 6f 6f  the new 'max-roo
2d3d0 74 2d 70 61 67 65 27 20 76 61 6c 75 65 20 69 6e  t-page' value in
2d3e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 65   the database he
2d3f0 61 64 65 72 2e 20 54 68 69 73 0a 20 20 20 20 20  ader. This.     
2d400 20 2a 2a 20 69 73 20 74 68 65 20 6f 6c 64 20 76   ** is the old v
2d410 61 6c 75 65 20 6c 65 73 73 20 6f 6e 65 2c 20 6c  alue less one, l
2d420 65 73 73 20 6f 6e 65 20 6d 6f 72 65 20 69 66 20  ess one more if 
2d430 74 68 61 74 20 68 61 70 70 65 6e 73 20 74 6f 0a  that happens to.
2d440 20 20 20 20 20 20 2a 2a 20 62 65 20 61 20 72 6f        ** be a ro
2d450 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2c 20  ot-page number, 
2d460 6c 65 73 73 20 6f 6e 65 20 61 67 61 69 6e 20 69  less one again i
2d470 66 20 74 68 61 74 20 69 73 20 74 68 65 0a 20 20  f that is the.  
2d480 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42      ** PENDING_B
2d490 59 54 45 5f 50 41 47 45 2e 0a 20 20 20 20 20 20  YTE_PAGE..      
2d4a0 2a 2f 0a 20 20 20 20 20 20 6d 61 78 52 6f 6f 74  */.      maxRoot
2d4b0 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 69 66  Pgno--;.      if
2d4c0 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50  ( maxRootPgno==P
2d4d0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
2d4e0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
2d4f0 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a   maxRootPgno--;.
2d500 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2d510 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50  ( maxRootPgno==P
2d520 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
2d530 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 20 29  , maxRootPgno) )
2d540 7b 0a 20 20 20 20 20 20 20 20 6d 61 78 52 6f 6f  {.        maxRoo
2d550 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d  tPgno--;.      }
2d560 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d  .      assert( m
2d570 61 78 52 6f 6f 74 50 67 6e 6f 21 3d 50 45 4e 44  axRootPgno!=PEND
2d580 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
2d590 74 29 20 29 3b 0a 0a 20 20 20 20 20 20 72 63 20  t) );..      rc 
2d5a0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70  = sqlite3BtreeUp
2d5b0 64 61 74 65 4d 65 74 61 28 70 2c 20 34 2c 20 6d  dateMeta(p, 4, m
2d5c0 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20 20  axRootPgno);.   
2d5d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
2d5e0 20 3d 20 66 72 65 65 50 61 67 65 28 70 50 61 67   = freePage(pPag
2d5f0 65 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  e);.      releas
2d600 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
2d610 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c    }.#endif.  }el
2d620 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 73 71  se{.    /* If sq
2d630 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61  lite3BtreeDropTa
2d640 62 6c 65 20 77 61 73 20 63 61 6c 6c 65 64 20 6f  ble was called o
2d650 6e 20 70 61 67 65 20 31 2e 20 2a 2f 0a 20 20 20  n page 1. */.   
2d660 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c   zeroPage(pPage,
2d670 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f   PTF_INTKEY|PTF_
2d680 4c 45 41 46 20 29 3b 0a 20 20 20 20 72 65 6c 65  LEAF );.    rele
2d690 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
2d6a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2d6b0 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61    .}.../*.** Rea
2d6c0 64 20 74 68 65 20 6d 65 74 61 2d 69 6e 66 6f 72  d the meta-infor
2d6d0 6d 61 74 69 6f 6e 20 6f 75 74 20 6f 66 20 61 20  mation out of a 
2d6e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
2d6f0 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69 73 20 74 68  Meta[0].** is th
2d700 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65  e number of free
2d710 20 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79   pages currently
2d720 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2d730 2e 20 20 4d 65 74 61 5b 31 5d 0a 2a 2a 20 74 68  .  Meta[1].** th
2d740 72 6f 75 67 68 20 6d 65 74 61 5b 31 35 5d 20 61  rough meta[15] a
2d750 72 65 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  re available for
2d760 20 75 73 65 20 62 79 20 68 69 67 68 65 72 20 6c   use by higher l
2d770 61 79 65 72 73 2e 20 20 4d 65 74 61 5b 30 5d 0a  ayers.  Meta[0].
2d780 2a 2a 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c  ** is read-only,
2d790 20 74 68 65 20 6f 74 68 65 72 73 20 61 72 65 20   the others are 
2d7a0 72 65 61 64 2f 77 72 69 74 65 2e 0a 2a 2a 20 0a  read/write..** .
2d7b0 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20 6c 61  ** The schema la
2d7c0 79 65 72 20 6e 75 6d 62 65 72 73 20 6d 65 74 61  yer numbers meta
2d7d0 20 76 61 6c 75 65 73 20 64 69 66 66 65 72 65 6e   values differen
2d7e0 74 6c 79 2e 20 20 41 74 20 74 68 65 20 73 63 68  tly.  At the sch
2d7f0 65 6d 61 0a 2a 2a 20 6c 61 79 65 72 20 28 61 6e  ema.** layer (an
2d800 64 20 74 68 65 20 53 65 74 43 6f 6f 6b 69 65 20  d the SetCookie 
2d810 61 6e 64 20 52 65 61 64 43 6f 6f 6b 69 65 20 6f  and ReadCookie o
2d820 70 63 6f 64 65 73 29 20 74 68 65 20 6e 75 6d 62  pcodes) the numb
2d830 65 72 20 6f 66 0a 2a 2a 20 66 72 65 65 20 70 61  er of.** free pa
2d840 67 65 73 20 69 73 20 6e 6f 74 20 76 69 73 69 62  ges is not visib
2d850 6c 65 2e 20 20 53 6f 20 43 6f 6f 6b 69 65 5b 30  le.  So Cookie[0
2d860 5d 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  ] is the same as
2d870 20 4d 65 74 61 5b 31 5d 2e 0a 2a 2f 0a 69 6e 74   Meta[1]..*/.int
2d880 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
2d890 4d 65 74 61 28 42 74 72 65 65 20 2a 70 2c 20 69  Meta(Btree *p, i
2d8a0 6e 74 20 69 64 78 2c 20 75 33 32 20 2a 70 4d 65  nt idx, u32 *pMe
2d8b0 74 61 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70  ta){.  DbPage *p
2d8c0 44 62 50 61 67 65 3b 0a 20 20 69 6e 74 20 72 63  DbPage;.  int rc
2d8d0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
2d8e0 72 20 2a 70 50 31 3b 0a 20 20 42 74 53 68 61 72  r *pP1;.  BtShar
2d8f0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
2d900 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 69 6e 67 20  ;..  /* Reading 
2d910 61 20 6d 65 74 61 2d 64 61 74 61 20 76 61 6c 75  a meta-data valu
2d920 65 20 72 65 71 75 69 72 65 73 20 61 20 72 65 61  e requires a rea
2d930 64 2d 6c 6f 63 6b 20 6f 6e 20 70 61 67 65 20 31  d-lock on page 1
2d940 20 28 61 6e 64 20 68 65 6e 63 65 0a 20 20 2a 2a   (and hence.  **
2d950 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
2d960 65 72 20 74 61 62 6c 65 2e 20 57 65 20 67 72 61  er table. We gra
2d970 62 20 74 68 69 73 20 6c 6f 63 6b 20 72 65 67 61  b this lock rega
2d980 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
2d990 72 20 6f 72 0a 20 20 2a 2a 20 6e 6f 74 20 74 68  r or.  ** not th
2d9a0 65 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63  e SQLITE_ReadUnc
2d9b0 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73  ommitted flag is
2d9c0 20 73 65 74 20 28 74 68 65 20 74 61 62 6c 65 20   set (the table 
2d9d0 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 0a 20  rooted at page. 
2d9e0 20 2a 2a 20 31 20 69 73 20 74 72 65 61 74 65 64   ** 1 is treated
2d9f0 20 61 73 20 61 20 73 70 65 63 69 61 6c 20 63 61   as a special ca
2da00 73 65 20 62 79 20 71 75 65 72 79 54 61 62 6c 65  se by queryTable
2da10 4c 6f 63 6b 28 29 20 61 6e 64 20 6c 6f 63 6b 54  Lock() and lockT
2da20 61 62 6c 65 28 29 29 2e 0a 20 20 2a 2f 0a 20 20  able())..  */.  
2da30 72 63 20 3d 20 71 75 65 72 79 54 61 62 6c 65 4c  rc = queryTableL
2da40 6f 63 6b 28 70 2c 20 31 2c 20 52 45 41 44 5f 4c  ock(p, 1, READ_L
2da50 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  OCK);.  if( rc!=
2da60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2da70 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2da80 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d  .  assert( idx>=
2da90 30 20 26 26 20 69 64 78 3c 3d 31 35 20 29 3b 0a  0 && idx<=15 );.
2daa0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2dab0 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
2dac0 65 72 2c 20 31 2c 20 26 70 44 62 50 61 67 65 29  er, 1, &pDbPage)
2dad0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
2dae0 75 72 6e 20 72 63 3b 0a 20 20 70 50 31 20 3d 20  urn rc;.  pP1 = 
2daf0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
2db00 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
2db10 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20  Data(pDbPage);. 
2db20 20 2a 70 4d 65 74 61 20 3d 20 67 65 74 34 62 79   *pMeta = get4by
2db30 74 65 28 26 70 50 31 5b 33 36 20 2b 20 69 64 78  te(&pP1[36 + idx
2db40 2a 34 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  *4]);.  sqlite3P
2db50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
2db60 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 75 74  e);..  /* If aut
2db70 6f 76 61 63 75 75 6d 65 64 20 69 73 20 64 69 73  ovacuumed is dis
2db80 61 62 6c 65 64 20 69 6e 20 74 68 69 73 20 62 75  abled in this bu
2db90 69 6c 64 20 62 75 74 20 77 65 20 61 72 65 20 74  ild but we are t
2dba0 72 79 69 6e 67 20 74 6f 20 0a 20 20 2a 2a 20 61  rying to .  ** a
2dbb0 63 63 65 73 73 20 61 6e 20 61 75 74 6f 76 61 63  ccess an autovac
2dbc0 75 75 6d 65 64 20 64 61 74 61 62 61 73 65 2c 20  uumed database, 
2dbd0 74 68 65 6e 20 6d 61 6b 65 20 74 68 65 20 64 61  then make the da
2dbe0 74 61 62 61 73 65 20 72 65 61 64 6f 6e 6c 79 2e  tabase readonly.
2dbf0 20 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51   .  */.#ifdef SQ
2dc00 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
2dc10 43 55 55 4d 0a 20 20 69 66 28 20 69 64 78 3d 3d  CUUM.  if( idx==
2dc20 34 20 26 26 20 2a 70 4d 65 74 61 3e 30 20 29 20  4 && *pMeta>0 ) 
2dc30 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20  pBt->readOnly = 
2dc40 31 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  1;.#endif..  /* 
2dc50 47 72 61 62 20 74 68 65 20 72 65 61 64 2d 6c 6f  Grab the read-lo
2dc60 63 6b 20 6f 6e 20 70 61 67 65 20 31 2e 20 2a 2f  ck on page 1. */
2dc70 0a 20 20 72 63 20 3d 20 6c 6f 63 6b 54 61 62 6c  .  rc = lockTabl
2dc80 65 28 70 2c 20 31 2c 20 52 45 41 44 5f 4c 4f 43  e(p, 1, READ_LOC
2dc90 4b 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  K);.  return rc;
2dca0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
2dcb0 6d 65 74 61 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e  meta-information
2dcc0 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64   back into the d
2dcd0 61 74 61 62 61 73 65 2e 20 20 4d 65 74 61 5b 30  atabase.  Meta[0
2dce0 5d 20 69 73 0a 2a 2a 20 72 65 61 64 2d 6f 6e 6c  ] is.** read-onl
2dcf0 79 20 61 6e 64 20 6d 61 79 20 6e 6f 74 20 62 65  y and may not be
2dd00 20 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a 69 6e 74   written..*/.int
2dd10 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64   sqlite3BtreeUpd
2dd20 61 74 65 4d 65 74 61 28 42 74 72 65 65 20 2a 70  ateMeta(Btree *p
2dd30 2c 20 69 6e 74 20 69 64 78 2c 20 75 33 32 20 69  , int idx, u32 i
2dd40 4d 65 74 61 29 7b 0a 20 20 42 74 53 68 61 72 65  Meta){.  BtShare
2dd50 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
2dd60 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2dd70 20 2a 70 50 31 3b 0a 20 20 69 6e 74 20 72 63 3b   *pP1;.  int rc;
2dd80 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d  .  assert( idx>=
2dd90 31 20 26 26 20 69 64 78 3c 3d 31 35 20 29 3b 0a  1 && idx<=15 );.
2dda0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
2ddb0 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  !=TRANS_WRITE ){
2ddc0 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42 74 2d  .    return pBt-
2ddd0 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49  >readOnly ? SQLI
2dde0 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51  TE_READONLY : SQ
2ddf0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
2de00 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
2de10 50 61 67 65 31 21 3d 30 20 29 3b 0a 20 20 70 50  Page1!=0 );.  pP
2de20 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 2d  1 = pBt->pPage1-
2de30 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73  >aData;.  rc = s
2de40 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2de50 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44  (pBt->pPage1->pD
2de60 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
2de70 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2de80 70 75 74 34 62 79 74 65 28 26 70 50 31 5b 33 36  put4byte(&pP1[36
2de90 20 2b 20 69 64 78 2a 34 5d 2c 20 69 4d 65 74 61   + idx*4], iMeta
2dea0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
2deb0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2dec0 52 65 74 75 72 6e 20 74 68 65 20 66 6c 61 67 20  Return the flag 
2ded0 62 79 74 65 20 61 74 20 74 68 65 20 62 65 67 69  byte at the begi
2dee0 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 70 61 67  nning of the pag
2def0 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  e that the curso
2df00 72 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c  r.** is currentl
2df10 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a  y pointing to..*
2df20 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
2df30 65 65 46 6c 61 67 73 28 42 74 43 75 72 73 6f 72  eeFlags(BtCursor
2df40 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f   *pCur){.  /* TO
2df50 44 4f 3a 20 57 68 61 74 20 61 62 6f 75 74 20 43  DO: What about C
2df60 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
2df70 4b 20 73 74 61 74 65 3f 20 50 72 6f 62 61 62 6c  K state? Probabl
2df80 79 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 0a 20  y need to call. 
2df90 20 2a 2a 20 72 65 73 74 6f 72 65 4f 72 43 6c 65   ** restoreOrCle
2dfa0 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  arCursorPosition
2dfb0 28 29 20 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20  () here..  */.  
2dfc0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
2dfd0 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
2dfe0 72 65 74 75 72 6e 20 70 50 61 67 65 20 3f 20 70  return pPage ? p
2dff0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
2e000 65 2d 3e 68 64 72 4f 66 66 73 65 74 5d 20 3a 20  e->hdrOffset] : 
2e010 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  0;.}..#ifdef SQL
2e020 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
2e030 50 72 69 6e 74 20 61 20 64 69 73 61 73 73 65 6d  Print a disassem
2e040 62 6c 79 20 6f 66 20 74 68 65 20 67 69 76 65 6e  bly of the given
2e050 20 70 61 67 65 20 6f 6e 20 73 74 61 6e 64 61 72   page on standar
2e060 64 20 6f 75 74 70 75 74 2e 20 20 54 68 69 73 20  d output.  This 
2e070 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 75 73  routine.** is us
2e080 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67  ed for debugging
2e090 20 61 6e 64 20 74 65 73 74 69 6e 67 20 6f 6e 6c   and testing onl
2e0a0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
2e0b0 20 62 74 72 65 65 50 61 67 65 44 75 6d 70 28 42   btreePageDump(B
2e0c0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 69 6e  tShared *pBt, in
2e0d0 74 20 70 67 6e 6f 2c 20 69 6e 74 20 72 65 63 75  t pgno, int recu
2e0e0 72 73 69 76 65 2c 20 4d 65 6d 50 61 67 65 20 2a  rsive, MemPage *
2e0f0 70 50 61 72 65 6e 74 29 7b 0a 20 20 69 6e 74 20  pParent){.  int 
2e100 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  rc;.  MemPage *p
2e110 50 61 67 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  Page;.  int i, j
2e120 2c 20 63 3b 0a 20 20 69 6e 74 20 6e 46 72 65 65  , c;.  int nFree
2e130 3b 0a 20 20 75 31 36 20 69 64 78 3b 0a 20 20 69  ;.  u16 idx;.  i
2e140 6e 74 20 68 64 72 3b 0a 20 20 69 6e 74 20 6e 43  nt hdr;.  int nC
2e150 65 6c 6c 3b 0a 20 20 69 6e 74 20 69 73 49 6e 69  ell;.  int isIni
2e160 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  t;.  unsigned ch
2e170 61 72 20 2a 64 61 74 61 3b 0a 20 20 63 68 61 72  ar *data;.  char
2e180 20 72 61 6e 67 65 5b 32 30 5d 3b 0a 20 20 75 6e   range[20];.  un
2e190 73 69 67 6e 65 64 20 63 68 61 72 20 70 61 79 6c  signed char payl
2e1a0 6f 61 64 5b 32 30 5d 3b 0a 0a 20 20 72 63 20 3d  oad[20];..  rc =
2e1b0 20 67 65 74 50 61 67 65 28 70 42 74 2c 20 28 50   getPage(pBt, (P
2e1c0 67 6e 6f 29 70 67 6e 6f 2c 20 26 70 50 61 67 65  gno)pgno, &pPage
2e1d0 2c 20 30 29 3b 0a 20 20 69 73 49 6e 69 74 20 3d  , 0);.  isInit =
2e1e0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a   pPage->isInit;.
2e1f0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49    if( pPage->isI
2e200 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  nit==0 ){.    in
2e210 69 74 50 61 67 65 28 70 50 61 67 65 2c 20 70 50  itPage(pPage, pP
2e220 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66  arent);.  }.  if
2e230 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
2e240 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 68 64 72  rn rc;.  }.  hdr
2e250 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
2e260 73 65 74 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  set;.  data = pP
2e270 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 63 20  age->aData;.  c 
2e280 3d 20 64 61 74 61 5b 68 64 72 5d 3b 0a 20 20 70  = data[hdr];.  p
2e290 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 28  Page->intKey = (
2e2a0 63 20 26 20 28 50 54 46 5f 49 4e 54 4b 45 59 7c  c & (PTF_INTKEY|
2e2b0 50 54 46 5f 4c 45 41 46 44 41 54 41 29 29 21 3d  PTF_LEAFDATA))!=
2e2c0 30 3b 0a 20 20 70 50 61 67 65 2d 3e 7a 65 72 6f  0;.  pPage->zero
2e2d0 44 61 74 61 20 3d 20 28 63 20 26 20 50 54 46 5f  Data = (c & PTF_
2e2e0 5a 45 52 4f 44 41 54 41 29 21 3d 30 3b 0a 20 20  ZERODATA)!=0;.  
2e2f0 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20  pPage->leafData 
2e300 3d 20 28 63 20 26 20 50 54 46 5f 4c 45 41 46 44  = (c & PTF_LEAFD
2e310 41 54 41 29 21 3d 30 3b 0a 20 20 70 50 61 67 65  ATA)!=0;.  pPage
2e320 2d 3e 6c 65 61 66 20 3d 20 28 63 20 26 20 50 54  ->leaf = (c & PT
2e330 46 5f 4c 45 41 46 29 21 3d 30 3b 0a 20 20 70 50  F_LEAF)!=0;.  pP
2e340 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 21  age->hasData = !
2e350 28 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61  (pPage->zeroData
2e360 20 7c 7c 20 28 21 70 50 61 67 65 2d 3e 6c 65 61   || (!pPage->lea
2e370 66 20 26 26 20 70 50 61 67 65 2d 3e 6c 65 61 66  f && pPage->leaf
2e380 44 61 74 61 29 29 3b 0a 20 20 6e 43 65 6c 6c 20  Data));.  nCell 
2e390 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
2e3a0 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 73 71 6c 69  [hdr+3]);.  sqli
2e3b0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
2e3c0 50 41 47 45 20 25 64 3a 20 20 66 6c 61 67 73 3d  PAGE %d:  flags=
2e3d0 30 78 25 30 32 78 20 20 66 72 61 67 3d 25 64 20  0x%02x  frag=%d 
2e3e0 20 20 70 61 72 65 6e 74 3d 25 64 5c 6e 22 2c 20    parent=%d\n", 
2e3f0 70 67 6e 6f 2c 0a 20 20 20 20 64 61 74 61 5b 68  pgno,.    data[h
2e400 64 72 5d 2c 20 64 61 74 61 5b 68 64 72 2b 37 5d  dr], data[hdr+7]
2e410 2c 20 0a 20 20 20 20 28 70 50 61 67 65 2d 3e 69  , .    (pPage->i
2e420 73 49 6e 69 74 20 26 26 20 70 50 61 67 65 2d 3e  sInit && pPage->
2e430 70 50 61 72 65 6e 74 29 20 3f 20 70 50 61 67 65  pParent) ? pPage
2e440 2d 3e 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 20  ->pParent->pgno 
2e450 3a 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  : 0);.  assert( 
2e460 68 64 72 20 3d 3d 20 28 70 67 6e 6f 3d 3d 31 20  hdr == (pgno==1 
2e470 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20  ? 100 : 0) );.  
2e480 69 64 78 20 3d 20 68 64 72 20 2b 20 31 32 20 2d  idx = hdr + 12 -
2e490 20 70 50 61 67 65 2d 3e 6c 65 61 66 2a 34 3b 0a   pPage->leaf*4;.
2e4a0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
2e4b0 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 43 65  ll; i++){.    Ce
2e4c0 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
2e4d0 20 50 67 6e 6f 20 63 68 69 6c 64 3b 0a 20 20 20   Pgno child;.   
2e4e0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2e4f0 70 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 73  pCell;.    int s
2e500 7a 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b  z;.    int addr;
2e510 0a 0a 20 20 20 20 61 64 64 72 20 3d 20 67 65 74  ..    addr = get
2e520 32 62 79 74 65 28 26 64 61 74 61 5b 69 64 78 20  2byte(&data[idx 
2e530 2b 20 32 2a 69 5d 29 3b 0a 20 20 20 20 70 43 65  + 2*i]);.    pCe
2e540 6c 6c 20 3d 20 26 64 61 74 61 5b 61 64 64 72 5d  ll = &data[addr]
2e550 3b 0a 20 20 20 20 70 61 72 73 65 43 65 6c 6c 50  ;.    parseCellP
2e560 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
2e570 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 73 7a 20   &info);.    sz 
2e580 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20  = info.nSize;.  
2e590 20 20 73 70 72 69 6e 74 66 28 72 61 6e 67 65 2c    sprintf(range,
2e5a0 22 25 64 2e 2e 25 64 22 2c 20 61 64 64 72 2c 20  "%d..%d", addr, 
2e5b0 61 64 64 72 2b 73 7a 2d 31 29 3b 0a 20 20 20 20  addr+sz-1);.    
2e5c0 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
2e5d0 29 7b 0a 20 20 20 20 20 20 63 68 69 6c 64 20 3d  ){.      child =
2e5e0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
2e5f0 20 20 20 20 20 63 68 69 6c 64 20 3d 20 67 65 74       child = get
2e600 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20  4byte(pCell);.  
2e610 20 20 7d 0a 20 20 20 20 73 7a 20 3d 20 69 6e 66    }.    sz = inf
2e620 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20 69 66 28  o.nData;.    if(
2e630 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20   !pPage->intKey 
2e640 29 20 73 7a 20 2b 3d 20 69 6e 66 6f 2e 6e 4b 65  ) sz += info.nKe
2e650 79 3b 0a 20 20 20 20 69 66 28 20 73 7a 3e 73 69  y;.    if( sz>si
2e660 7a 65 6f 66 28 70 61 79 6c 6f 61 64 29 2d 31 20  zeof(payload)-1 
2e670 29 20 73 7a 20 3d 20 73 69 7a 65 6f 66 28 70 61  ) sz = sizeof(pa
2e680 79 6c 6f 61 64 29 2d 31 3b 0a 20 20 20 20 6d 65  yload)-1;.    me
2e690 6d 63 70 79 28 70 61 79 6c 6f 61 64 2c 20 26 70  mcpy(payload, &p
2e6a0 43 65 6c 6c 5b 69 6e 66 6f 2e 6e 48 65 61 64 65  Cell[info.nHeade
2e6b0 72 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 66 6f 72  r], sz);.    for
2e6c0 28 6a 3d 30 3b 20 6a 3c 73 7a 3b 20 6a 2b 2b 29  (j=0; j<sz; j++)
2e6d0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 61 79 6c  {.      if( payl
2e6e0 6f 61 64 5b 6a 5d 3c 30 78 32 30 20 7c 7c 20 70  oad[j]<0x20 || p
2e6f0 61 79 6c 6f 61 64 5b 6a 5d 3e 30 78 37 66 20 29  ayload[j]>0x7f )
2e700 20 70 61 79 6c 6f 61 64 5b 6a 5d 20 3d 20 27 2e   payload[j] = '.
2e710 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 79  ';.    }.    pay
2e720 6c 6f 61 64 5b 73 7a 5d 20 3d 20 30 3b 0a 20 20  load[sz] = 0;.  
2e730 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
2e740 69 6e 74 66 28 0a 20 20 20 20 20 20 22 63 65 6c  intf(.      "cel
2e750 6c 20 25 32 64 3a 20 69 3d 25 2d 31 30 73 20 63  l %2d: i=%-10s c
2e760 68 6c 64 3d 25 2d 34 64 20 6e 6b 3d 25 2d 34 6c  hld=%-4d nk=%-4l
2e770 6c 64 20 6e 64 3d 25 2d 34 64 20 70 61 79 6c 6f  ld nd=%-4d paylo
2e780 61 64 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  ad=%s\n",.      
2e790 69 2c 20 72 61 6e 67 65 2c 20 63 68 69 6c 64 2c  i, range, child,
2e7a0 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20 69 6e 66 6f   info.nKey, info
2e7b0 2e 6e 44 61 74 61 2c 20 70 61 79 6c 6f 61 64 0a  .nData, payload.
2e7c0 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28      );.  }.  if(
2e7d0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2e7e0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
2e7f0 67 50 72 69 6e 74 66 28 22 72 69 67 68 74 5f 63  gPrintf("right_c
2e800 68 69 6c 64 3a 20 25 64 5c 6e 22 2c 20 67 65 74  hild: %d\n", get
2e810 34 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  4byte(&data[hdr+
2e820 38 5d 29 29 3b 0a 20 20 7d 0a 20 20 6e 46 72 65  8]));.  }.  nFre
2e830 65 20 3d 20 30 3b 0a 20 20 69 20 3d 20 30 3b 0a  e = 0;.  i = 0;.
2e840 20 20 69 64 78 20 3d 20 67 65 74 32 62 79 74 65    idx = get2byte
2e850 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a  (&data[hdr+1]);.
2e860 20 20 77 68 69 6c 65 28 20 69 64 78 3e 30 20 26    while( idx>0 &
2e870 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 70 42 74  & idx<pPage->pBt
2e880 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  ->usableSize ){.
2e890 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 67 65 74      int sz = get
2e8a0 32 62 79 74 65 28 26 64 61 74 61 5b 69 64 78 2b  2byte(&data[idx+
2e8b0 32 5d 29 3b 0a 20 20 20 20 73 70 72 69 6e 74 66  2]);.    sprintf
2e8c0 28 72 61 6e 67 65 2c 22 25 64 2e 2e 25 64 22 2c  (range,"%d..%d",
2e8d0 20 69 64 78 2c 20 69 64 78 2b 73 7a 2d 31 29 3b   idx, idx+sz-1);
2e8e0 0a 20 20 20 20 6e 46 72 65 65 20 2b 3d 20 73 7a  .    nFree += sz
2e8f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  ;.    sqlite3Deb
2e900 75 67 50 72 69 6e 74 66 28 22 66 72 65 65 62 6c  ugPrintf("freebl
2e910 6f 63 6b 20 25 32 64 3a 20 69 3d 25 2d 31 30 73  ock %2d: i=%-10s
2e920 20 73 69 7a 65 3d 25 2d 34 64 20 74 6f 74 61 6c   size=%-4d total
2e930 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69  =%d\n",.       i
2e940 2c 20 72 61 6e 67 65 2c 20 73 7a 2c 20 6e 46 72  , range, sz, nFr
2e950 65 65 29 3b 0a 20 20 20 20 69 64 78 20 3d 20 67  ee);.    idx = g
2e960 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 64  et2byte(&data[id
2e970 78 5d 29 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20  x]);.    i++;.  
2e980 7d 0a 20 20 69 66 28 20 69 64 78 21 3d 30 20 29  }.  if( idx!=0 )
2e990 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
2e9a0 75 67 50 72 69 6e 74 66 28 22 45 52 52 4f 52 3a  ugPrintf("ERROR:
2e9b0 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20   next freeblock 
2e9c0 69 6e 64 65 78 20 6f 75 74 20 6f 66 20 72 61 6e  index out of ran
2e9d0 67 65 3a 20 25 64 5c 6e 22 2c 20 69 64 78 29 3b  ge: %d\n", idx);
2e9e0 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 63 75 72  .  }.  if( recur
2e9f0 73 69 76 65 20 26 26 20 21 70 50 61 67 65 2d 3e  sive && !pPage->
2ea00 6c 65 61 66 20 29 7b 0a 20 20 20 20 66 6f 72 28  leaf ){.    for(
2ea10 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
2ea20 2b 29 7b 0a 20 20 20 20 20 20 75 6e 73 69 67 6e  +){.      unsign
2ea30 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 20 3d  ed char *pCell =
2ea40 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
2ea50 20 69 29 3b 0a 20 20 20 20 20 20 62 74 72 65 65   i);.      btree
2ea60 50 61 67 65 44 75 6d 70 28 70 42 74 2c 20 67 65  PageDump(pBt, ge
2ea70 74 34 62 79 74 65 28 70 43 65 6c 6c 29 2c 20 31  t4byte(pCell), 1
2ea80 2c 20 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  , pPage);.      
2ea90 69 64 78 20 3d 20 67 65 74 32 62 79 74 65 28 70  idx = get2byte(p
2eaa0 43 65 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Cell);.    }.   
2eab0 20 62 74 72 65 65 50 61 67 65 44 75 6d 70 28 70   btreePageDump(p
2eac0 42 74 2c 20 67 65 74 34 62 79 74 65 28 26 64 61  Bt, get4byte(&da
2ead0 74 61 5b 68 64 72 2b 38 5d 29 2c 20 31 2c 20 70  ta[hdr+8]), 1, p
2eae0 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61  Page);.  }.  pPa
2eaf0 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49  ge->isInit = isI
2eb00 6e 69 74 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  nit;.  sqlite3Pa
2eb10 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 2d 3e  gerUnref(pPage->
2eb20 70 44 62 50 61 67 65 29 3b 0a 20 20 66 66 6c 75  pDbPage);.  fflu
2eb30 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 72 65  sh(stdout);.  re
2eb40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2eb50 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  }.int sqlite3Btr
2eb60 65 65 50 61 67 65 44 75 6d 70 28 42 74 72 65 65  eePageDump(Btree
2eb70 20 2a 70 2c 20 69 6e 74 20 70 67 6e 6f 2c 20 69   *p, int pgno, i
2eb80 6e 74 20 72 65 63 75 72 73 69 76 65 29 7b 0a 20  nt recursive){. 
2eb90 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 61 67   return btreePag
2eba0 65 44 75 6d 70 28 70 2d 3e 70 42 74 2c 20 70 67  eDump(p->pBt, pg
2ebb0 6e 6f 2c 20 72 65 63 75 72 73 69 76 65 2c 20 30  no, recursive, 0
2ebc0 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  );.}.#endif..#if
2ebd0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2ebe0 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64  TEST) || defined
2ebf0 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f  (SQLITE_DEBUG)./
2ec00 2a 0a 2a 2a 20 46 69 6c 6c 20 61 52 65 73 75 6c  *.** Fill aResul
2ec10 74 5b 5d 20 77 69 74 68 20 69 6e 66 6f 72 6d 61  t[] with informa
2ec20 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 65  tion about the e
2ec30 6e 74 72 79 20 61 6e 64 20 70 61 67 65 20 74 68  ntry and page th
2ec40 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72  at the.** cursor
2ec50 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e   is pointing to.
2ec60 0a 2a 2a 20 0a 2a 2a 20 20 20 61 52 65 73 75 6c  .** .**   aResul
2ec70 74 5b 30 5d 20 3d 20 20 54 68 65 20 70 61 67 65  t[0] =  The page
2ec80 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 61 52 65   number.**   aRe
2ec90 73 75 6c 74 5b 31 5d 20 3d 20 20 54 68 65 20 65  sult[1] =  The e
2eca0 6e 74 72 79 20 6e 75 6d 62 65 72 0a 2a 2a 20 20  ntry number.**  
2ecb0 20 61 52 65 73 75 6c 74 5b 32 5d 20 3d 20 20 54   aResult[2] =  T
2ecc0 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 65  otal number of e
2ecd0 6e 74 72 69 65 73 20 6f 6e 20 74 68 69 73 20 70  ntries on this p
2ece0 61 67 65 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74  age.**   aResult
2ecf0 5b 33 5d 20 3d 20 20 43 65 6c 6c 20 73 69 7a 65  [3] =  Cell size
2ed00 20 28 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 20   (local payload 
2ed10 2b 20 68 65 61 64 65 72 29 0a 2a 2a 20 20 20 61  + header).**   a
2ed20 52 65 73 75 6c 74 5b 34 5d 20 3d 20 20 4e 75 6d  Result[4] =  Num
2ed30 62 65 72 20 6f 66 20 66 72 65 65 20 62 79 74 65  ber of free byte
2ed40 73 20 6f 6e 20 74 68 69 73 20 70 61 67 65 0a 2a  s on this page.*
2ed50 2a 20 20 20 61 52 65 73 75 6c 74 5b 35 5d 20 3d  *   aResult[5] =
2ed60 20 20 4e 75 6d 62 65 72 20 6f 66 20 66 72 65 65    Number of free
2ed70 20 62 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 70   blocks on the p
2ed80 61 67 65 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74  age.**   aResult
2ed90 5b 36 5d 20 3d 20 20 54 6f 74 61 6c 20 70 61 79  [6] =  Total pay
2eda0 6c 6f 61 64 20 73 69 7a 65 20 28 6c 6f 63 61 6c  load size (local
2edb0 20 2b 20 6f 76 65 72 66 6c 6f 77 29 0a 2a 2a 20   + overflow).** 
2edc0 20 20 61 52 65 73 75 6c 74 5b 37 5d 20 3d 20 20    aResult[7] =  
2edd0 48 65 61 64 65 72 20 73 69 7a 65 20 69 6e 20 62  Header size in b
2ede0 79 74 65 73 0a 2a 2a 20 20 20 61 52 65 73 75 6c  ytes.**   aResul
2edf0 74 5b 38 5d 20 3d 20 20 4c 6f 63 61 6c 20 70 61  t[8] =  Local pa
2ee00 79 6c 6f 61 64 20 73 69 7a 65 0a 2a 2a 20 20 20  yload size.**   
2ee10 61 52 65 73 75 6c 74 5b 39 5d 20 3d 20 20 50 61  aResult[9] =  Pa
2ee20 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72  rent page number
2ee30 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 31 30  .**   aResult[10
2ee40 5d 3d 20 20 50 61 67 65 20 6e 75 6d 62 65 72 20  ]=  Page number 
2ee50 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  of the first ove
2ee60 72 66 6c 6f 77 20 70 61 67 65 0a 2a 2a 0a 2a 2a  rflow page.**.**
2ee70 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2ee80 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
2ee90 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  g and debugging 
2eea0 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  only..*/.int sql
2eeb0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49  ite3BtreeCursorI
2eec0 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43  nfo(BtCursor *pC
2eed0 75 72 2c 20 69 6e 74 20 2a 61 52 65 73 75 6c 74  ur, int *aResult
2eee0 2c 20 69 6e 74 20 75 70 43 6e 74 29 7b 0a 20 20  , int upCnt){.  
2eef0 69 6e 74 20 63 6e 74 2c 20 69 64 78 3b 0a 20 20  int cnt, idx;.  
2ef00 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
2ef10 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
2ef20 42 74 43 75 72 73 6f 72 20 74 6d 70 43 75 72 3b  BtCursor tmpCur;
2ef30 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20 72 65 73  ..  int rc = res
2ef40 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f  toreOrClearCurso
2ef50 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 2c 20  rPosition(pCur, 
2ef60 31 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  1);.  if( rc!=SQ
2ef70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
2ef80 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
2ef90 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2efa0 69 73 49 6e 69 74 20 29 3b 0a 20 20 67 65 74 54  isInit );.  getT
2efb0 65 6d 70 43 75 72 73 6f 72 28 70 43 75 72 2c 20  empCursor(pCur, 
2efc0 26 74 6d 70 43 75 72 29 3b 0a 20 20 77 68 69 6c  &tmpCur);.  whil
2efd0 65 28 20 75 70 43 6e 74 2d 2d 20 29 7b 0a 20 20  e( upCnt-- ){.  
2efe0 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 26    moveToParent(&
2eff0 74 6d 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 70  tmpCur);.  }.  p
2f000 50 61 67 65 20 3d 20 74 6d 70 43 75 72 2e 70 50  Page = tmpCur.pP
2f010 61 67 65 3b 0a 20 20 61 52 65 73 75 6c 74 5b 30  age;.  aResult[0
2f020 5d 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  ] = sqlite3Pager
2f030 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  Pagenumber(pPage
2f040 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 61 73  ->pDbPage);.  as
2f050 73 65 72 74 28 20 61 52 65 73 75 6c 74 5b 30 5d  sert( aResult[0]
2f060 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b  ==pPage->pgno );
2f070 0a 20 20 61 52 65 73 75 6c 74 5b 31 5d 20 3d 20  .  aResult[1] = 
2f080 74 6d 70 43 75 72 2e 69 64 78 3b 0a 20 20 61 52  tmpCur.idx;.  aR
2f090 65 73 75 6c 74 5b 32 5d 20 3d 20 70 50 61 67 65  esult[2] = pPage
2f0a0 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 66 28 20 74  ->nCell;.  if( t
2f0b0 6d 70 43 75 72 2e 69 64 78 3e 3d 30 20 26 26 20  mpCur.idx>=0 && 
2f0c0 74 6d 70 43 75 72 2e 69 64 78 3c 70 50 61 67 65  tmpCur.idx<pPage
2f0d0 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 67  ->nCell ){.    g
2f0e0 65 74 43 65 6c 6c 49 6e 66 6f 28 26 74 6d 70 43  etCellInfo(&tmpC
2f0f0 75 72 29 3b 0a 20 20 20 20 61 52 65 73 75 6c 74  ur);.    aResult
2f100 5b 33 5d 20 3d 20 74 6d 70 43 75 72 2e 69 6e 66  [3] = tmpCur.inf
2f110 6f 2e 6e 53 69 7a 65 3b 0a 20 20 20 20 61 52 65  o.nSize;.    aRe
2f120 73 75 6c 74 5b 36 5d 20 3d 20 74 6d 70 43 75 72  sult[6] = tmpCur
2f130 2e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20  .info.nData;.   
2f140 20 61 52 65 73 75 6c 74 5b 37 5d 20 3d 20 74 6d   aResult[7] = tm
2f150 70 43 75 72 2e 69 6e 66 6f 2e 6e 48 65 61 64 65  pCur.info.nHeade
2f160 72 3b 0a 20 20 20 20 61 52 65 73 75 6c 74 5b 38  r;.    aResult[8
2f170 5d 20 3d 20 74 6d 70 43 75 72 2e 69 6e 66 6f 2e  ] = tmpCur.info.
2f180 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b  nLocal;.  }else{
2f190 0a 20 20 20 20 61 52 65 73 75 6c 74 5b 33 5d 20  .    aResult[3] 
2f1a0 3d 20 30 3b 0a 20 20 20 20 61 52 65 73 75 6c 74  = 0;.    aResult
2f1b0 5b 36 5d 20 3d 20 30 3b 0a 20 20 20 20 61 52 65  [6] = 0;.    aRe
2f1c0 73 75 6c 74 5b 37 5d 20 3d 20 30 3b 0a 20 20 20  sult[7] = 0;.   
2f1d0 20 61 52 65 73 75 6c 74 5b 38 5d 20 3d 20 30 3b   aResult[8] = 0;
2f1e0 0a 20 20 7d 0a 20 20 61 52 65 73 75 6c 74 5b 34  .  }.  aResult[4
2f1f0 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  ] = pPage->nFree
2f200 3b 0a 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69  ;.  cnt = 0;.  i
2f210 64 78 20 3d 20 67 65 74 32 62 79 74 65 28 26 70  dx = get2byte(&p
2f220 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
2f230 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 31 5d 29  e->hdrOffset+1])
2f240 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3e 30  ;.  while( idx>0
2f250 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 70   && idx<pPage->p
2f260 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
2f270 7b 0a 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20  {.    cnt++;.   
2f280 20 69 64 78 20 3d 20 67 65 74 32 62 79 74 65 28   idx = get2byte(
2f290 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 69 64  &pPage->aData[id
2f2a0 78 5d 29 3b 0a 20 20 7d 0a 20 20 61 52 65 73 75  x]);.  }.  aResu
2f2b0 6c 74 5b 35 5d 20 3d 20 63 6e 74 3b 0a 20 20 69  lt[5] = cnt;.  i
2f2c0 66 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e  f( pPage->pParen
2f2d0 74 3d 3d 30 20 7c 7c 20 69 73 52 6f 6f 74 50 61  t==0 || isRootPa
2f2e0 67 65 28 70 50 61 67 65 29 20 29 7b 0a 20 20 20  ge(pPage) ){.   
2f2f0 20 61 52 65 73 75 6c 74 5b 39 5d 20 3d 20 30 3b   aResult[9] = 0;
2f300 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 52  .  }else{.    aR
2f310 65 73 75 6c 74 5b 39 5d 20 3d 20 70 50 61 67 65  esult[9] = pPage
2f320 2d 3e 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3b  ->pParent->pgno;
2f330 0a 20 20 7d 0a 20 20 69 66 28 20 74 6d 70 43 75  .  }.  if( tmpCu
2f340 72 2e 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  r.info.iOverflow
2f350 20 29 7b 0a 20 20 20 20 61 52 65 73 75 6c 74 5b   ){.    aResult[
2f360 31 30 5d 20 3d 20 67 65 74 34 62 79 74 65 28 26  10] = get4byte(&
2f370 74 6d 70 43 75 72 2e 69 6e 66 6f 2e 70 43 65 6c  tmpCur.info.pCel
2f380 6c 5b 74 6d 70 43 75 72 2e 69 6e 66 6f 2e 69 4f  l[tmpCur.info.iO
2f390 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 7d 65 6c  verflow]);.  }el
2f3a0 73 65 7b 0a 20 20 20 20 61 52 65 73 75 6c 74 5b  se{.    aResult[
2f3b0 31 30 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  10] = 0;.  }.  r
2f3c0 65 6c 65 61 73 65 54 65 6d 70 43 75 72 73 6f 72  eleaseTempCursor
2f3d0 28 26 74 6d 70 43 75 72 29 3b 0a 20 20 72 65 74  (&tmpCur);.  ret
2f3e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2f3f0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
2f400 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 72 20  eturn the pager 
2f410 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2f420 61 20 42 54 72 65 65 2e 20 20 54 68 69 73 20 72  a BTree.  This r
2f430 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
2f440 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e  or.** testing an
2f450 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79  d debugging only
2f460 2e 0a 2a 2f 0a 50 61 67 65 72 20 2a 73 71 6c 69  ..*/.Pager *sqli
2f470 74 65 33 42 74 72 65 65 50 61 67 65 72 28 42 74  te3BtreePager(Bt
2f480 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  ree *p){.  retur
2f490 6e 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  n p->pBt->pPager
2f4a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2f4b0 73 74 72 75 63 74 75 72 65 20 69 73 20 70 61 73  structure is pas
2f4c0 73 65 64 20 61 72 6f 75 6e 64 20 74 68 72 6f 75  sed around throu
2f4d0 67 68 20 61 6c 6c 20 74 68 65 20 73 61 6e 69 74  gh all the sanit
2f4e0 79 20 63 68 65 63 6b 69 6e 67 20 72 6f 75 74 69  y checking routi
2f4f0 6e 65 73 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  nes.** in order 
2f500 74 6f 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66  to keep track of
2f510 20 73 6f 6d 65 20 67 6c 6f 62 61 6c 20 73 74 61   some global sta
2f520 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  te information..
2f530 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
2f540 74 20 49 6e 74 65 67 72 69 74 79 43 6b 20 49 6e  t IntegrityCk In
2f550 74 65 67 72 69 74 79 43 6b 3b 0a 73 74 72 75 63  tegrityCk;.struc
2f560 74 20 49 6e 74 65 67 72 69 74 79 43 6b 20 7b 0a  t IntegrityCk {.
2f570 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
2f580 20 20 20 20 2f 2a 20 54 68 65 20 74 72 65 65 20      /* The tree 
2f590 62 65 69 6e 67 20 63 68 65 63 6b 65 64 20 6f 75  being checked ou
2f5a0 74 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 70 50  t */.  Pager *pP
2f5b0 61 67 65 72 3b 20 20 20 20 2f 2a 20 54 68 65 20  ager;    /* The 
2f5c0 61 73 73 6f 63 69 61 74 65 64 20 70 61 67 65 72  associated pager
2f5d0 2e 20 20 41 6c 73 6f 20 61 63 63 65 73 73 69 62  .  Also accessib
2f5e0 6c 65 20 62 79 20 70 42 74 2d 3e 70 50 61 67 65  le by pBt->pPage
2f5f0 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  r */.  int nPage
2f600 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ;        /* Numb
2f610 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
2f620 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
2f630 20 69 6e 74 20 2a 61 6e 52 65 66 3b 20 20 20 20   int *anRef;    
2f640 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2f650 74 69 6d 65 73 20 65 61 63 68 20 70 61 67 65 20  times each page 
2f660 69 73 20 72 65 66 65 72 65 6e 63 65 64 20 2a 2f  is referenced */
2f670 0a 20 20 69 6e 74 20 6d 78 45 72 72 3b 20 20 20  .  int mxErr;   
2f680 20 20 20 20 20 2f 2a 20 53 74 6f 70 20 61 63 63       /* Stop acc
2f690 75 6d 75 6c 61 74 69 6e 67 20 65 72 72 6f 72 73  umulating errors
2f6a0 20 77 68 65 6e 20 74 68 69 73 20 72 65 61 63 68   when this reach
2f6b0 65 73 20 7a 65 72 6f 20 2a 2f 0a 20 20 63 68 61  es zero */.  cha
2f6c0 72 20 2a 7a 45 72 72 4d 73 67 3b 20 20 20 20 2f  r *zErrMsg;    /
2f6d0 2a 20 41 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  * An error messa
2f6e0 67 65 2e 20 20 4e 55 4c 4c 20 69 66 20 6e 6f 20  ge.  NULL if no 
2f6f0 65 72 72 6f 72 73 20 73 65 65 6e 2e 20 2a 2f 0a  errors seen. */.
2f700 20 20 69 6e 74 20 6e 45 72 72 3b 20 20 20 20 20    int nErr;     
2f710 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2f720 20 6d 65 73 73 61 67 65 73 20 77 72 69 74 74 65   messages writte
2f730 6e 20 74 6f 20 7a 45 72 72 4d 73 67 20 73 6f 20  n to zErrMsg so 
2f740 66 61 72 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 6e 64  far */.};..#ifnd
2f750 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
2f760 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f  NTEGRITY_CHECK./
2f770 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6d 65  *.** Append a me
2f780 73 73 61 67 65 20 74 6f 20 74 68 65 20 65 72 72  ssage to the err
2f790 6f 72 20 6d 65 73 73 61 67 65 20 73 74 72 69 6e  or message strin
2f7a0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
2f7b0 64 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67  d checkAppendMsg
2f7c0 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20  (.  IntegrityCk 
2f7d0 2a 70 43 68 65 63 6b 2c 0a 20 20 63 68 61 72 20  *pCheck,.  char 
2f7e0 2a 7a 4d 73 67 31 2c 0a 20 20 63 6f 6e 73 74 20  *zMsg1,.  const 
2f7f0 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 0a 20  char *zFormat,. 
2f800 20 2e 2e 2e 0a 29 7b 0a 20 20 76 61 5f 6c 69 73   ....){.  va_lis
2f810 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 4d  t ap;.  char *zM
2f820 73 67 32 3b 0a 20 20 69 66 28 20 21 70 43 68 65  sg2;.  if( !pChe
2f830 63 6b 2d 3e 6d 78 45 72 72 20 29 20 72 65 74 75  ck->mxErr ) retu
2f840 72 6e 3b 0a 20 20 70 43 68 65 63 6b 2d 3e 6d 78  rn;.  pCheck->mx
2f850 45 72 72 2d 2d 3b 0a 20 20 70 43 68 65 63 6b 2d  Err--;.  pCheck-
2f860 3e 6e 45 72 72 2b 2b 3b 0a 20 20 76 61 5f 73 74  >nErr++;.  va_st
2f870 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
2f880 3b 0a 20 20 7a 4d 73 67 32 20 3d 20 73 71 6c 69  ;.  zMsg2 = sqli
2f890 74 65 33 56 4d 50 72 69 6e 74 66 28 7a 46 6f 72  te3VMPrintf(zFor
2f8a0 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65  mat, ap);.  va_e
2f8b0 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20 7a 4d  nd(ap);.  if( zM
2f8c0 73 67 31 3d 3d 30 20 29 20 7a 4d 73 67 31 20 3d  sg1==0 ) zMsg1 =
2f8d0 20 22 22 3b 0a 20 20 69 66 28 20 70 43 68 65 63   "";.  if( pChec
2f8e0 6b 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  k->zErrMsg ){.  
2f8f0 20 20 63 68 61 72 20 2a 7a 4f 6c 64 20 3d 20 70    char *zOld = p
2f900 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 3b 0a  Check->zErrMsg;.
2f910 20 20 20 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72      pCheck->zErr
2f920 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  Msg = 0;.    sql
2f930 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70  ite3SetString(&p
2f940 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 2c 20  Check->zErrMsg, 
2f950 7a 4f 6c 64 2c 20 22 5c 6e 22 2c 20 7a 4d 73 67  zOld, "\n", zMsg
2f960 31 2c 20 7a 4d 73 67 32 2c 20 28 63 68 61 72 2a  1, zMsg2, (char*
2f970 29 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  )0);.    sqliteF
2f980 72 65 65 28 7a 4f 6c 64 29 3b 0a 20 20 7d 65 6c  ree(zOld);.  }el
2f990 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  se{.    sqlite3S
2f9a0 65 74 53 74 72 69 6e 67 28 26 70 43 68 65 63 6b  etString(&pCheck
2f9b0 2d 3e 7a 45 72 72 4d 73 67 2c 20 7a 4d 73 67 31  ->zErrMsg, zMsg1
2f9c0 2c 20 7a 4d 73 67 32 2c 20 28 63 68 61 72 2a 29  , zMsg2, (char*)
2f9d0 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  0);.  }.  sqlite
2f9e0 46 72 65 65 28 7a 4d 73 67 32 29 3b 0a 7d 0a 23  Free(zMsg2);.}.#
2f9f0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2fa00 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43  OMIT_INTEGRITY_C
2fa10 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  HECK */..#ifndef
2fa20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54   SQLITE_OMIT_INT
2fa30 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a  EGRITY_CHECK./*.
2fa40 2a 2a 20 41 64 64 20 31 20 74 6f 20 74 68 65 20  ** Add 1 to the 
2fa50 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
2fa60 66 6f 72 20 70 61 67 65 20 69 50 61 67 65 2e 20  for page iPage. 
2fa70 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
2fa80 73 65 63 6f 6e 64 0a 2a 2a 20 72 65 66 65 72 65  second.** refere
2fa90 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 2c  nce to the page,
2faa0 20 61 64 64 20 61 6e 20 65 72 72 6f 72 20 6d 65   add an error me
2fab0 73 73 61 67 65 20 74 6f 20 70 43 68 65 63 6b 2d  ssage to pCheck-
2fac0 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 20 52 65 74  >zErrMsg..** Ret
2fad0 75 72 6e 20 31 20 69 66 20 74 68 65 72 65 20 61  urn 1 if there a
2fae0 72 65 20 32 20 6f 72 65 20 6d 6f 72 65 20 72 65  re 2 ore more re
2faf0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
2fb00 70 61 67 65 20 61 6e 64 20 30 20 69 66 0a 2a 2a  page and 0 if.**
2fb10 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
2fb20 66 69 72 73 74 20 72 65 66 65 72 65 6e 63 65 20  first reference 
2fb30 74 6f 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a  to the page..**.
2fb40 2a 2a 20 41 6c 73 6f 20 63 68 65 63 6b 20 74 68  ** Also check th
2fb50 61 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  at the page numb
2fb60 65 72 20 69 73 20 69 6e 20 62 6f 75 6e 64 73 2e  er is in bounds.
2fb70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
2fb80 68 65 63 6b 52 65 66 28 49 6e 74 65 67 72 69 74  heckRef(Integrit
2fb90 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 69 6e 74  yCk *pCheck, int
2fba0 20 69 50 61 67 65 2c 20 63 68 61 72 20 2a 7a 43   iPage, char *zC
2fbb0 6f 6e 74 65 78 74 29 7b 0a 20 20 69 66 28 20 69  ontext){.  if( i
2fbc0 50 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Page==0 ) return
2fbd0 20 31 3b 0a 20 20 69 66 28 20 69 50 61 67 65 3e   1;.  if( iPage>
2fbe0 70 43 68 65 63 6b 2d 3e 6e 50 61 67 65 20 7c 7c  pCheck->nPage ||
2fbf0 20 69 50 61 67 65 3c 30 20 29 7b 0a 20 20 20 20   iPage<0 ){.    
2fc00 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
2fc10 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c  Check, zContext,
2fc20 20 22 69 6e 76 61 6c 69 64 20 70 61 67 65 20 6e   "invalid page n
2fc30 75 6d 62 65 72 20 25 64 22 2c 20 69 50 61 67 65  umber %d", iPage
2fc40 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
2fc50 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 68 65 63  .  }.  if( pChec
2fc60 6b 2d 3e 61 6e 52 65 66 5b 69 50 61 67 65 5d 3d  k->anRef[iPage]=
2fc70 3d 31 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41  =1 ){.    checkA
2fc80 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
2fc90 20 7a 43 6f 6e 74 65 78 74 2c 20 22 32 6e 64 20   zContext, "2nd 
2fca0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67  reference to pag
2fcb0 65 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20  e %d", iPage);. 
2fcc0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
2fcd0 0a 20 20 72 65 74 75 72 6e 20 20 28 70 43 68 65  .  return  (pChe
2fce0 63 6b 2d 3e 61 6e 52 65 66 5b 69 50 61 67 65 5d  ck->anRef[iPage]
2fcf0 2b 2b 29 3e 31 3b 0a 7d 0a 0a 23 69 66 6e 64 65  ++)>1;.}..#ifnde
2fd00 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2fd10 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 43  TOVACUUM./*.** C
2fd20 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 65 6e  heck that the en
2fd30 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74  try in the point
2fd40 65 72 2d 6d 61 70 20 66 6f 72 20 70 61 67 65 20  er-map for page 
2fd50 69 43 68 69 6c 64 20 6d 61 70 73 20 74 6f 20 0a  iChild maps to .
2fd60 2a 2a 20 70 61 67 65 20 69 50 61 72 65 6e 74 2c  ** page iParent,
2fd70 20 70 6f 69 6e 74 65 72 20 74 79 70 65 20 70 74   pointer type pt
2fd80 72 54 79 70 65 2e 20 49 66 20 6e 6f 74 2c 20 61  rType. If not, a
2fd90 70 70 65 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d  ppend an error m
2fda0 65 73 73 61 67 65 0a 2a 2a 20 74 6f 20 70 43 68  essage.** to pCh
2fdb0 65 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  eck..*/.static v
2fdc0 6f 69 64 20 63 68 65 63 6b 50 74 72 6d 61 70 28  oid checkPtrmap(
2fdd0 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a  .  IntegrityCk *
2fde0 70 43 68 65 63 6b 2c 20 20 20 2f 2a 20 49 6e 74  pCheck,   /* Int
2fdf0 65 67 72 69 74 79 20 63 68 65 63 6b 20 63 6f 6e  egrity check con
2fe00 74 65 78 74 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  text */.  Pgno i
2fe10 43 68 69 6c 64 2c 20 20 20 20 20 20 20 20 20 20  Child,          
2fe20 20 2f 2a 20 43 68 69 6c 64 20 70 61 67 65 20 6e   /* Child page n
2fe30 75 6d 62 65 72 20 2a 2f 0a 20 20 75 38 20 65 54  umber */.  u8 eT
2fe40 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
2fe50 20 20 2f 2a 20 45 78 70 65 63 74 65 64 20 70 6f    /* Expected po
2fe60 69 6e 74 65 72 20 6d 61 70 20 74 79 70 65 20 2a  inter map type *
2fe70 2f 0a 20 20 50 67 6e 6f 20 69 50 61 72 65 6e 74  /.  Pgno iParent
2fe80 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78  ,          /* Ex
2fe90 70 65 63 74 65 64 20 70 6f 69 6e 74 65 72 20 6d  pected pointer m
2fea0 61 70 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e  ap parent page n
2feb0 75 6d 62 65 72 20 2a 2f 0a 20 20 63 68 61 72 20  umber */.  char 
2fec0 2a 7a 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20  *zContext       
2fed0 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 64 65 73    /* Context des
2fee0 63 72 69 70 74 69 6f 6e 20 28 75 73 65 64 20 66  cription (used f
2fef0 6f 72 20 65 72 72 6f 72 20 6d 73 67 29 20 2a 2f  or error msg) */
2ff00 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
2ff10 75 38 20 65 50 74 72 6d 61 70 54 79 70 65 3b 0a  u8 ePtrmapType;.
2ff20 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 50 61    Pgno iPtrmapPa
2ff30 72 65 6e 74 3b 0a 0a 20 20 72 63 20 3d 20 70 74  rent;..  rc = pt
2ff40 72 6d 61 70 47 65 74 28 70 43 68 65 63 6b 2d 3e  rmapGet(pCheck->
2ff50 70 42 74 2c 20 69 43 68 69 6c 64 2c 20 26 65 50  pBt, iChild, &eP
2ff60 74 72 6d 61 70 54 79 70 65 2c 20 26 69 50 74 72  trmapType, &iPtr
2ff70 6d 61 70 50 61 72 65 6e 74 29 3b 0a 20 20 69 66  mapParent);.  if
2ff80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2ff90 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65  ){.    checkAppe
2ffa0 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
2ffb0 6f 6e 74 65 78 74 2c 20 22 46 61 69 6c 65 64 20  ontext, "Failed 
2ffc0 74 6f 20 72 65 61 64 20 70 74 72 6d 61 70 20 6b  to read ptrmap k
2ffd0 65 79 3d 25 64 22 2c 20 69 43 68 69 6c 64 29 3b  ey=%d", iChild);
2ffe0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
2fff0 0a 0a 20 20 69 66 28 20 65 50 74 72 6d 61 70 54  ..  if( ePtrmapT
30000 79 70 65 21 3d 65 54 79 70 65 20 7c 7c 20 69 50  ype!=eType || iP
30010 74 72 6d 61 70 50 61 72 65 6e 74 21 3d 69 50 61  trmapParent!=iPa
30020 72 65 6e 74 20 29 7b 0a 20 20 20 20 63 68 65 63  rent ){.    chec
30030 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
30040 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 0a 20 20  k, zContext, .  
30050 20 20 20 20 22 42 61 64 20 70 74 72 20 6d 61 70      "Bad ptr map
30060 20 65 6e 74 72 79 20 6b 65 79 3d 25 64 20 65 78   entry key=%d ex
30070 70 65 63 74 65 64 3d 28 25 64 2c 25 64 29 20 67  pected=(%d,%d) g
30080 6f 74 3d 28 25 64 2c 25 64 29 22 2c 20 0a 20 20  ot=(%d,%d)", .  
30090 20 20 20 20 69 43 68 69 6c 64 2c 20 65 54 79 70      iChild, eTyp
300a0 65 2c 20 69 50 61 72 65 6e 74 2c 20 65 50 74 72  e, iParent, ePtr
300b0 6d 61 70 54 79 70 65 2c 20 69 50 74 72 6d 61 70  mapType, iPtrmap
300c0 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 23  Parent);.  }.}.#
300d0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  endif../*.** Che
300e0 63 6b 20 74 68 65 20 69 6e 74 65 67 72 69 74 79  ck the integrity
300f0 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   of the freelist
30100 20 6f 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c   or of an overfl
30110 6f 77 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2a  ow page list..**
30120 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
30130 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
30140 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 69 73 20   on the list is 
30150 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  N..*/.static voi
30160 64 20 63 68 65 63 6b 4c 69 73 74 28 0a 20 20 49  d checkList(.  I
30170 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65  ntegrityCk *pChe
30180 63 6b 2c 20 20 2f 2a 20 49 6e 74 65 67 72 69 74  ck,  /* Integrit
30190 79 20 63 68 65 63 6b 69 6e 67 20 63 6f 6e 74 65  y checking conte
301a0 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 46 72  xt */.  int isFr
301b0 65 65 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  eeList,       /*
301c0 20 54 72 75 65 20 66 6f 72 20 61 20 66 72 65 65   True for a free
301d0 6c 69 73 74 2e 20 20 46 61 6c 73 65 20 66 6f 72  list.  False for
301e0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6c   overflow page l
301f0 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  ist */.  int iPa
30200 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ge,            /
30210 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  * Page number fo
30220 72 20 66 69 72 73 74 20 70 61 67 65 20 69 6e 20  r first page in 
30230 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e  the list */.  in
30240 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20  t N,            
30250 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65 64 20      /* Expected 
30260 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
30270 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20  in the list */. 
30280 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74 20   char *zContext 
30290 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78         /* Contex
302a0 74 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73  t for error mess
302b0 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ages */.){.  int
302c0 20 69 3b 0a 20 20 69 6e 74 20 65 78 70 65 63 74   i;.  int expect
302d0 65 64 20 3d 20 4e 3b 0a 20 20 69 6e 74 20 69 46  ed = N;.  int iF
302e0 69 72 73 74 20 3d 20 69 50 61 67 65 3b 0a 20 20  irst = iPage;.  
302f0 77 68 69 6c 65 28 20 4e 2d 2d 20 3e 20 30 20 26  while( N-- > 0 &
30300 26 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 20  & pCheck->mxErr 
30310 29 7b 0a 20 20 20 20 44 62 50 61 67 65 20 2a 70  ){.    DbPage *p
30320 4f 76 66 6c 50 61 67 65 3b 0a 20 20 20 20 75 6e  OvflPage;.    un
30330 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 4f 76  signed char *pOv
30340 66 6c 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20  flData;.    if( 
30350 69 50 61 67 65 3c 31 20 29 7b 0a 20 20 20 20 20  iPage<1 ){.     
30360 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
30370 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
30380 2c 0a 20 20 20 20 20 20 20 20 20 22 25 64 20 6f  ,.         "%d o
30390 66 20 25 64 20 70 61 67 65 73 20 6d 69 73 73 69  f %d pages missi
303a0 6e 67 20 66 72 6f 6d 20 6f 76 65 72 66 6c 6f 77  ng from overflow
303b0 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67 20 61   list starting a
303c0 74 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20  t %d",.         
303d0 20 4e 2b 31 2c 20 65 78 70 65 63 74 65 64 2c 20   N+1, expected, 
303e0 69 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 62  iFirst);.      b
303f0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
30400 69 66 28 20 63 68 65 63 6b 52 65 66 28 70 43 68  if( checkRef(pCh
30410 65 63 6b 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e  eck, iPage, zCon
30420 74 65 78 74 29 20 29 20 62 72 65 61 6b 3b 0a 20  text) ) break;. 
30430 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
30440 67 65 72 47 65 74 28 70 43 68 65 63 6b 2d 3e 70  gerGet(pCheck->p
30450 50 61 67 65 72 2c 20 28 50 67 6e 6f 29 69 50 61  Pager, (Pgno)iPa
30460 67 65 2c 20 26 70 4f 76 66 6c 50 61 67 65 29 20  ge, &pOvflPage) 
30470 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70  ){.      checkAp
30480 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
30490 7a 43 6f 6e 74 65 78 74 2c 20 22 66 61 69 6c 65  zContext, "faile
304a0 64 20 74 6f 20 67 65 74 20 70 61 67 65 20 25 64  d to get page %d
304b0 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20  ", iPage);.     
304c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
304d0 20 20 70 4f 76 66 6c 44 61 74 61 20 3d 20 28 75    pOvflData = (u
304e0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 73  nsigned char *)s
304f0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
30500 74 61 28 70 4f 76 66 6c 50 61 67 65 29 3b 0a 20  ta(pOvflPage);. 
30510 20 20 20 69 66 28 20 69 73 46 72 65 65 4c 69 73     if( isFreeLis
30520 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  t ){.      int n
30530 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 4f 76   = get4byte(&pOv
30540 66 6c 44 61 74 61 5b 34 5d 29 3b 0a 23 69 66 6e  flData[4]);.#ifn
30550 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
30560 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
30570 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 70 42 74   if( pCheck->pBt
30580 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
30590 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74 72          checkPtr
305a0 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 50 61 67  map(pCheck, iPag
305b0 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e, PTRMAP_FREEPA
305c0 47 45 2c 20 30 2c 20 7a 43 6f 6e 74 65 78 74 29  GE, 0, zContext)
305d0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
305e0 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 70 43 68  .      if( n>pCh
305f0 65 63 6b 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  eck->pBt->usable
30600 53 69 7a 65 2f 34 2d 38 20 29 7b 0a 20 20 20 20  Size/4-8 ){.    
30610 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
30620 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74  sg(pCheck, zCont
30630 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ext,.           
30640 22 66 72 65 65 6c 69 73 74 20 6c 65 61 66 20 63  "freelist leaf c
30650 6f 75 6e 74 20 74 6f 6f 20 62 69 67 20 6f 6e 20  ount too big on 
30660 70 61 67 65 20 25 64 22 2c 20 69 50 61 67 65 29  page %d", iPage)
30670 3b 0a 20 20 20 20 20 20 20 20 4e 2d 2d 3b 0a 20  ;.        N--;. 
30680 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
30690 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
306a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
306b0 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65    Pgno iFreePage
306c0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 4f 76   = get4byte(&pOv
306d0 66 6c 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a  flData[8+i*4]);.
306e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
306f0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
30700 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 68           if( pCh
30710 65 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61  eck->pBt->autoVa
30720 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  cuum ){.        
30730 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28      checkPtrmap(
30740 70 43 68 65 63 6b 2c 20 69 46 72 65 65 50 61 67  pCheck, iFreePag
30750 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e, PTRMAP_FREEPA
30760 47 45 2c 20 30 2c 20 7a 43 6f 6e 74 65 78 74 29  GE, 0, zContext)
30770 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65  ;.          }.#e
30780 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 63  ndif.          c
30790 68 65 63 6b 52 65 66 28 70 43 68 65 63 6b 2c 20  heckRef(pCheck, 
307a0 69 46 72 65 65 50 61 67 65 2c 20 7a 43 6f 6e 74  iFreePage, zCont
307b0 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ext);.        }.
307c0 20 20 20 20 20 20 20 20 4e 20 2d 3d 20 6e 3b 0a          N -= n;.
307d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69        }.    }.#i
307e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
307f0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
30800 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20   else{.      /* 
30810 49 66 20 74 68 69 73 20 64 61 74 61 62 61 73 65  If this database
30820 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76   supports auto-v
30830 61 63 75 75 6d 20 61 6e 64 20 69 50 61 67 65 20  acuum and iPage 
30840 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a  is not the last.
30850 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e        ** page in
30860 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 6c   this overflow l
30870 69 73 74 2c 20 63 68 65 63 6b 20 74 68 61 74 20  ist, check that 
30880 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
30890 65 6e 74 72 79 20 66 6f 72 0a 20 20 20 20 20 20  entry for.      
308a0 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
308b0 20 70 61 67 65 20 6d 61 74 63 68 65 73 20 69 50   page matches iP
308c0 61 67 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  age..      */.  
308d0 20 20 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e      if( pCheck->
308e0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
308f0 26 26 20 4e 3e 30 20 29 7b 0a 20 20 20 20 20 20  && N>0 ){.      
30900 20 20 69 20 3d 20 67 65 74 34 62 79 74 65 28 70    i = get4byte(p
30910 4f 76 66 6c 44 61 74 61 29 3b 0a 20 20 20 20 20  OvflData);.     
30920 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70     checkPtrmap(p
30930 43 68 65 63 6b 2c 20 69 2c 20 50 54 52 4d 41 50  Check, i, PTRMAP
30940 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 50 61 67  _OVERFLOW2, iPag
30950 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20  e, zContext);.  
30960 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
30970 69 66 0a 20 20 20 20 69 50 61 67 65 20 3d 20 67  if.    iPage = g
30980 65 74 34 62 79 74 65 28 70 4f 76 66 6c 44 61 74  et4byte(pOvflDat
30990 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  a);.    sqlite3P
309a0 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 50  agerUnref(pOvflP
309b0 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  age);.  }.}.#end
309c0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
309d0 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
309e0 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  K */..#ifndef SQ
309f0 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52  LITE_OMIT_INTEGR
30a00 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20  ITY_CHECK./*.** 
30a10 44 6f 20 76 61 72 69 6f 75 73 20 73 61 6e 69 74  Do various sanit
30a20 79 20 63 68 65 63 6b 73 20 6f 6e 20 61 20 73 69  y checks on a si
30a30 6e 67 6c 65 20 70 61 67 65 20 6f 66 20 61 20 74  ngle page of a t
30a40 72 65 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ree.  Return.** 
30a50 74 68 65 20 74 72 65 65 20 64 65 70 74 68 2e 20  the tree depth. 
30a60 20 52 6f 6f 74 20 70 61 67 65 73 20 72 65 74 75   Root pages retu
30a70 72 6e 20 30 2e 20 20 50 61 72 65 6e 74 73 20 6f  rn 0.  Parents o
30a80 66 20 72 6f 6f 74 20 70 61 67 65 73 0a 2a 2a 20  f root pages.** 
30a90 72 65 74 75 72 6e 20 31 2c 20 61 6e 64 20 73 6f  return 1, and so
30aa0 20 66 6f 72 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 54   forth..** .** T
30ab0 68 65 73 65 20 63 68 65 63 6b 73 20 61 72 65 20  hese checks are 
30ac0 64 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  done:.**.**     
30ad0 20 31 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74   1.  Make sure t
30ae0 68 61 74 20 63 65 6c 6c 73 20 61 6e 64 20 66 72  hat cells and fr
30af0 65 65 62 6c 6f 63 6b 73 20 64 6f 20 6e 6f 74 20  eeblocks do not 
30b00 6f 76 65 72 6c 61 70 0a 2a 2a 20 20 20 20 20 20  overlap.**      
30b10 20 20 20 20 62 75 74 20 63 6f 6d 62 69 6e 65 20      but combine 
30b20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 63 6f  to completely co
30b30 76 65 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a  ver the page..**
30b40 20 20 4e 4f 20 20 32 2e 20 20 4d 61 6b 65 20 73    NO  2.  Make s
30b50 75 72 65 20 63 65 6c 6c 20 6b 65 79 73 20 61 72  ure cell keys ar
30b60 65 20 69 6e 20 6f 72 64 65 72 2e 0a 2a 2a 20 20  e in order..**  
30b70 4e 4f 20 20 33 2e 20 20 4d 61 6b 65 20 73 75 72  NO  3.  Make sur
30b80 65 20 6e 6f 20 6b 65 79 20 69 73 20 6c 65 73 73  e no key is less
30b90 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
30ba0 6f 20 7a 4c 6f 77 65 72 42 6f 75 6e 64 2e 0a 2a  o zLowerBound..*
30bb0 2a 20 20 4e 4f 20 20 34 2e 20 20 4d 61 6b 65 20  *  NO  4.  Make 
30bc0 73 75 72 65 20 6e 6f 20 6b 65 79 20 69 73 20 67  sure no key is g
30bd0 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
30be0 71 75 61 6c 20 74 6f 20 7a 55 70 70 65 72 42 6f  qual to zUpperBo
30bf0 75 6e 64 2e 0a 2a 2a 20 20 20 20 20 20 35 2e 20  und..**      5. 
30c00 20 43 68 65 63 6b 20 74 68 65 20 69 6e 74 65 67   Check the integ
30c10 72 69 74 79 20 6f 66 20 6f 76 65 72 66 6c 6f 77  rity of overflow
30c20 20 70 61 67 65 73 2e 0a 2a 2a 20 20 20 20 20 20   pages..**      
30c30 36 2e 20 20 52 65 63 75 72 73 69 76 65 6c 79 20  6.  Recursively 
30c40 63 61 6c 6c 20 63 68 65 63 6b 54 72 65 65 50 61  call checkTreePa
30c50 67 65 20 6f 6e 20 61 6c 6c 20 63 68 69 6c 64 72  ge on all childr
30c60 65 6e 2e 0a 2a 2a 20 20 20 20 20 20 37 2e 20 20  en..**      7.  
30c70 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
30c80 64 65 70 74 68 20 6f 66 20 61 6c 6c 20 63 68 69  depth of all chi
30c90 6c 64 72 65 6e 20 69 73 20 74 68 65 20 73 61 6d  ldren is the sam
30ca0 65 2e 0a 2a 2a 20 20 20 20 20 20 38 2e 20 20 4d  e..**      8.  M
30cb0 61 6b 65 20 73 75 72 65 20 74 68 69 73 20 70 61  ake sure this pa
30cc0 67 65 20 69 73 20 61 74 20 6c 65 61 73 74 20 33  ge is at least 3
30cd0 33 25 20 66 75 6c 6c 20 6f 72 20 65 6c 73 65 20  3% full or else 
30ce0 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20  it is.**        
30cf0 20 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68    the root of th
30d00 65 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69  e tree..*/.stati
30d10 63 20 69 6e 74 20 63 68 65 63 6b 54 72 65 65 50  c int checkTreeP
30d20 61 67 65 28 0a 20 20 49 6e 74 65 67 72 69 74 79  age(.  Integrity
30d30 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20 2f 2a 20  Ck *pCheck,  /* 
30d40 43 6f 6e 74 65 78 74 20 66 6f 72 20 74 68 65 20  Context for the 
30d50 73 61 6e 69 74 79 20 63 68 65 63 6b 20 2a 2f 0a  sanity check */.
30d60 20 20 69 6e 74 20 69 50 61 67 65 2c 20 20 20 20    int iPage,    
30d70 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
30d80 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  number of the pa
30d90 67 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20  ge to check */. 
30da0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
30db0 74 2c 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74  t,     /* Parent
30dc0 20 70 61 67 65 20 2a 2f 0a 20 20 63 68 61 72 20   page */.  char 
30dd0 2a 7a 50 61 72 65 6e 74 43 6f 6e 74 65 78 74 20  *zParentContext 
30de0 20 2f 2a 20 50 61 72 65 6e 74 20 63 6f 6e 74 65   /* Parent conte
30df0 78 74 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61  xt */.){.  MemPa
30e00 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74  ge *pPage;.  int
30e10 20 69 2c 20 72 63 2c 20 64 65 70 74 68 2c 20 64   i, rc, depth, d
30e20 32 2c 20 70 67 6e 6f 2c 20 63 6e 74 3b 0a 20 20  2, pgno, cnt;.  
30e30 69 6e 74 20 68 64 72 2c 20 63 65 6c 6c 53 74 61  int hdr, cellSta
30e40 72 74 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b  rt;.  int nCell;
30e50 0a 20 20 75 38 20 2a 64 61 74 61 3b 0a 20 20 42  .  u8 *data;.  B
30e60 74 53 68 61 72 65 64 20 2a 70 42 74 3b 0a 20 20  tShared *pBt;.  
30e70 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  int usableSize;.
30e80 20 20 63 68 61 72 20 7a 43 6f 6e 74 65 78 74 5b    char zContext[
30e90 31 30 30 5d 3b 0a 20 20 63 68 61 72 20 2a 68 69  100];.  char *hi
30ea0 74 3b 0a 0a 20 20 73 70 72 69 6e 74 66 28 7a 43  t;..  sprintf(zC
30eb0 6f 6e 74 65 78 74 2c 20 22 50 61 67 65 20 25 64  ontext, "Page %d
30ec0 3a 20 22 2c 20 69 50 61 67 65 29 3b 0a 0a 20 20  : ", iPage);..  
30ed0 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
30ee0 65 20 70 61 67 65 20 65 78 69 73 74 73 0a 20 20  e page exists.  
30ef0 2a 2f 0a 20 20 70 42 74 20 3d 20 70 43 68 65 63  */.  pBt = pChec
30f00 6b 2d 3e 70 42 74 3b 0a 20 20 75 73 61 62 6c 65  k->pBt;.  usable
30f10 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
30f20 6c 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 69 50  leSize;.  if( iP
30f30 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  age==0 ) return 
30f40 30 3b 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65  0;.  if( checkRe
30f50 66 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c  f(pCheck, iPage,
30f60 20 7a 50 61 72 65 6e 74 43 6f 6e 74 65 78 74 29   zParentContext)
30f70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
30f80 66 28 20 28 72 63 20 3d 20 67 65 74 50 61 67 65  f( (rc = getPage
30f90 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 50 61 67  (pBt, (Pgno)iPag
30fa0 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 21 3d  e, &pPage, 0))!=
30fb0 30 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70  0 ){.    checkAp
30fc0 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
30fd0 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20  zContext,.      
30fe0 20 22 75 6e 61 62 6c 65 20 74 6f 20 67 65 74 20   "unable to get 
30ff0 74 68 65 20 70 61 67 65 2e 20 65 72 72 6f 72 20  the page. error 
31000 63 6f 64 65 3d 25 64 22 2c 20 72 63 29 3b 0a 20  code=%d", rc);. 
31010 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
31020 0a 20 20 69 66 28 20 28 72 63 20 3d 20 69 6e 69  .  if( (rc = ini
31030 74 50 61 67 65 28 70 50 61 67 65 2c 20 70 50 61  tPage(pPage, pPa
31040 72 65 6e 74 29 29 21 3d 30 20 29 7b 0a 20 20 20  rent))!=0 ){.   
31050 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
31060 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
31070 2c 20 22 69 6e 69 74 50 61 67 65 28 29 20 72 65  , "initPage() re
31080 74 75 72 6e 73 20 65 72 72 6f 72 20 63 6f 64 65  turns error code
31090 20 25 64 22 2c 20 72 63 29 3b 0a 20 20 20 20 72   %d", rc);.    r
310a0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
310b0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
310c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
310d0 20 6f 75 74 20 61 6c 6c 20 74 68 65 20 63 65 6c   out all the cel
310e0 6c 73 2e 0a 20 20 2a 2f 0a 20 20 64 65 70 74 68  ls..  */.  depth
310f0 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
31100 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20   i<pPage->nCell 
31110 26 26 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72  && pCheck->mxErr
31120 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
31130 70 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 73  pCell;.    int s
31140 7a 3b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20  z;.    CellInfo 
31150 69 6e 66 6f 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  info;..    /* Ch
31160 65 63 6b 20 70 61 79 6c 6f 61 64 20 6f 76 65 72  eck payload over
31170 66 6c 6f 77 20 70 61 67 65 73 0a 20 20 20 20 2a  flow pages.    *
31180 2f 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 43  /.    sprintf(zC
31190 6f 6e 74 65 78 74 2c 20 22 4f 6e 20 74 72 65 65  ontext, "On tree
311a0 20 70 61 67 65 20 25 64 20 63 65 6c 6c 20 25 64   page %d cell %d
311b0 3a 20 22 2c 20 69 50 61 67 65 2c 20 69 29 3b 0a  : ", iPage, i);.
311c0 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
311d0 43 65 6c 6c 28 70 50 61 67 65 2c 69 29 3b 0a 20  Cell(pPage,i);. 
311e0 20 20 20 70 61 72 73 65 43 65 6c 6c 50 74 72 28     parseCellPtr(
311f0 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
31200 6e 66 6f 29 3b 0a 20 20 20 20 73 7a 20 3d 20 69  nfo);.    sz = i
31210 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20 69  nfo.nData;.    i
31220 66 28 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65  f( !pPage->intKe
31230 79 20 29 20 73 7a 20 2b 3d 20 69 6e 66 6f 2e 6e  y ) sz += info.n
31240 4b 65 79 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Key;.    assert(
31250 20 73 7a 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f   sz==info.nPaylo
31260 61 64 20 29 3b 0a 20 20 20 20 69 66 28 20 73 7a  ad );.    if( sz
31270 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
31280 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20        int nPage 
31290 3d 20 28 73 7a 20 2d 20 69 6e 66 6f 2e 6e 4c 6f  = (sz - info.nLo
312a0 63 61 6c 20 2b 20 75 73 61 62 6c 65 53 69 7a 65  cal + usableSize
312b0 20 2d 20 35 29 2f 28 75 73 61 62 6c 65 53 69 7a   - 5)/(usableSiz
312c0 65 20 2d 20 34 29 3b 0a 20 20 20 20 20 20 50 67  e - 4);.      Pg
312d0 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 67 65  no pgnoOvfl = ge
312e0 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
312f0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a  fo.iOverflow]);.
31300 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
31310 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
31320 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75       if( pBt->au
31330 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
31340 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28      checkPtrmap(
31350 70 43 68 65 63 6b 2c 20 70 67 6e 6f 4f 76 66 6c  pCheck, pgnoOvfl
31360 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
31370 57 31 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74  W1, iPage, zCont
31380 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  ext);.      }.#e
31390 6e 64 69 66 0a 20 20 20 20 20 20 63 68 65 63 6b  ndif.      check
313a0 4c 69 73 74 28 70 43 68 65 63 6b 2c 20 30 2c 20  List(pCheck, 0, 
313b0 70 67 6e 6f 4f 76 66 6c 2c 20 6e 50 61 67 65 2c  pgnoOvfl, nPage,
313c0 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   zContext);.    
313d0 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  }..    /* Check 
313e0 73 61 6e 69 74 79 20 6f 66 20 6c 65 66 74 20 63  sanity of left c
313f0 68 69 6c 64 20 70 61 67 65 2e 0a 20 20 20 20 2a  hild page..    *
31400 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  /.    if( !pPage
31410 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
31420 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
31430 70 43 65 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20  pCell);.#ifndef 
31440 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
31450 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28  VACUUM.      if(
31460 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
31470 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63   ){.        chec
31480 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20  kPtrmap(pCheck, 
31490 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  pgno, PTRMAP_BTR
314a0 45 45 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74  EE, iPage, zCont
314b0 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  ext);.      }.#e
314c0 6e 64 69 66 0a 20 20 20 20 20 20 64 32 20 3d 20  ndif.      d2 = 
314d0 63 68 65 63 6b 54 72 65 65 50 61 67 65 28 70 43  checkTreePage(pC
314e0 68 65 63 6b 2c 70 67 6e 6f 2c 70 50 61 67 65 2c  heck,pgno,pPage,
314f0 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  zContext);.     
31500 20 69 66 28 20 69 3e 30 20 26 26 20 64 32 21 3d   if( i>0 && d2!=
31510 64 65 70 74 68 20 29 7b 0a 20 20 20 20 20 20 20  depth ){.       
31520 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
31530 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
31540 2c 20 22 43 68 69 6c 64 20 70 61 67 65 20 64 65  , "Child page de
31550 70 74 68 20 64 69 66 66 65 72 73 22 29 3b 0a 20  pth differs");. 
31560 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 70       }.      dep
31570 74 68 20 3d 20 64 32 3b 0a 20 20 20 20 7d 0a 20  th = d2;.    }. 
31580 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d   }.  if( !pPage-
31590 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e  >leaf ){.    pgn
315a0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
315b0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
315c0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
315d0 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 43 6f  .    sprintf(zCo
315e0 6e 74 65 78 74 2c 20 22 4f 6e 20 70 61 67 65 20  ntext, "On page 
315f0 25 64 20 61 74 20 72 69 67 68 74 20 63 68 69 6c  %d at right chil
31600 64 3a 20 22 2c 20 69 50 61 67 65 29 3b 0a 23 69  d: ", iPage);.#i
31610 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
31620 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
31630 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
31640 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 63 68  cuum ){.      ch
31650 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b  eckPtrmap(pCheck
31660 2c 20 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  , pgno, PTRMAP_B
31670 54 52 45 45 2c 20 69 50 61 67 65 2c 20 30 29 3b  TREE, iPage, 0);
31680 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
31690 20 20 63 68 65 63 6b 54 72 65 65 50 61 67 65 28    checkTreePage(
316a0 70 43 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 70 50  pCheck, pgno, pP
316b0 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a  age, zContext);.
316c0 20 20 7d 0a 20 0a 20 20 2f 2a 20 43 68 65 63 6b    }. .  /* Check
316d0 20 66 6f 72 20 63 6f 6d 70 6c 65 74 65 20 63 6f   for complete co
316e0 76 65 72 61 67 65 20 6f 66 20 74 68 65 20 70 61  verage of the pa
316f0 67 65 0a 20 20 2a 2f 0a 20 20 64 61 74 61 20 3d  ge.  */.  data =
31700 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
31710 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
31720 72 4f 66 66 73 65 74 3b 0a 20 20 68 69 74 20 3d  rOffset;.  hit =
31730 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 75   sqliteMalloc( u
31740 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69  sableSize );.  i
31750 66 28 20 68 69 74 20 29 7b 0a 20 20 20 20 6d 65  f( hit ){.    me
31760 6d 73 65 74 28 68 69 74 2c 20 31 2c 20 67 65 74  mset(hit, 1, get
31770 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
31780 35 5d 29 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20  5]));.    nCell 
31790 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
317a0 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20 63 65  [hdr+3]);.    ce
317b0 6c 6c 53 74 61 72 74 20 3d 20 68 64 72 20 2b 20  llStart = hdr + 
317c0 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65  12 - 4*pPage->le
317d0 61 66 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  af;.    for(i=0;
317e0 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
317f0 20 20 20 20 20 20 69 6e 74 20 70 63 20 3d 20 67        int pc = g
31800 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 63 65  et2byte(&data[ce
31810 6c 6c 53 74 61 72 74 2b 69 2a 32 5d 29 3b 0a 20  llStart+i*2]);. 
31820 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20       int size = 
31830 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
31840 65 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20  e, &data[pc]);. 
31850 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
31860 20 20 69 66 28 20 28 70 63 2b 73 69 7a 65 2d 31    if( (pc+size-1
31870 29 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c  )>=usableSize ||
31880 20 70 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20   pc<0 ){.       
31890 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
318a0 70 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20  pCheck, 0, .    
318b0 20 20 20 20 20 20 20 20 22 43 6f 72 72 75 70 74          "Corrupt
318c0 69 6f 6e 20 64 65 74 65 63 74 65 64 20 69 6e 20  ion detected in 
318d0 63 65 6c 6c 20 25 64 20 6f 6e 20 70 61 67 65 20  cell %d on page 
318e0 25 64 22 2c 69 2c 69 50 61 67 65 2c 30 29 3b 0a  %d",i,iPage,0);.
318f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
31900 20 20 20 20 20 66 6f 72 28 6a 3d 70 63 2b 73 69       for(j=pc+si
31910 7a 65 2d 31 3b 20 6a 3e 3d 70 63 3b 20 6a 2d 2d  ze-1; j>=pc; j--
31920 29 20 68 69 74 5b 6a 5d 2b 2b 3b 0a 20 20 20 20  ) hit[j]++;.    
31930 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f    }.    }.    fo
31940 72 28 63 6e 74 3d 30 2c 20 69 3d 67 65 74 32 62  r(cnt=0, i=get2b
31950 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  yte(&data[hdr+1]
31960 29 3b 20 69 3e 30 20 26 26 20 69 3c 75 73 61 62  ); i>0 && i<usab
31970 6c 65 53 69 7a 65 20 26 26 20 63 6e 74 3c 31 30  leSize && cnt<10
31980 30 30 30 3b 20 0a 20 20 20 20 20 20 20 20 20 20  000; .          
31990 20 63 6e 74 2b 2b 29 7b 0a 20 20 20 20 20 20 69   cnt++){.      i
319a0 6e 74 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79  nt size = get2by
319b0 74 65 28 26 64 61 74 61 5b 69 2b 32 5d 29 3b 0a  te(&data[i+2]);.
319c0 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
319d0 20 20 20 69 66 28 20 28 69 2b 73 69 7a 65 2d 31     if( (i+size-1
319e0 29 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c  )>=usableSize ||
319f0 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20   i<0 ){.        
31a00 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
31a10 43 68 65 63 6b 2c 20 30 2c 20 20 0a 20 20 20 20  Check, 0,  .    
31a20 20 20 20 20 20 20 20 20 22 43 6f 72 72 75 70 74          "Corrupt
31a30 69 6f 6e 20 64 65 74 65 63 74 65 64 20 69 6e 20  ion detected in 
31a40 63 65 6c 6c 20 25 64 20 6f 6e 20 70 61 67 65 20  cell %d on page 
31a50 25 64 22 2c 69 2c 69 50 61 67 65 2c 30 29 3b 0a  %d",i,iPage,0);.
31a60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
31a70 20 20 20 20 20 66 6f 72 28 6a 3d 69 2b 73 69 7a       for(j=i+siz
31a80 65 2d 31 3b 20 6a 3e 3d 69 3b 20 6a 2d 2d 29 20  e-1; j>=i; j--) 
31a90 68 69 74 5b 6a 5d 2b 2b 3b 0a 20 20 20 20 20 20  hit[j]++;.      
31aa0 7d 0a 20 20 20 20 20 20 69 20 3d 20 67 65 74 32  }.      i = get2
31ab0 62 79 74 65 28 26 64 61 74 61 5b 69 5d 29 3b 0a  byte(&data[i]);.
31ac0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
31ad0 63 6e 74 3d 30 3b 20 69 3c 75 73 61 62 6c 65 53  cnt=0; i<usableS
31ae0 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ize; i++){.     
31af0 20 69 66 28 20 68 69 74 5b 69 5d 3d 3d 30 20 29   if( hit[i]==0 )
31b00 7b 0a 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b  {.        cnt++;
31b10 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
31b20 20 68 69 74 5b 69 5d 3e 31 20 29 7b 0a 20 20 20   hit[i]>1 ){.   
31b30 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64       checkAppend
31b40 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 0a 20  Msg(pCheck, 0,. 
31b50 20 20 20 20 20 20 20 20 20 22 4d 75 6c 74 69 70           "Multip
31b60 6c 65 20 75 73 65 73 20 66 6f 72 20 62 79 74 65  le uses for byte
31b70 20 25 64 20 6f 66 20 70 61 67 65 20 25 64 22 2c   %d of page %d",
31b80 20 69 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20   i, iPage);.    
31b90 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
31ba0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
31bb0 20 63 6e 74 21 3d 64 61 74 61 5b 68 64 72 2b 37   cnt!=data[hdr+7
31bc0 5d 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b  ] ){.      check
31bd0 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
31be0 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 0, .          
31bf0 22 46 72 61 67 6d 65 6e 74 65 64 20 73 70 61 63  "Fragmented spac
31c00 65 20 69 73 20 25 64 20 62 79 74 65 20 72 65 70  e is %d byte rep
31c10 6f 72 74 65 64 20 61 73 20 25 64 20 6f 6e 20 70  orted as %d on p
31c20 61 67 65 20 25 64 22 2c 0a 20 20 20 20 20 20 20  age %d",.       
31c30 20 20 20 63 6e 74 2c 20 64 61 74 61 5b 68 64 72     cnt, data[hdr
31c40 2b 37 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20  +7], iPage);.   
31c50 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46   }.  }.  sqliteF
31c60 72 65 65 28 68 69 74 29 3b 0a 0a 20 20 72 65 6c  ree(hit);..  rel
31c70 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
31c80 0a 20 20 72 65 74 75 72 6e 20 64 65 70 74 68 2b  .  return depth+
31c90 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  1;.}.#endif /* S
31ca0 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
31cb0 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23  RITY_CHECK */..#
31cc0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
31cd0 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
31ce0 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  CK./*.** This ro
31cf0 75 74 69 6e 65 20 64 6f 65 73 20 61 20 63 6f 6d  utine does a com
31d00 70 6c 65 74 65 20 63 68 65 63 6b 20 6f 66 20 74  plete check of t
31d10 68 65 20 67 69 76 65 6e 20 42 54 72 65 65 20 66  he given BTree f
31d20 69 6c 65 2e 20 20 61 52 6f 6f 74 5b 5d 20 69 73  ile.  aRoot[] is
31d30 0a 2a 2a 20 61 6e 20 61 72 72 61 79 20 6f 66 20  .** an array of 
31d40 70 61 67 65 73 20 6e 75 6d 62 65 72 73 20 77 65  pages numbers we
31d50 72 65 20 65 61 63 68 20 70 61 67 65 20 6e 75 6d  re each page num
31d60 62 65 72 20 69 73 20 74 68 65 20 72 6f 6f 74 20  ber is the root 
31d70 70 61 67 65 20 6f 66 0a 2a 2a 20 61 20 74 61 62  page of.** a tab
31d80 6c 65 2e 20 20 6e 52 6f 6f 74 20 69 73 20 74 68  le.  nRoot is th
31d90 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
31da0 69 65 73 20 69 6e 20 61 52 6f 6f 74 2e 0a 2a 2a  ies in aRoot..**
31db0 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e  .** If everythin
31dc0 67 20 63 68 65 63 6b 73 20 6f 75 74 2c 20 74 68  g checks out, th
31dd0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
31de0 6e 73 20 4e 55 4c 4c 2e 20 20 49 66 20 73 6f 6d  ns NULL.  If som
31df0 65 74 68 69 6e 67 20 69 73 0a 2a 2a 20 61 6d 69  ething is.** ami
31e00 73 73 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ss, an error mes
31e10 73 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  sage is written 
31e20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61  into memory obta
31e30 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
31e40 28 29 0a 2a 2a 20 61 6e 64 20 61 20 70 6f 69 6e  ().** and a poin
31e50 74 65 72 20 74 6f 20 74 68 61 74 20 65 72 72 6f  ter to that erro
31e60 72 20 6d 65 73 73 61 67 65 20 69 73 20 72 65 74  r message is ret
31e70 75 72 6e 65 64 2e 20 20 54 68 65 20 63 61 6c 6c  urned.  The call
31e80 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ing function.** 
31e90 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
31ea0 6f 72 20 66 72 65 65 69 6e 67 20 74 68 65 20 65  or freeing the e
31eb0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 68 65  rror message whe
31ec0 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2f  n it is done..*/
31ed0 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74  .char *sqlite3Bt
31ee0 72 65 65 49 6e 74 65 67 72 69 74 79 43 68 65 63  reeIntegrityChec
31ef0 6b 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  k(.  Btree *p,  
31f00 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
31f10 74 6f 20 62 65 20 63 68 65 63 6b 65 64 20 2a 2f  to be checked */
31f20 0a 20 20 69 6e 74 20 2a 61 52 6f 6f 74 2c 20 20  .  int *aRoot,  
31f30 20 2f 2a 20 41 6e 20 61 72 72 61 79 20 6f 66 20   /* An array of 
31f40 72 6f 6f 74 20 70 61 67 65 73 20 6e 75 6d 62 65  root pages numbe
31f50 72 73 20 66 6f 72 20 69 6e 64 69 76 69 64 75 61  rs for individua
31f60 6c 20 74 72 65 65 73 20 2a 2f 0a 20 20 69 6e 74  l trees */.  int
31f70 20 6e 52 6f 6f 74 2c 20 20 20 20 2f 2a 20 4e 75   nRoot,    /* Nu
31f80 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
31f90 69 6e 20 61 52 6f 6f 74 5b 5d 20 2a 2f 0a 20 20  in aRoot[] */.  
31fa0 69 6e 74 20 6d 78 45 72 72 2c 20 20 20 20 2f 2a  int mxErr,    /*
31fb0 20 53 74 6f 70 20 72 65 70 6f 72 74 69 6e 67 20   Stop reporting 
31fc0 65 72 72 6f 72 73 20 61 66 74 65 72 20 74 68 69  errors after thi
31fd0 73 20 6d 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20  s many */.  int 
31fe0 2a 70 6e 45 72 72 20 20 20 20 2f 2a 20 57 72 69  *pnErr    /* Wri
31ff0 74 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  te number of err
32000 6f 72 73 20 73 65 65 6e 20 74 6f 20 74 68 69 73  ors seen to this
32010 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 29 7b 0a   variable */.){.
32020 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
32030 52 65 66 3b 0a 20 20 49 6e 74 65 67 72 69 74 79  Ref;.  Integrity
32040 43 6b 20 73 43 68 65 63 6b 3b 0a 20 20 42 74 53  Ck sCheck;.  BtS
32050 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
32060 70 42 74 3b 0a 0a 20 20 6e 52 65 66 20 3d 20 73  pBt;..  nRef = s
32070 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
32080 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
32090 3b 0a 20 20 69 66 28 20 6c 6f 63 6b 42 74 72 65  ;.  if( lockBtre
320a0 65 57 69 74 68 52 65 74 72 79 28 70 29 21 3d 53  eWithRetry(p)!=S
320b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
320c0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 53 74 72  return sqliteStr
320d0 44 75 70 28 22 55 6e 61 62 6c 65 20 74 6f 20 61  Dup("Unable to a
320e0 63 71 75 69 72 65 20 61 20 72 65 61 64 20 6c 6f  cquire a read lo
320f0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
32100 73 65 22 29 3b 0a 20 20 7d 0a 20 20 73 43 68 65  se");.  }.  sChe
32110 63 6b 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  ck.pBt = pBt;.  
32120 73 43 68 65 63 6b 2e 70 50 61 67 65 72 20 3d 20  sCheck.pPager = 
32130 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 73  pBt->pPager;.  s
32140 43 68 65 63 6b 2e 6e 50 61 67 65 20 3d 20 73 71  Check.nPage = sq
32150 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
32160 75 6e 74 28 73 43 68 65 63 6b 2e 70 50 61 67 65  unt(sCheck.pPage
32170 72 29 3b 0a 20 20 73 43 68 65 63 6b 2e 6d 78 45  r);.  sCheck.mxE
32180 72 72 20 3d 20 6d 78 45 72 72 3b 0a 20 20 73 43  rr = mxErr;.  sC
32190 68 65 63 6b 2e 6e 45 72 72 20 3d 20 30 3b 0a 20  heck.nErr = 0;. 
321a0 20 2a 70 6e 45 72 72 20 3d 20 30 3b 0a 20 20 69   *pnErr = 0;.  i
321b0 66 28 20 73 43 68 65 63 6b 2e 6e 50 61 67 65 3d  f( sCheck.nPage=
321c0 3d 30 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b  =0 ){.    unlock
321d0 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
321e0 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  t);.    return 0
321f0 3b 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b 2e 61  ;.  }.  sCheck.a
32200 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 4d 61 6c  nRef = sqliteMal
32210 6c 6f 63 52 61 77 28 20 28 73 43 68 65 63 6b 2e  locRaw( (sCheck.
32220 6e 50 61 67 65 2b 31 29 2a 73 69 7a 65 6f 66 28  nPage+1)*sizeof(
32230 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 30 5d 29  sCheck.anRef[0])
32240 20 29 3b 0a 20 20 69 66 28 20 21 73 43 68 65 63   );.  if( !sChec
32250 6b 2e 61 6e 52 65 66 20 29 7b 0a 20 20 20 20 75  k.anRef ){.    u
32260 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
32270 65 64 28 70 42 74 29 3b 0a 20 20 20 20 2a 70 6e  ed(pBt);.    *pn
32280 45 72 72 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Err = 1;.    ret
32290 75 72 6e 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  urn sqlite3MPrin
322a0 74 66 28 22 55 6e 61 62 6c 65 20 74 6f 20 6d 61  tf("Unable to ma
322b0 6c 6c 6f 63 20 25 64 20 62 79 74 65 73 22 2c 20  lloc %d bytes", 
322c0 0a 20 20 20 20 20 20 20 20 28 73 43 68 65 63 6b  .        (sCheck
322d0 2e 6e 50 61 67 65 2b 31 29 2a 73 69 7a 65 6f 66  .nPage+1)*sizeof
322e0 28 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 30 5d  (sCheck.anRef[0]
322f0 29 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  ));.  }.  for(i=
32300 30 3b 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50 61  0; i<=sCheck.nPa
32310 67 65 3b 20 69 2b 2b 29 7b 20 73 43 68 65 63 6b  ge; i++){ sCheck
32320 2e 61 6e 52 65 66 5b 69 5d 20 3d 20 30 3b 20 7d  .anRef[i] = 0; }
32330 0a 20 20 69 20 3d 20 50 45 4e 44 49 4e 47 5f 42  .  i = PENDING_B
32340 59 54 45 5f 50 41 47 45 28 70 42 74 29 3b 0a 20  YTE_PAGE(pBt);. 
32350 20 69 66 28 20 69 3c 3d 73 43 68 65 63 6b 2e 6e   if( i<=sCheck.n
32360 50 61 67 65 20 29 7b 0a 20 20 20 20 73 43 68 65  Page ){.    sChe
32370 63 6b 2e 61 6e 52 65 66 5b 69 5d 20 3d 20 31 3b  ck.anRef[i] = 1;
32380 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b 2e 7a 45  .  }.  sCheck.zE
32390 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a  rrMsg = 0;..  /*
323a0 20 43 68 65 63 6b 20 74 68 65 20 69 6e 74 65 67   Check the integ
323b0 72 69 74 79 20 6f 66 20 74 68 65 20 66 72 65 65  rity of the free
323c0 6c 69 73 74 0a 20 20 2a 2f 0a 20 20 63 68 65 63  list.  */.  chec
323d0 6b 4c 69 73 74 28 26 73 43 68 65 63 6b 2c 20 31  kList(&sCheck, 1
323e0 2c 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d  , get4byte(&pBt-
323f0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
32400 32 5d 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  2]),.           
32410 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
32420 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
32430 5d 29 2c 20 22 4d 61 69 6e 20 66 72 65 65 6c 69  ]), "Main freeli
32440 73 74 3a 20 22 29 3b 0a 0a 20 20 2f 2a 20 43 68  st: ");..  /* Ch
32450 65 63 6b 20 61 6c 6c 20 74 68 65 20 74 61 62 6c  eck all the tabl
32460 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  es..  */.  for(i
32470 3d 30 3b 20 69 3c 6e 52 6f 6f 74 20 26 26 20 73  =0; i<nRoot && s
32480 43 68 65 63 6b 2e 6d 78 45 72 72 3b 20 69 2b 2b  Check.mxErr; i++
32490 29 7b 0a 20 20 20 20 69 66 28 20 61 52 6f 6f 74  ){.    if( aRoot
324a0 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  [i]==0 ) continu
324b0 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e;.#ifndef SQLIT
324c0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
324d0 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  M.    if( pBt->a
324e0 75 74 6f 56 61 63 75 75 6d 20 26 26 20 61 52 6f  utoVacuum && aRo
324f0 6f 74 5b 69 5d 3e 31 20 29 7b 0a 20 20 20 20 20  ot[i]>1 ){.     
32500 20 63 68 65 63 6b 50 74 72 6d 61 70 28 26 73 43   checkPtrmap(&sC
32510 68 65 63 6b 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20  heck, aRoot[i], 
32520 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c  PTRMAP_ROOTPAGE,
32530 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65   0, 0);.    }.#e
32540 6e 64 69 66 0a 20 20 20 20 63 68 65 63 6b 54 72  ndif.    checkTr
32550 65 65 50 61 67 65 28 26 73 43 68 65 63 6b 2c 20  eePage(&sCheck, 
32560 61 52 6f 6f 74 5b 69 5d 2c 20 30 2c 20 22 4c 69  aRoot[i], 0, "Li
32570 73 74 20 6f 66 20 74 72 65 65 20 72 6f 6f 74 73  st of tree roots
32580 3a 20 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  : ");.  }..  /* 
32590 4d 61 6b 65 20 73 75 72 65 20 65 76 65 72 79 20  Make sure every 
325a0 70 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65  page in the file
325b0 20 69 73 20 72 65 66 65 72 65 6e 63 65 64 0a 20   is referenced. 
325c0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69   */.  for(i=1; i
325d0 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65 20 26  <=sCheck.nPage &
325e0 26 20 73 43 68 65 63 6b 2e 6d 78 45 72 72 3b 20  & sCheck.mxErr; 
325f0 69 2b 2b 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  i++){.#ifdef SQL
32600 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
32610 55 55 4d 0a 20 20 20 20 69 66 28 20 73 43 68 65  UUM.    if( sChe
32620 63 6b 2e 61 6e 52 65 66 5b 69 5d 3d 3d 30 20 29  ck.anRef[i]==0 )
32630 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70  {.      checkApp
32640 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20  endMsg(&sCheck, 
32650 30 2c 20 22 50 61 67 65 20 25 64 20 69 73 20 6e  0, "Page %d is n
32660 65 76 65 72 20 75 73 65 64 22 2c 20 69 29 3b 0a  ever used", i);.
32670 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
32680 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
32690 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f  se supports auto
326a0 2d 76 61 63 75 75 6d 2c 20 6d 61 6b 65 20 73 75  -vacuum, make su
326b0 72 65 20 6e 6f 20 74 61 62 6c 65 73 20 63 6f 6e  re no tables con
326c0 74 61 69 6e 0a 20 20 20 20 2a 2a 20 72 65 66 65  tain.    ** refe
326d0 72 65 6e 63 65 73 20 74 6f 20 70 6f 69 6e 74 65  rences to pointe
326e0 72 2d 6d 61 70 20 70 61 67 65 73 2e 0a 20 20 20  r-map pages..   
326f0 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 43 68 65   */.    if( sChe
32700 63 6b 2e 61 6e 52 65 66 5b 69 5d 3d 3d 30 20 26  ck.anRef[i]==0 &
32710 26 20 0a 20 20 20 20 20 20 20 28 50 54 52 4d 41  & .       (PTRMA
32720 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 69 29  P_PAGENO(pBt, i)
32730 21 3d 69 20 7c 7c 20 21 70 42 74 2d 3e 61 75 74  !=i || !pBt->aut
32740 6f 56 61 63 75 75 6d 29 20 29 7b 0a 20 20 20 20  oVacuum) ){.    
32750 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
32760 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 22 50 61  (&sCheck, 0, "Pa
32770 67 65 20 25 64 20 69 73 20 6e 65 76 65 72 20 75  ge %d is never u
32780 73 65 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d 0a  sed", i);.    }.
32790 20 20 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61      if( sCheck.a
327a0 6e 52 65 66 5b 69 5d 21 3d 30 20 26 26 20 0a 20  nRef[i]!=0 && . 
327b0 20 20 20 20 20 20 28 50 54 52 4d 41 50 5f 50 41        (PTRMAP_PA
327c0 47 45 4e 4f 28 70 42 74 2c 20 69 29 3d 3d 69 20  GENO(pBt, i)==i 
327d0 26 26 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  && pBt->autoVacu
327e0 75 6d 29 20 29 7b 0a 20 20 20 20 20 20 63 68 65  um) ){.      che
327f0 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68  ckAppendMsg(&sCh
32800 65 63 6b 2c 20 30 2c 20 22 50 6f 69 6e 74 65 72  eck, 0, "Pointer
32810 20 6d 61 70 20 70 61 67 65 20 25 64 20 69 73 20   map page %d is 
32820 72 65 66 65 72 65 6e 63 65 64 22 2c 20 69 29 3b  referenced", i);
32830 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
32840 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
32850 65 20 74 68 69 73 20 61 6e 61 6c 79 73 69 73 20  e this analysis 
32860 64 69 64 20 6e 6f 74 20 6c 65 61 76 65 20 61 6e  did not leave an
32870 79 20 75 6e 72 65 66 28 29 20 70 61 67 65 73 0a  y unref() pages.
32880 20 20 2a 2f 0a 20 20 75 6e 6c 6f 63 6b 42 74 72    */.  unlockBtr
32890 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
328a0 0a 20 20 69 66 28 20 6e 52 65 66 20 21 3d 20 73  .  if( nRef != s
328b0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
328c0 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
328d0 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70   ){.    checkApp
328e0 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20  endMsg(&sCheck, 
328f0 30 2c 20 0a 20 20 20 20 20 20 22 4f 75 74 73 74  0, .      "Outst
32900 61 6e 64 69 6e 67 20 70 61 67 65 20 63 6f 75 6e  anding page coun
32910 74 20 67 6f 65 73 20 66 72 6f 6d 20 25 64 20 74  t goes from %d t
32920 6f 20 25 64 20 64 75 72 69 6e 67 20 74 68 69 73  o %d during this
32930 20 61 6e 61 6c 79 73 69 73 22 2c 0a 20 20 20 20   analysis",.    
32940 20 20 6e 52 65 66 2c 20 73 71 6c 69 74 65 33 50    nRef, sqlite3P
32950 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74  agerRefcount(pBt
32960 2d 3e 70 50 61 67 65 72 29 0a 20 20 20 20 29 3b  ->pPager).    );
32970 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e  .  }..  /* Clean
32980 20 20 75 70 20 61 6e 64 20 72 65 70 6f 72 74 20    up and report 
32990 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 73  errors..  */.  s
329a0 71 6c 69 74 65 46 72 65 65 28 73 43 68 65 63 6b  qliteFree(sCheck
329b0 2e 61 6e 52 65 66 29 3b 0a 20 20 2a 70 6e 45 72  .anRef);.  *pnEr
329c0 72 20 3d 20 73 43 68 65 63 6b 2e 6e 45 72 72 3b  r = sCheck.nErr;
329d0 0a 20 20 72 65 74 75 72 6e 20 73 43 68 65 63 6b  .  return sCheck
329e0 2e 7a 45 72 72 4d 73 67 3b 0a 7d 0a 23 65 6e 64  .zErrMsg;.}.#end
329f0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
32a00 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
32a10 4b 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K */../*.** Retu
32a20 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  rn the full path
32a30 6e 61 6d 65 20 6f 66 20 74 68 65 20 75 6e 64 65  name of the unde
32a40 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
32a50 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  file..*/.const c
32a60 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65  har *sqlite3Btre
32a70 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 42 74 72  eGetFilename(Btr
32a80 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  ee *p){.  assert
32a90 28 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  ( p->pBt->pPager
32aa0 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
32ab0 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
32ac0 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61  name(p->pBt->pPa
32ad0 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ger);.}../*.** R
32ae0 65 74 75 72 6e 20 74 68 65 20 70 61 74 68 6e 61  eturn the pathna
32af0 6d 65 20 6f 66 20 74 68 65 20 64 69 72 65 63 74  me of the direct
32b00 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ory that contain
32b10 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
32b20 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ile..*/.const ch
32b30 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  ar *sqlite3Btree
32b40 47 65 74 44 69 72 6e 61 6d 65 28 42 74 72 65 65  GetDirname(Btree
32b50 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
32b60 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 21 3d  p->pBt->pPager!=
32b70 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  0 );.  return sq
32b80 6c 69 74 65 33 50 61 67 65 72 44 69 72 6e 61 6d  lite3PagerDirnam
32b90 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  e(p->pBt->pPager
32ba0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
32bb0 72 6e 20 74 68 65 20 70 61 74 68 6e 61 6d 65 20  rn the pathname 
32bc0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
32bd0 69 6c 65 20 66 6f 72 20 74 68 69 73 20 64 61 74  ile for this dat
32be0 61 62 61 73 65 2e 20 54 68 65 20 72 65 74 75 72  abase. The retur
32bf0 6e 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68  n.** value of th
32c00 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
32c10 65 20 73 61 6d 65 20 72 65 67 61 72 64 6c 65 73  e same regardles
32c20 73 20 6f 66 20 77 68 65 74 68 65 72 20 74 68 65  s of whether the
32c30 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
32c40 20 68 61 73 20 62 65 65 6e 20 63 72 65 61 74 65   has been create
32c50 64 20 6f 72 20 6e 6f 74 2e 0a 2a 2f 0a 63 6f 6e  d or not..*/.con
32c60 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
32c70 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e  BtreeGetJournaln
32c80 61 6d 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ame(Btree *p){. 
32c90 20 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74 2d   assert( p->pBt-
32ca0 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20  >pPager!=0 );.  
32cb0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 61  return sqlite3Pa
32cc0 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70  gerJournalname(p
32cd0 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  ->pBt->pPager);.
32ce0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
32cf0 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 2f 2a  E_OMIT_VACUUM./*
32d00 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 63 6f 6d  .** Copy the com
32d10 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66  plete content of
32d20 20 70 42 74 46 72 6f 6d 20 69 6e 74 6f 20 70 42   pBtFrom into pB
32d30 74 54 6f 2e 20 20 41 20 74 72 61 6e 73 61 63 74  tTo.  A transact
32d40 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 62 65 20 61  ion.** must be a
32d50 63 74 69 76 65 20 66 6f 72 20 62 6f 74 68 20 66  ctive for both f
32d60 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iles..**.** The 
32d70 73 69 7a 65 20 6f 66 20 66 69 6c 65 20 70 42 74  size of file pBt
32d80 46 72 6f 6d 20 6d 61 79 20 62 65 20 72 65 64 75  From may be redu
32d90 63 65 64 20 62 79 20 74 68 69 73 20 6f 70 65 72  ced by this oper
32da0 61 74 69 6f 6e 2e 0a 2a 2a 20 49 66 20 61 6e 79  ation..** If any
32db0 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
32dc0 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  , the transactio
32dd0 6e 20 6f 6e 20 70 42 74 46 72 6f 6d 20 69 73 20  n on pBtFrom is 
32de0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a  rolled back..*/.
32df0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
32e00 43 6f 70 79 46 69 6c 65 28 42 74 72 65 65 20 2a  CopyFile(Btree *
32e10 70 54 6f 2c 20 42 74 72 65 65 20 2a 70 46 72 6f  pTo, Btree *pFro
32e20 6d 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  m){.  int rc = S
32e30 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 6e 6f  QLITE_OK;.  Pgno
32e40 20 69 2c 20 6e 50 61 67 65 2c 20 6e 54 6f 50 61   i, nPage, nToPa
32e50 67 65 2c 20 69 53 6b 69 70 3b 0a 0a 20 20 42 74  ge, iSkip;..  Bt
32e60 53 68 61 72 65 64 20 2a 70 42 74 54 6f 20 3d 20  Shared *pBtTo = 
32e70 70 54 6f 2d 3e 70 42 74 3b 0a 20 20 42 74 53 68  pTo->pBt;.  BtSh
32e80 61 72 65 64 20 2a 70 42 74 46 72 6f 6d 20 3d 20  ared *pBtFrom = 
32e90 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 0a 20 20 69  pFrom->pBt;..  i
32ea0 66 28 20 70 54 6f 2d 3e 69 6e 54 72 61 6e 73 21  f( pTo->inTrans!
32eb0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20  =TRANS_WRITE || 
32ec0 70 46 72 6f 6d 2d 3e 69 6e 54 72 61 6e 73 21 3d  pFrom->inTrans!=
32ed0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
32ee0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
32ef0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
32f00 28 20 70 42 74 54 6f 2d 3e 70 43 75 72 73 6f 72  ( pBtTo->pCursor
32f10 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
32f20 5f 42 55 53 59 3b 0a 20 20 6e 54 6f 50 61 67 65  _BUSY;.  nToPage
32f30 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
32f40 61 67 65 63 6f 75 6e 74 28 70 42 74 54 6f 2d 3e  agecount(pBtTo->
32f50 70 50 61 67 65 72 29 3b 0a 20 20 6e 50 61 67 65  pPager);.  nPage
32f60 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
32f70 61 67 65 63 6f 75 6e 74 28 70 42 74 46 72 6f 6d  agecount(pBtFrom
32f80 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 53 6b  ->pPager);.  iSk
32f90 69 70 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54  ip = PENDING_BYT
32fa0 45 5f 50 41 47 45 28 70 42 74 54 6f 29 3b 0a 20  E_PAGE(pBtTo);. 
32fb0 20 66 6f 72 28 69 3d 31 3b 20 72 63 3d 3d 53 51   for(i=1; rc==SQ
32fc0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 3d 6e 50  LITE_OK && i<=nP
32fd0 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44  age; i++){.    D
32fe0 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
32ff0 20 20 20 20 69 66 28 20 69 3d 3d 69 53 6b 69 70      if( i==iSkip
33000 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
33010 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
33020 65 72 47 65 74 28 70 42 74 46 72 6f 6d 2d 3e 70  erGet(pBtFrom->p
33030 50 61 67 65 72 2c 20 69 2c 20 26 70 44 62 50 61  Pager, i, &pDbPa
33040 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
33050 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 72 63 20  ) break;.    rc 
33060 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 76  = sqlite3PagerOv
33070 65 72 77 72 69 74 65 28 70 42 74 54 6f 2d 3e 70  erwrite(pBtTo->p
33080 50 61 67 65 72 2c 20 69 2c 20 73 71 6c 69 74 65  Pager, i, sqlite
33090 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
330a0 62 50 61 67 65 29 29 3b 0a 20 20 20 20 73 71 6c  bPage));.    sql
330b0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
330c0 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 66  DbPage);.  }.  f
330d0 6f 72 28 69 3d 6e 50 61 67 65 2b 31 3b 20 72 63  or(i=nPage+1; rc
330e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
330f0 3c 3d 6e 54 6f 50 61 67 65 3b 20 69 2b 2b 29 7b  <=nToPage; i++){
33100 0a 20 20 20 20 44 62 50 61 67 65 20 2a 70 44 62  .    DbPage *pDb
33110 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20 69 3d  Page;.    if( i=
33120 3d 69 53 6b 69 70 20 29 20 63 6f 6e 74 69 6e 75  =iSkip ) continu
33130 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e;.    rc = sqli
33140 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 54  te3PagerGet(pBtT
33150 6f 2d 3e 70 50 61 67 65 72 2c 20 69 2c 20 26 70  o->pPager, i, &p
33160 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
33170 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20   rc ) break;.   
33180 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
33190 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29  erWrite(pDbPage)
331a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
331b0 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
331c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
331d0 65 72 44 6f 6e 74 57 72 69 74 65 28 70 42 74 54  erDontWrite(pBtT
331e0 6f 2d 3e 70 50 61 67 65 72 2c 20 69 29 3b 0a 20  o->pPager, i);. 
331f0 20 7d 0a 20 20 69 66 28 20 21 72 63 20 26 26 20   }.  if( !rc && 
33200 6e 50 61 67 65 3c 6e 54 6f 50 61 67 65 20 29 7b  nPage<nToPage ){
33210 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
33220 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 70  3PagerTruncate(p
33230 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20 6e 50  BtTo->pPager, nP
33240 61 67 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  age);.  }.  if( 
33250 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rc ){.    sqlite
33260 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70  3BtreeRollback(p
33270 54 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  To);.  }.  retur
33280 6e 20 72 63 3b 20 20 0a 7d 0a 23 65 6e 64 69 66  n rc;  .}.#endif
33290 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
332a0 56 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  VACUUM */../*.**
332b0 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
332c0 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   if a transactio
332d0 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2f 0a  n is active..*/.
332e0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
332f0 49 73 49 6e 54 72 61 6e 73 28 42 74 72 65 65 20  IsInTrans(Btree 
33300 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70  *p){.  return (p
33310 20 26 26 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d   && (p->inTrans=
33320 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 29 3b 0a  =TRANS_WRITE));.
33330 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
33340 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 61 20 73 74  non-zero if a st
33350 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
33360 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
33370 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
33380 65 65 49 73 49 6e 53 74 6d 74 28 42 74 72 65 65  eeIsInStmt(Btree
33390 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 28   *p){.  return (
333a0 70 2d 3e 70 42 74 20 26 26 20 70 2d 3e 70 42 74  p->pBt && p->pBt
333b0 2d 3e 69 6e 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a  ->inStmt);.}../*
333c0 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  .** Return non-z
333d0 65 72 6f 20 69 66 20 61 20 72 65 61 64 20 28 6f  ero if a read (o
333e0 72 20 77 72 69 74 65 29 20 74 72 61 6e 73 61 63  r write) transac
333f0 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
33400 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
33410 72 65 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73  reeIsInReadTrans
33420 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65  (Btree *p){.  re
33430 74 75 72 6e 20 28 70 20 26 26 20 28 70 2d 3e 69  turn (p && (p->i
33440 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f  nTrans!=TRANS_NO
33450 4e 45 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  NE));.}../*.** T
33460 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f  his call is a no
33470 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d  -op if no write-
33480 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
33490 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20  urrently active 
334a0 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74  on pBt..**.** Ot
334b0 68 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68  herwise, sync th
334c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
334d0 66 6f 72 20 74 68 65 20 62 74 72 65 65 20 70 42  for the btree pB
334e0 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74  t. zMaster point
334f0 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65  s to.** the name
33500 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
33510 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73  rnal file that s
33520 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e  hould be written
33530 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64   into the.** ind
33540 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20  ividual journal 
33550 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c  file, or is NULL
33560 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20  , indicating no 
33570 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
33580 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20  ile .** (single 
33590 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
335a0 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  tion)..**.** Whe
335b0 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
335c0 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  , the master jou
335d0 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65  rnal should alre
335e0 61 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a  ady have been.**
335f0 20 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61   created, popula
33600 74 65 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f  ted with this jo
33610 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e  urnal pointer an
33620 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  d synced to disk
33630 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69  ..**.** Once thi
33640 73 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  s is routine has
33650 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f   returned, the o
33660 6e 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69 72  nly thing requir
33670 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20  ed to commit.** 
33680 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  the write-transa
33690 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64  ction for this d
336a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
336b0 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  to delete the jo
336c0 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urnal..*/.int sq
336d0 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 28 42  lite3BtreeSync(B
336e0 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  tree *p, const c
336f0 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
33700 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
33710 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e  _OK;.  if( p->in
33720 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
33730 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72  TE ){.    BtShar
33740 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
33750 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 54 72 75 6e  ;.    Pgno nTrun
33760 63 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  c = 0;.#ifndef S
33770 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
33780 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
33790 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
337a0 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f  .      rc = auto
337b0 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74  VacuumCommit(pBt
337c0 2c 20 26 6e 54 72 75 6e 63 29 3b 20 0a 20 20 20  , &nTrunc); .   
337d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
337e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
337f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
33800 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
33810 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
33820 50 61 67 65 72 53 79 6e 63 28 70 42 74 2d 3e 70  PagerSync(pBt->p
33830 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20  Pager, zMaster, 
33840 6e 54 72 75 6e 63 29 3b 0a 20 20 7d 0a 20 20 72  nTrunc);.  }.  r
33850 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
33860 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
33870 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
33880 65 72 20 74 6f 20 61 20 62 6c 6f 62 20 6f 66 20  er to a blob of 
33890 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
338a0 64 20 77 69 74 68 0a 2a 2a 20 61 20 73 69 6e 67  d with.** a sing
338b0 6c 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e  le shared-btree.
338c0 20 54 68 65 20 6d 65 6d 6f 72 79 20 69 73 20 75   The memory is u
338d0 73 65 64 20 62 79 20 63 6c 69 65 6e 74 20 63 6f  sed by client co
338e0 64 65 20 66 6f 72 20 69 74 27 73 20 6f 77 6e 0a  de for it's own.
338f0 2a 2a 20 70 75 72 70 6f 73 65 73 20 28 66 6f 72  ** purposes (for
33900 20 65 78 61 6d 70 6c 65 2c 20 74 6f 20 73 74 6f   example, to sto
33910 72 65 20 61 20 68 69 67 68 2d 6c 65 76 65 6c 20  re a high-level 
33920 73 63 68 65 6d 61 20 61 73 73 6f 63 69 61 74 65  schema associate
33930 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20 73  d with .** the s
33940 68 61 72 65 64 2d 62 74 72 65 65 29 2e 20 54 68  hared-btree). Th
33950 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 6d 61  e btree layer ma
33960 6e 61 67 65 73 20 72 65 66 65 72 65 6e 63 65 20  nages reference 
33970 63 6f 75 6e 74 69 6e 67 20 69 73 73 75 65 73 2e  counting issues.
33980 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
33990 20 74 69 6d 65 20 74 68 69 73 20 69 73 20 63 61   time this is ca
339a0 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72 65 64  lled on a shared
339b0 2d 62 74 72 65 65 2c 20 6e 42 79 74 65 73 20 62  -btree, nBytes b
339c0 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a  ytes of memory.*
339d0 2a 20 61 72 65 20 61 6c 6c 6f 63 61 74 65 64 2c  * are allocated,
339e0 20 7a 65 72 6f 65 64 2c 20 61 6e 64 20 72 65 74   zeroed, and ret
339f0 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
33a00 6c 65 72 2e 20 46 6f 72 20 65 61 63 68 20 73 75  ler. For each su
33a10 62 73 65 71 75 65 6e 74 20 0a 2a 2a 20 63 61 6c  bsequent .** cal
33a20 6c 20 74 68 65 20 6e 42 79 74 65 73 20 70 61 72  l the nBytes par
33a30 61 6d 65 74 65 72 20 69 73 20 69 67 6e 6f 72 65  ameter is ignore
33a40 64 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20  d and a pointer 
33a50 74 6f 20 74 68 65 20 73 61 6d 65 20 62 6c 6f 62  to the same blob
33a60 0a 2a 2a 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65  .** of memory re
33a70 74 75 72 6e 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 4a  turned. .**.** J
33a80 75 73 74 20 62 65 66 6f 72 65 20 74 68 65 20 73  ust before the s
33a90 68 61 72 65 64 2d 62 74 72 65 65 20 69 73 20 63  hared-btree is c
33aa0 6c 6f 73 65 64 2c 20 74 68 65 20 66 75 6e 63 74  losed, the funct
33ab0 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74 68  ion passed as th
33ac0 65 20 0a 2a 2a 20 78 46 72 65 65 20 61 72 67 75  e .** xFree argu
33ad0 6d 65 6e 74 20 77 68 65 6e 20 74 68 65 20 6d 65  ment when the me
33ae0 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
33af0 77 61 73 20 6d 61 64 65 20 69 73 20 69 6e 76 6f  was made is invo
33b00 6b 65 64 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 62  ked on the .** b
33b10 6c 6f 62 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64  lob of allocated
33b20 20 6d 65 6d 6f 72 79 2e 20 54 68 69 73 20 66 75   memory. This fu
33b30 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6e 6f  nction should no
33b40 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 46 72 65  t call sqliteFre
33b50 65 28 29 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 65  e().** on the me
33b60 6d 6f 72 79 2c 20 74 68 65 20 62 74 72 65 65 20  mory, the btree 
33b70 6c 61 79 65 72 20 64 6f 65 73 20 74 68 61 74 2e  layer does that.
33b80 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
33b90 33 42 74 72 65 65 53 63 68 65 6d 61 28 42 74 72  3BtreeSchema(Btr
33ba0 65 65 20 2a 70 2c 20 69 6e 74 20 6e 42 79 74 65  ee *p, int nByte
33bb0 73 2c 20 76 6f 69 64 28 2a 78 46 72 65 65 29 28  s, void(*xFree)(
33bc0 76 6f 69 64 20 2a 29 29 7b 0a 20 20 42 74 53 68  void *)){.  BtSh
33bd0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
33be0 42 74 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  Bt;.  if( !pBt->
33bf0 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 70  pSchema ){.    p
33c00 42 74 2d 3e 70 53 63 68 65 6d 61 20 3d 20 73 71  Bt->pSchema = sq
33c10 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e 42 79 74 65  liteMalloc(nByte
33c20 73 29 3b 0a 20 20 20 20 70 42 74 2d 3e 78 46 72  s);.    pBt->xFr
33c30 65 65 53 63 68 65 6d 61 20 3d 20 78 46 72 65 65  eeSchema = xFree
33c40 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
33c50 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 7d 0a 0a  Bt->pSchema;.}..
33c60 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
33c70 65 20 69 66 20 61 6e 6f 74 68 65 72 20 75 73 65  e if another use
33c80 72 20 6f 66 20 74 68 65 20 73 61 6d 65 20 73 68  r of the same sh
33c90 61 72 65 64 20 62 74 72 65 65 20 61 73 20 74 68  ared btree as th
33ca0 65 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 68 61  e argument.** ha
33cb0 6e 64 6c 65 20 68 6f 6c 64 73 20 61 6e 20 65 78  ndle holds an ex
33cc0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20  clusive lock on 
33cd0 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
33ce0 72 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20  r table..*/.int 
33cf0 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65  sqlite3BtreeSche
33d00 6d 61 4c 6f 63 6b 65 64 28 42 74 72 65 65 20 2a  maLocked(Btree *
33d10 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 71 75  p){.  return (qu
33d20 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  eryTableLock(p, 
33d30 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41  MASTER_ROOT, REA
33d40 44 5f 4c 4f 43 4b 29 21 3d 53 51 4c 49 54 45 5f  D_LOCK)!=SQLITE_
33d50 4f 4b 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  OK);.}...#ifndef
33d60 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
33d70 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20  RED_CACHE./*.** 
33d80 4f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e  Obtain a lock on
33d90 20 74 68 65 20 74 61 62 6c 65 20 77 68 6f 73 65   the table whose
33da0 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 69 54   root page is iT
33db0 61 62 2e 20 20 54 68 65 0a 2a 2a 20 6c 6f 63 6b  ab.  The.** lock
33dc0 20 69 73 20 61 20 77 72 69 74 65 20 6c 6f 63 6b   is a write lock
33dd0 20 69 66 20 69 73 57 72 69 74 65 6c 6f 63 6b 20   if isWritelock 
33de0 69 73 20 74 72 75 65 20 6f 72 20 61 20 72 65 61  is true or a rea
33df0 64 20 6c 6f 63 6b 0a 2a 2a 20 69 66 20 69 74 20  d lock.** if it 
33e00 69 73 20 66 61 6c 73 65 2e 0a 2a 2f 0a 69 6e 74  is false..*/.int
33e10 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 6f 63   sqlite3BtreeLoc
33e20 6b 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c  kTable(Btree *p,
33e30 20 69 6e 74 20 69 54 61 62 2c 20 75 38 20 69 73   int iTab, u8 is
33e40 57 72 69 74 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e  WriteLock){.  in
33e50 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
33e60 3b 0a 20 20 75 38 20 6c 6f 63 6b 54 79 70 65 20  ;.  u8 lockType 
33e70 3d 20 28 69 73 57 72 69 74 65 4c 6f 63 6b 3f 57  = (isWriteLock?W
33e80 52 49 54 45 5f 4c 4f 43 4b 3a 52 45 41 44 5f 4c  RITE_LOCK:READ_L
33e90 4f 43 4b 29 3b 0a 20 20 72 63 20 3d 20 71 75 65  OCK);.  rc = que
33ea0 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69  ryTableLock(p, i
33eb0 54 61 62 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a  Tab, lockType);.
33ec0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
33ed0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
33ee0 6c 6f 63 6b 54 61 62 6c 65 28 70 2c 20 69 54 61  lockTable(p, iTa
33ef0 62 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20  b, lockType);.  
33f00 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
33f10 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
33f20 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 62  he following deb
33f30 75 67 67 69 6e 67 20 69 6e 74 65 72 66 61 63 65  ugging interface
33f40 20 68 61 73 20 74 6f 20 62 65 20 69 6e 20 74 68   has to be in th
33f50 69 73 20 66 69 6c 65 20 28 72 61 74 68 65 72 0a  is file (rather.
33f60 2a 2a 20 74 68 61 6e 20 69 6e 2c 20 66 6f 72 20  ** than in, for 
33f70 65 78 61 6d 70 6c 65 2c 20 74 65 73 74 31 2e 63  example, test1.c
33f80 29 20 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e  ) so that it can
33f90 20 67 65 74 20 61 63 63 65 73 73 20 74 6f 0a 2a   get access to.*
33fa0 2a 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e  * the definition
33fb0 20 6f 66 20 42 74 53 68 61 72 65 64 2e 0a 2a 2f   of BtShared..*/
33fc0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
33fd0 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 64 65  ITE_DEBUG) && de
33fe0 66 69 6e 65 64 28 54 43 4c 53 48 29 0a 23 69 6e  fined(TCLSH).#in
33ff0 63 6c 75 64 65 20 3c 74 63 6c 2e 68 3e 0a 69 6e  clude <tcl.h>.in
34000 74 20 73 71 6c 69 74 65 33 5f 73 68 61 72 65 64  t sqlite3_shared
34010 5f 63 61 63 68 65 5f 72 65 70 6f 72 74 28 0a 20  _cache_report(. 
34020 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
34030 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
34040 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
34050 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
34060 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
34070 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
34080 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
34090 45 0a 20 20 63 6f 6e 73 74 20 54 68 72 65 61 64  E.  const Thread
340a0 44 61 74 61 20 2a 70 54 64 20 3d 20 73 71 6c 69  Data *pTd = sqli
340b0 74 65 33 54 68 72 65 61 64 44 61 74 61 52 65 61  te3ThreadDataRea
340c0 64 4f 6e 6c 79 28 29 3b 0a 20 20 69 66 28 20 70  dOnly();.  if( p
340d0 54 64 2d 3e 75 73 65 53 68 61 72 65 64 44 61 74  Td->useSharedDat
340e0 61 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65  a ){.    BtShare
340f0 64 20 2a 70 42 74 3b 0a 20 20 20 20 54 63 6c 5f  d *pBt;.    Tcl_
34100 4f 62 6a 20 2a 70 52 65 74 20 3d 20 54 63 6c 5f  Obj *pRet = Tcl_
34110 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 66 6f  NewObj();.    fo
34120 72 28 70 42 74 3d 70 54 64 2d 3e 70 42 74 72 65  r(pBt=pTd->pBtre
34130 65 3b 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d  e; pBt; pBt=pBt-
34140 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 63  >pNext){.      c
34150 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
34160 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46   = sqlite3PagerF
34170 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61  ilename(pBt->pPa
34180 67 65 72 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  ger);.      Tcl_
34190 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
341a0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65  ment(interp, pRe
341b0 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  t, Tcl_NewString
341c0 4f 62 6a 28 7a 46 69 6c 65 2c 20 2d 31 29 29 3b  Obj(zFile, -1));
341d0 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  .      Tcl_ListO
341e0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
341f0 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63  interp, pRet, Tc
34200 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 70 42 74 2d  l_NewIntObj(pBt-
34210 3e 6e 52 65 66 29 29 3b 0a 20 20 20 20 7d 0a 20  >nRef));.    }. 
34220 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
34230 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ult(interp, pRet
34240 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
34250 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
34260 0a 23 65 6e 64 69 66 0a                          .#endif.