/ Hex Artifact Content
Login

Artifact 27299eba3ad5aa1fed184c707576d12d0e608e8d:


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 35 31 20 32 30 30 37 2f 30  c,v 1.351 2007/0
0190: 34 2f 30 36 20 30 31 3a 30 33 3a 33 33 20 64 72  4/06 01:03:33 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 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
6c30: 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70  current cursor p
6c40: 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  osition..*/.stat
6c50: 69 63 20 76 6f 69 64 20 63 6c 65 61 72 43 75 72  ic void clearCur
6c60: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75  sorPosition(BtCu
6c70: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 73  rsor *pCur){.  s
6c80: 71 6c 69 74 65 46 72 65 65 28 70 43 75 72 2d 3e  qliteFree(pCur->
6c90: 70 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70  pKey);.  pCur->p
6ca0: 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  Key = 0;.  pCur-
6cb0: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
6cc0: 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a  _INVALID;.}../*.
6cd0: 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 63  ** Restore the c
6ce0: 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70 6f 73  ursor to the pos
6cf0: 69 74 69 6f 6e 20 69 74 20 77 61 73 20 69 6e 20  ition it was in 
6d00: 28 6f 72 20 61 73 20 63 6c 6f 73 65 20 74 6f 20  (or as close to 
6d10: 61 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20  as possible).** 
6d20: 77 68 65 6e 20 73 61 76 65 43 75 72 73 6f 72 50  when saveCursorP
6d30: 6f 73 69 74 69 6f 6e 28 29 20 77 61 73 20 63 61  osition() was ca
6d40: 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61 74 20  lled. Note that 
6d50: 74 68 69 73 20 63 61 6c 6c 20 64 65 6c 65 74 65  this call delete
6d60: 73 20 74 68 65 20 0a 2a 2a 20 73 61 76 65 64 20  s the .** saved 
6d70: 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74  position info st
6d80: 6f 72 65 64 20 62 79 20 73 61 76 65 43 75 72 73  ored by saveCurs
6d90: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f  orPosition(), so
6da0: 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a   there can be.**
6db0: 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66   at most one eff
6dc0: 65 63 74 69 76 65 20 72 65 73 74 6f 72 65 4f 72  ective restoreOr
6dd0: 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  ClearCursorPosit
6de0: 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72  ion() call after
6df0: 20 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75   each .** saveCu
6e00: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a  rsorPosition()..
6e10: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63  **.** If the sec
6e20: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 61 72 67  ond argument arg
6e30: 75 6d 65 6e 74 20 2d 20 64 6f 53 65 65 6b 20 2d  ument - doSeek -
6e40: 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   is false, then 
6e50: 69 6e 73 74 65 61 64 20 6f 66 20 0a 2a 2a 20 72  instead of .** r
6e60: 65 74 75 72 6e 69 6e 67 20 74 68 65 20 63 75 72  eturning the cur
6e70: 73 6f 72 20 74 6f 20 69 74 27 73 20 73 61 76 65  sor to it's save
6e80: 64 20 70 6f 73 69 74 69 6f 6e 2c 20 61 6e 79 20  d position, any 
6e90: 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69  saved position i
6ea0: 73 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64  s deleted.** and
6eb0: 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74   the cursor stat
6ec0: 65 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f  e set to CURSOR_
6ed0: 49 4e 56 41 4c 49 44 2e 0a 2a 2f 0a 73 74 61 74  INVALID..*/.stat
6ee0: 69 63 20 69 6e 74 20 72 65 73 74 6f 72 65 4f 72  ic int restoreOr
6ef0: 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  ClearCursorPosit
6f00: 69 6f 6e 58 28 42 74 43 75 72 73 6f 72 20 2a 70  ionX(BtCursor *p
6f10: 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Cur){.  int rc;.
6f20: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
6f30: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 52  eState==CURSOR_R
6f40: 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
6f50: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
6f60: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
6f70: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
6f80: 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70  eeMoveto(pCur, p
6f90: 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d  Cur->pKey, pCur-
6fa0: 3e 6e 4b 65 79 2c 20 30 2c 20 26 70 43 75 72 2d  >nKey, 0, &pCur-
6fb0: 3e 73 6b 69 70 29 3b 0a 20 20 69 66 28 20 72 63  >skip);.  if( rc
6fc0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
6fd0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43     sqliteFree(pC
6fe0: 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70  ur->pKey);.    p
6ff0: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20  Cur->pKey = 0;. 
7000: 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
7010: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
7020: 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
7030: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
7040: 56 41 4c 49 44 20 29 3b 0a 20 20 7d 0a 20 20 72  VALID );.  }.  r
7050: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65  eturn rc;.}..#de
7060: 66 69 6e 65 20 72 65 73 74 6f 72 65 4f 72 43 6c  fine restoreOrCl
7070: 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  earCursorPositio
7080: 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74  n(p) \.  (p->eSt
7090: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate==CURSOR_REQU
70a0: 49 52 45 53 45 45 4b 3f 72 65 73 74 6f 72 65 4f  IRESEEK?restoreO
70b0: 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69  rClearCursorPosi
70c0: 74 69 6f 6e 58 28 70 29 3a 53 51 4c 49 54 45 5f  tionX(p):SQLITE_
70d0: 4f 4b 29 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  OK)..#ifndef SQL
70e0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
70f0: 55 55 4d 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  UUM./*.** These 
7100: 6d 61 63 72 6f 73 20 64 65 66 69 6e 65 20 74 68  macros define th
7110: 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  e location of th
7120: 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
7130: 74 72 79 20 66 6f 72 20 61 20 0a 2a 2a 20 64 61  try for a .** da
7140: 74 61 62 61 73 65 20 70 61 67 65 2e 20 54 68 65  tabase page. The
7150: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
7160: 74 6f 20 65 61 63 68 20 69 73 20 74 68 65 20 6e  to each is the n
7170: 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65 0a  umber of usable.
7180: 2a 2a 20 62 79 74 65 73 20 6f 6e 20 65 61 63 68  ** bytes on each
7190: 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
71a0: 61 62 61 73 65 20 28 6f 66 74 65 6e 20 31 30 32  abase (often 102
71b0: 34 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 69  4). The second i
71c0: 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75  s the.** page nu
71d0: 6d 62 65 72 20 74 6f 20 6c 6f 6f 6b 20 75 70 20  mber to look up 
71e0: 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  in the pointer m
71f0: 61 70 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ap..**.** PTRMAP
7200: 5f 50 41 47 45 4e 4f 20 72 65 74 75 72 6e 73 20  _PAGENO returns 
7210: 74 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67  the database pag
7220: 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
7230: 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 70  pointer-map.** p
7240: 61 67 65 20 74 68 61 74 20 73 74 6f 72 65 73 20  age that stores 
7250: 74 68 65 20 72 65 71 75 69 72 65 64 20 70 6f 69  the required poi
7260: 6e 74 65 72 2e 20 50 54 52 4d 41 50 5f 50 54 52  nter. PTRMAP_PTR
7270: 4f 46 46 53 45 54 20 72 65 74 75 72 6e 73 0a 2a  OFFSET returns.*
7280: 2a 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20  * the offset of 
7290: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 61  the requested ma
72a0: 70 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 49  p entry..**.** I
72b0: 66 20 74 68 65 20 70 67 6e 6f 20 61 72 67 75 6d  f the pgno argum
72c0: 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 50 54  ent passed to PT
72d0: 52 4d 41 50 5f 50 41 47 45 4e 4f 20 69 73 20 61  RMAP_PAGENO is a
72e0: 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
72f0: 65 2c 0a 2a 2a 20 74 68 65 6e 20 70 67 6e 6f 20  e,.** then pgno 
7300: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 53 6f 20  is returned. So 
7310: 28 70 67 6e 6f 3d 3d 50 54 52 4d 41 50 5f 50 41  (pgno==PTRMAP_PA
7320: 47 45 4e 4f 28 70 67 73 7a 2c 20 70 67 6e 6f 29  GENO(pgsz, pgno)
7330: 29 20 63 61 6e 20 62 65 0a 2a 2a 20 75 73 65 64  ) can be.** used
7340: 20 74 6f 20 74 65 73 74 20 69 66 20 70 67 6e 6f   to test if pgno
7350: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61   is a pointer-ma
7360: 70 20 70 61 67 65 2e 20 50 54 52 4d 41 50 5f 49  p page. PTRMAP_I
7370: 53 50 41 47 45 20 69 6d 70 6c 65 6d 65 6e 74 73  SPAGE implements
7380: 0a 2a 2a 20 74 68 69 73 20 74 65 73 74 2e 0a 2a  .** this test..*
7390: 2f 0a 23 64 65 66 69 6e 65 20 50 54 52 4d 41 50  /.#define PTRMAP
73a0: 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 70 67 6e  _PAGENO(pBt, pgn
73b0: 6f 29 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28  o) ptrmapPageno(
73c0: 70 42 74 2c 20 70 67 6e 6f 29 0a 23 64 65 66 69  pBt, pgno).#defi
73d0: 6e 65 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46  ne PTRMAP_PTROFF
73e0: 53 45 54 28 70 42 74 2c 20 70 67 6e 6f 29 20 28  SET(pBt, pgno) (
73f0: 35 2a 28 70 67 6e 6f 2d 70 74 72 6d 61 70 50 61  5*(pgno-ptrmapPa
7400: 67 65 6e 6f 28 70 42 74 2c 20 70 67 6e 6f 29 2d  geno(pBt, pgno)-
7410: 31 29 29 0a 23 64 65 66 69 6e 65 20 50 54 52 4d  1)).#define PTRM
7420: 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70  AP_ISPAGE(pBt, p
7430: 67 6e 6f 29 20 28 50 54 52 4d 41 50 5f 50 41 47  gno) (PTRMAP_PAG
7440: 45 4e 4f 28 28 70 42 74 29 2c 28 70 67 6e 6f 29  ENO((pBt),(pgno)
7450: 29 3d 3d 28 70 67 6e 6f 29 29 0a 0a 73 74 61 74  )==(pgno))..stat
7460: 69 63 20 50 67 6e 6f 20 70 74 72 6d 61 70 50 61  ic Pgno ptrmapPa
7470: 67 65 6e 6f 28 42 74 53 68 61 72 65 64 20 2a 70  geno(BtShared *p
7480: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
7490: 20 20 69 6e 74 20 6e 50 61 67 65 73 50 65 72 4d    int nPagesPerM
74a0: 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e 75  apPage = (pBt->u
74b0: 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a  sableSize/5)+1;.
74c0: 20 20 69 6e 74 20 69 50 74 72 4d 61 70 20 3d 20    int iPtrMap = 
74d0: 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50  (pgno-2)/nPagesP
74e0: 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 69 6e 74  erMapPage;.  int
74f0: 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70 2a   ret = (iPtrMap*
7500: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
7510: 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72 65  ) + 2; .  if( re
7520: 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  t==PENDING_BYTE_
7530: 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
7540: 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65   ret++;.  }.  re
7550: 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a  turn ret;.}../*.
7560: 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  ** The pointer m
7570: 61 70 20 69 73 20 61 20 6c 6f 6f 6b 75 70 20 74  ap is a lookup t
7580: 61 62 6c 65 20 74 68 61 74 20 69 64 65 6e 74 69  able that identi
7590: 66 69 65 73 20 74 68 65 20 70 61 72 65 6e 74 20  fies the parent 
75a0: 70 61 67 65 20 66 6f 72 0a 2a 2a 20 65 61 63 68  page for.** each
75b0: 20 63 68 69 6c 64 20 70 61 67 65 20 69 6e 20 74   child page in t
75c0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
75d0: 2e 20 20 54 68 65 20 70 61 72 65 6e 74 20 70 61  .  The parent pa
75e0: 67 65 20 69 73 20 74 68 65 20 70 61 67 65 20 74  ge is the page t
75f0: 68 61 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20  hat.** contains 
7600: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
7610: 20 63 68 69 6c 64 2e 20 20 45 76 65 72 79 20 70   child.  Every p
7620: 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  age in the datab
7630: 61 73 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  ase contains.** 
7640: 30 20 6f 72 20 31 20 70 61 72 65 6e 74 20 70 61  0 or 1 parent pa
7650: 67 65 73 2e 20 20 28 49 6e 20 74 68 69 73 20 63  ges.  (In this c
7660: 6f 6e 74 65 78 74 20 27 64 61 74 61 62 61 73 65  ontext 'database
7670: 20 70 61 67 65 27 20 72 65 66 65 72 73 0a 2a 2a   page' refers.**
7680: 20 74 6f 20 61 6e 79 20 70 61 67 65 20 74 68 61   to any page tha
7690: 74 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66  t is not part of
76a0: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
76b0: 20 69 74 73 65 6c 66 2e 29 20 20 45 61 63 68 20   itself.)  Each 
76c0: 70 6f 69 6e 74 65 72 20 6d 61 70 0a 2a 2a 20 65  pointer map.** e
76d0: 6e 74 72 79 20 63 6f 6e 73 69 73 74 73 20 6f 66  ntry consists of
76e0: 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 27   a single byte '
76f0: 74 79 70 65 27 20 61 6e 64 20 61 20 34 20 62 79  type' and a 4 by
7700: 74 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e  te parent page n
7710: 75 6d 62 65 72 2e 0a 2a 2a 20 54 68 65 20 50 54  umber..** The PT
7720: 52 4d 41 50 5f 58 58 58 20 69 64 65 6e 74 69 66  RMAP_XXX identif
7730: 69 65 72 73 20 62 65 6c 6f 77 20 61 72 65 20 74  iers below are t
7740: 68 65 20 76 61 6c 69 64 20 74 79 70 65 73 2e 0a  he valid types..
7750: 2a 2a 0a 2a 2a 20 54 68 65 20 70 75 72 70 6f 73  **.** The purpos
7760: 65 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72  e of the pointer
7770: 20 6d 61 70 20 69 73 20 74 6f 20 66 61 63 69 6c   map is to facil
7780: 69 74 79 20 6d 6f 76 69 6e 67 20 70 61 67 65 73  ity moving pages
7790: 20 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20 70 6f 73   from one.** pos
77a0: 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 66 69 6c  ition in the fil
77b0: 65 20 74 6f 20 61 6e 6f 74 68 65 72 20 61 73 20  e to another as 
77c0: 70 61 72 74 20 6f 66 20 61 75 74 6f 76 61 63 75  part of autovacu
77d0: 75 6d 2e 20 20 57 68 65 6e 20 61 20 70 61 67 65  um.  When a page
77e0: 0a 2a 2a 20 69 73 20 6d 6f 76 65 64 2c 20 74 68  .** is moved, th
77f0: 65 20 70 6f 69 6e 74 65 72 20 69 6e 20 69 74 73  e pointer in its
7800: 20 70 61 72 65 6e 74 20 6d 75 73 74 20 62 65 20   parent must be 
7810: 75 70 64 61 74 65 64 20 74 6f 20 70 6f 69 6e 74  updated to point
7820: 20 74 6f 20 74 68 65 0a 2a 2a 20 6e 65 77 20 6c   to the.** new l
7830: 6f 63 61 74 69 6f 6e 2e 20 20 54 68 65 20 70 6f  ocation.  The po
7840: 69 6e 74 65 72 20 6d 61 70 20 69 73 20 75 73 65  inter map is use
7850: 64 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20  d to locate the 
7860: 70 61 72 65 6e 74 20 70 61 67 65 20 71 75 69 63  parent page quic
7870: 6b 6c 79 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  kly..**.** PTRMA
7880: 50 5f 52 4f 4f 54 50 41 47 45 3a 20 54 68 65 20  P_ROOTPAGE: The 
7890: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 69 73  database page is
78a0: 20 61 20 72 6f 6f 74 2d 70 61 67 65 2e 20 54 68   a root-page. Th
78b0: 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  e page-number is
78c0: 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 20   not.**         
78d0: 20 20 20 20 20 20 20 20 20 75 73 65 64 20 69 6e           used in
78e0: 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
78f0: 2a 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  * PTRMAP_FREEPAG
7900: 45 3a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  E: The database 
7910: 70 61 67 65 20 69 73 20 61 6e 20 75 6e 75 73 65  page is an unuse
7920: 64 20 28 66 72 65 65 29 20 70 61 67 65 2e 20 54  d (free) page. T
7930: 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 0a  he page-number .
7940: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
7950: 20 20 20 20 69 73 20 6e 6f 74 20 75 73 65 64 20      is not used 
7960: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
7970: 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  .** PTRMAP_OVERF
7980: 4c 4f 57 31 3a 20 54 68 65 20 64 61 74 61 62 61  LOW1: The databa
7990: 73 65 20 70 61 67 65 20 69 73 20 74 68 65 20 66  se page is the f
79a0: 69 72 73 74 20 70 61 67 65 20 69 6e 20 61 20 6c  irst page in a l
79b0: 69 73 74 20 6f 66 20 0a 2a 2a 20 20 20 20 20 20  ist of .**      
79c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65               ove
79d0: 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65  rflow pages. The
79e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 64 65   page number ide
79f0: 6e 74 69 66 69 65 73 20 74 68 65 20 70 61 67 65  ntifies the page
7a00: 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
7a10: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 61             conta
7a20: 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 77 69 74  ins the cell wit
7a30: 68 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  h a pointer to t
7a40: 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  his overflow pag
7a50: 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  e..**.** PTRMAP_
7a60: 4f 56 45 52 46 4c 4f 57 32 3a 20 54 68 65 20 64  OVERFLOW2: The d
7a70: 61 74 61 62 61 73 65 20 70 61 67 65 20 69 73 20  atabase page is 
7a80: 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 6c 61  the second or la
7a90: 74 65 72 20 70 61 67 65 20 69 6e 20 61 20 6c 69  ter page in a li
7aa0: 73 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20  st of.**        
7ab0: 20 20 20 20 20 20 20 20 20 20 20 6f 76 65 72 66             overf
7ac0: 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20 70  low pages. The p
7ad0: 61 67 65 2d 6e 75 6d 62 65 72 20 69 64 65 6e 74  age-number ident
7ae0: 69 66 69 65 73 20 74 68 65 20 70 72 65 76 69 6f  ifies the previo
7af0: 75 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  us.**           
7b00: 20 20 20 20 20 20 20 20 70 61 67 65 20 69 6e 20          page in 
7b10: 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
7b20: 65 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 50 54  e list..**.** PT
7b30: 52 4d 41 50 5f 42 54 52 45 45 3a 20 54 68 65 20  RMAP_BTREE: The 
7b40: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 69 73  database page is
7b50: 20 61 20 6e 6f 6e 2d 72 6f 6f 74 20 62 74 72 65   a non-root btre
7b60: 65 20 70 61 67 65 2e 20 54 68 65 20 70 61 67 65  e page. The page
7b70: 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 20 20 20   number.**      
7b80: 20 20 20 20 20 20 20 20 20 69 64 65 6e 74 69 66           identif
7b90: 69 65 73 20 74 68 65 20 70 61 72 65 6e 74 20 70  ies the parent p
7ba0: 61 67 65 20 69 6e 20 74 68 65 20 62 74 72 65 65  age in the btree
7bb0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 54 52  ..*/.#define PTR
7bc0: 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 31 0a 23  MAP_ROOTPAGE 1.#
7bd0: 64 65 66 69 6e 65 20 50 54 52 4d 41 50 5f 46 52  define PTRMAP_FR
7be0: 45 45 50 41 47 45 20 32 0a 23 64 65 66 69 6e 65  EEPAGE 2.#define
7bf0: 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
7c00: 31 20 33 0a 23 64 65 66 69 6e 65 20 50 54 52 4d  1 3.#define PTRM
7c10: 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 34 0a 23  AP_OVERFLOW2 4.#
7c20: 64 65 66 69 6e 65 20 50 54 52 4d 41 50 5f 42 54  define PTRMAP_BT
7c30: 52 45 45 20 35 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  REE 5../*.** Wri
7c40: 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f  te an entry into
7c50: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
7c60: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
7c70: 74 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65  tine updates the
7c80: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
7c90: 72 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62  ry for page numb
7ca0: 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74  er 'key'.** so t
7cb0: 68 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74  hat it maps to t
7cc0: 79 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20  ype 'eType' and 
7cd0: 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62  parent page numb
7ce0: 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 20 41 6e  er 'pgno'..** An
7cf0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
7d00: 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74  eturned if somet
7d10: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c  hing goes wrong,
7d20: 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54   otherwise SQLIT
7d30: 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
7d40: 69 6e 74 20 70 74 72 6d 61 70 50 75 74 28 42 74  int ptrmapPut(Bt
7d50: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
7d60: 6f 20 6b 65 79 2c 20 75 38 20 65 54 79 70 65 2c  o key, u8 eType,
7d70: 20 50 67 6e 6f 20 70 61 72 65 6e 74 29 7b 0a 20   Pgno parent){. 
7d80: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
7d90: 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65  ;  /* The pointe
7da0: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
7db0: 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20  u8 *pPtrmap;    
7dc0: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
7dd0: 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20 20 50   map data */.  P
7de0: 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20 20 20  gno iPtrmap;    
7df0: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
7e00: 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20  map page number 
7e10: 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b  */.  int offset;
7e20: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
7e30: 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20   in pointer map 
7e40: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  page */.  int rc
7e50: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73 74  ;..  /* The mast
7e60: 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20  er-journal page 
7e70: 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e 65 76 65  number must neve
7e80: 72 20 62 65 20 75 73 65 64 20 61 73 20 61 20 70  r be used as a p
7e90: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
7ea0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d  */.  assert( 0==
7eb0: 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
7ec0: 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  t, PENDING_BYTE_
7ed0: 50 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a 20  PAGE(pBt)) );.. 
7ee0: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75   assert( pBt->au
7ef0: 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69 66  toVacuum );.  if
7f00: 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20  ( key==0 ){.    
7f10: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
7f20: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
7f30: 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d    iPtrmap = PTRM
7f40: 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b  AP_PAGENO(pBt, k
7f50: 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ey);.  rc = sqli
7f60: 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
7f70: 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70  >pPager, iPtrmap
7f80: 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69  , &pDbPage);.  i
7f90: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
7fa0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
7fb0: 63 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20  c;.  }.  offset 
7fc0: 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53  = PTRMAP_PTROFFS
7fd0: 45 54 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  ET(pBt, key);.  
7fe0: 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29  pPtrmap = (u8 *)
7ff0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
8000: 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20  ata(pDbPage);.. 
8010: 20 69 66 28 20 65 54 79 70 65 21 3d 70 50 74 72   if( eType!=pPtr
8020: 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67  map[offset] || g
8030: 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70  et4byte(&pPtrmap
8040: 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70 61 72  [offset+1])!=par
8050: 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41 43 45  ent ){.    TRACE
8060: 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41 54 45  (("PTRMAP_UPDATE
8070: 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22  : %d->(%d,%d)\n"
8080: 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70 61  , key, eType, pa
8090: 72 65 6e 74 29 29 3b 0a 20 20 20 20 72 63 20 3d  rent));.    rc =
80a0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
80b0: 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
80c0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
80d0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74 72  OK ){.      pPtr
80e0: 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54  map[offset] = eT
80f0: 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ype;.      put4b
8100: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
8110: 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b  set+1], parent);
8120: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71  .    }.  }..  sq
8130: 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
8140: 70 44 62 50 61 67 65 29 3b 0a 20 20 72 65 74 75  pDbPage);.  retu
8150: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
8160: 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66 72  Read an entry fr
8170: 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  om the pointer m
8180: 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ap..**.** This r
8190: 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76 65 73  outine retrieves
81a0: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
81b0: 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20   entry for page 
81c0: 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a  'key', writing.*
81d0: 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 70  * the type and p
81e0: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
81f0: 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e 64  r to *pEType and
8200: 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74 69   *pPgno respecti
8210: 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f  vely..** An erro
8220: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
8230: 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20  ed if something 
8240: 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65  goes wrong, othe
8250: 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e  rwise SQLITE_OK.
8260: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
8270: 74 72 6d 61 70 47 65 74 28 42 74 53 68 61 72 65  trmapGet(BtShare
8280: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79  d *pBt, Pgno key
8290: 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67  , u8 *pEType, Pg
82a0: 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62  no *pPgno){.  Db
82b0: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
82c0: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
82d0: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  map page */.  in
82e0: 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20  t iPtrmap;      
82f0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
8300: 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20  page index */.  
8310: 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20  u8 *pPtrmap;    
8320: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
8330: 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  p page data */. 
8340: 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20   int offset;    
8350: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
8360: 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65   entry in pointe
8370: 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72  r map */.  int r
8380: 63 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20  c;..  iPtrmap = 
8390: 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
83a0: 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20  t, key);.  rc = 
83b0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
83c0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74  pBt->pPager, iPt
83d0: 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b  rmap, &pDbPage);
83e0: 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a  .  if( rc!=0 ){.
83f0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
8400: 20 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28   }.  pPtrmap = (
8410: 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  u8 *)sqlite3Page
8420: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
8430: 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50  );..  offset = P
8440: 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28  TRMAP_PTROFFSET(
8450: 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 61 73 73  pBt, key);.  ass
8460: 65 72 74 28 20 70 45 54 79 70 65 21 3d 30 20 29  ert( pEType!=0 )
8470: 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50  ;.  *pEType = pP
8480: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20  trmap[offset];. 
8490: 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50   if( pPgno ) *pP
84a0: 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
84b0: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
84c0: 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61  ]);..  sqlite3Pa
84d0: 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
84e0: 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65  );.  if( *pEType
84f0: 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20  <1 || *pEType>5 
8500: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
8510: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
8520: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
8530: 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ;.}..#endif /* S
8540: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
8550: 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ACUUM */../*.** 
8560: 47 69 76 65 6e 20 61 20 62 74 72 65 65 20 70 61  Given a btree pa
8570: 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e  ge and a cell in
8580: 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65  dex (0 means the
8590: 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a   first cell on.*
85a0: 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65  * the page, 1 me
85b0: 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63  ans the second c
85c0: 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  ell, and so fort
85d0: 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  h) return a poin
85e0: 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65  ter.** to the ce
85f0: 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a  ll content..**.*
8600: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
8610: 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61  orks only for pa
8620: 67 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  ges that do not 
8630: 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77  contain overflow
8640: 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   cells..*/.stati
8650: 63 20 75 38 20 2a 66 69 6e 64 43 65 6c 6c 28 4d  c u8 *findCell(M
8660: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
8670: 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 75 38 20  nt iCell){.  u8 
8680: 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61  *data = pPage->a
8690: 44 61 74 61 3b 0a 20 20 61 73 73 65 72 74 28 20  Data;.  assert( 
86a0: 69 43 65 6c 6c 3e 3d 30 20 29 3b 0a 20 20 61 73  iCell>=0 );.  as
86b0: 73 65 72 74 28 20 69 43 65 6c 6c 3c 67 65 74 32  sert( iCell<get2
86c0: 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67 65  byte(&data[pPage
86d0: 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 29 20  ->hdrOffset+3]) 
86e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 64 61 74 61  );.  return data
86f0: 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74   + get2byte(&dat
8700: 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  a[pPage->cellOff
8710: 73 65 74 2b 32 2a 69 43 65 6c 6c 5d 29 3b 0a 7d  set+2*iCell]);.}
8720: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 20 6d  ../*.** This a m
8730: 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76 65 72 73  ore complex vers
8740: 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c 6c 28  ion of findCell(
8750: 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72  ) that works for
8760: 0a 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20 64  .** pages that d
8770: 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c  o contain overfl
8780: 6f 77 20 63 65 6c 6c 73 2e 20 20 53 65 65 20 69  ow cells.  See i
8790: 6e 73 65 72 74 0a 2a 2f 0a 73 74 61 74 69 63 20  nsert.*/.static 
87a0: 75 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77  u8 *findOverflow
87b0: 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Cell(MemPage *pP
87c0: 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b  age, int iCell){
87d0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
87e0: 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  i=pPage->nOverfl
87f0: 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  ow-1; i>=0; i--)
8800: 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20  {.    int k;.   
8810: 20 73 74 72 75 63 74 20 5f 4f 76 66 6c 43 65 6c   struct _OvflCel
8820: 6c 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20 70 4f  l *pOvfl;.    pO
8830: 76 66 6c 20 3d 20 26 70 50 61 67 65 2d 3e 61 4f  vfl = &pPage->aO
8840: 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 6b 20 3d 20  vfl[i];.    k = 
8850: 70 4f 76 66 6c 2d 3e 69 64 78 3b 0a 20 20 20 20  pOvfl->idx;.    
8860: 69 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a  if( k<=iCell ){.
8870: 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 69 43 65        if( k==iCe
8880: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ll ){.        re
8890: 74 75 72 6e 20 70 4f 76 66 6c 2d 3e 70 43 65 6c  turn pOvfl->pCel
88a0: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
88b0: 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d 0a   iCell--;.    }.
88c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 69 6e    }.  return fin
88d0: 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  dCell(pPage, iCe
88e0: 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  ll);.}../*.** Pa
88f0: 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65  rse a cell conte
8900: 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c  nt block and fil
8910: 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66  l in the CellInf
8920: 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  o structure.  Th
8930: 65 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f 20 76  ere.** are two v
8940: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 73 20  ersions of this 
8950: 66 75 6e 63 74 69 6f 6e 2e 20 20 70 61 72 73 65  function.  parse
8960: 43 65 6c 6c 28 29 20 74 61 6b 65 73 20 61 20 63  Cell() takes a c
8970: 65 6c 6c 20 69 6e 64 65 78 0a 2a 2a 20 61 73 20  ell index.** as 
8980: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
8990: 65 6e 74 20 61 6e 64 20 70 61 72 73 65 43 65 6c  ent and parseCel
89a0: 6c 50 74 72 28 29 20 74 61 6b 65 73 20 61 20 70  lPtr() takes a p
89b0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a  ointer to the.**
89c0: 20 62 6f 64 79 20 6f 66 20 74 68 65 20 63 65 6c   body of the cel
89d0: 6c 20 61 73 20 69 74 73 20 73 65 63 6f 6e 64 20  l as its second 
89e0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
89f0: 74 69 63 20 76 6f 69 64 20 70 61 72 73 65 43 65  tic void parseCe
8a00: 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65  llPtr(.  MemPage
8a10: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
8a20: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
8a30: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
8a40: 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
8a50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
8a60: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
8a70: 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c   text. */.  Cell
8a80: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
8a90: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
8aa0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
8ab0: 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20  .){.  int n;    
8ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8ad0: 20 4e 75 6d 62 65 72 20 62 79 74 65 73 20 69 6e   Number bytes in
8ae0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 65   cell content he
8af0: 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 50  ader */.  u32 nP
8b00: 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20  ayload;         
8b10: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
8b20: 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79  ytes of cell pay
8b30: 6c 6f 61 64 20 2a 2f 0a 0a 20 20 70 49 6e 66 6f  load */..  pInfo
8b40: 2d 3e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b  ->pCell = pCell;
8b50: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
8b60: 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61  ->leaf==0 || pPa
8b70: 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20  ge->leaf==1 );. 
8b80: 20 6e 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c   n = pPage->chil
8b90: 64 50 74 72 53 69 7a 65 3b 0a 20 20 61 73 73 65  dPtrSize;.  asse
8ba0: 72 74 28 20 6e 3d 3d 34 2d 34 2a 70 50 61 67 65  rt( n==4-4*pPage
8bb0: 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 69 66 28 20  ->leaf );.  if( 
8bc0: 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29  pPage->hasData )
8bd0: 7b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61  {.    n += getVa
8be0: 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d  rint32(&pCell[n]
8bf0: 2c 20 26 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20  , &nPayload);.  
8c00: 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50 61 79 6c  }else{.    nPayl
8c10: 6f 61 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  oad = 0;.  }.  p
8c20: 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 6e 50  Info->nData = nP
8c30: 61 79 6c 6f 61 64 3b 0a 20 20 69 66 28 20 70 50  ayload;.  if( pP
8c40: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
8c50: 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e     n += getVarin
8c60: 74 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36  t(&pCell[n], (u6
8c70: 34 20 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79  4 *)&pInfo->nKey
8c80: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
8c90: 75 33 32 20 78 3b 0a 20 20 20 20 6e 20 2b 3d 20  u32 x;.    n += 
8ca0: 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 43 65  getVarint32(&pCe
8cb0: 6c 6c 5b 6e 5d 2c 20 26 78 29 3b 0a 20 20 20 20  ll[n], &x);.    
8cc0: 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 78 3b  pInfo->nKey = x;
8cd0: 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d  .    nPayload +=
8ce0: 20 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d   x;.  }.  pInfo-
8cf0: 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79  >nPayload = nPay
8d00: 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e  load;.  pInfo->n
8d10: 48 65 61 64 65 72 20 3d 20 6e 3b 0a 20 20 69 66  Header = n;.  if
8d20: 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67  ( nPayload<=pPag
8d30: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
8d40: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
8d50: 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20  e (easy) common 
8d60: 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65  case where the e
8d70: 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69  ntire payload fi
8d80: 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  ts.    ** on the
8d90: 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f   local page.  No
8da0: 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71   overflow is req
8db0: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
8dc0: 20 20 69 6e 74 20 6e 53 69 7a 65 3b 20 20 20 20    int nSize;    
8dd0: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73        /* Total s
8de0: 69 7a 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74  ize of cell cont
8df0: 65 6e 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ent in bytes */.
8e00: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
8e10: 6c 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  l = nPayload;.  
8e20: 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c    pInfo->iOverfl
8e30: 6f 77 20 3d 20 30 3b 0a 20 20 20 20 6e 53 69 7a  ow = 0;.    nSiz
8e40: 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 6e  e = nPayload + n
8e50: 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c  ;.    if( nSize<
8e60: 34 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65  4 ){.      nSize
8e70: 20 3d 20 34 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 4;        /* 
8e80: 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a  Minimum cell siz
8e90: 65 20 69 73 20 34 20 2a 2f 0a 20 20 20 20 7d 0a  e is 4 */.    }.
8ea0: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65      pInfo->nSize
8eb0: 20 3d 20 6e 53 69 7a 65 3b 0a 20 20 7d 65 6c 73   = nSize;.  }els
8ec0: 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  e{.    /* If the
8ed0: 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f   payload will no
8ee0: 74 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79  t fit completely
8ef0: 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
8f00: 67 65 2c 20 77 65 20 68 61 76 65 0a 20 20 20 20  ge, we have.    
8f10: 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f 77  ** to decide how
8f20: 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20 6c   much to store l
8f30: 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d  ocally and how m
8f40: 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74  uch to spill ont
8f50: 6f 0a 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f  o.    ** overflo
8f60: 77 20 70 61 67 65 73 2e 20 20 54 68 65 20 73 74  w pages.  The st
8f70: 72 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e  rategy is to min
8f80: 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74  imize the amount
8f90: 20 6f 66 20 75 6e 75 73 65 64 0a 20 20 20 20 2a   of unused.    *
8fa0: 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72 66  * space on overf
8fb0: 6c 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65 20  low pages while 
8fc0: 6b 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f 75  keeping the amou
8fd0: 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72  nt of local stor
8fe0: 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 62 65  age.    ** in be
8ff0: 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61  tween minLocal a
9000: 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 20  nd maxLocal..   
9010: 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 61 72 6e 69   **.    ** Warni
9020: 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67 20 74 68  ng:  changing th
9030: 65 20 77 61 79 20 6f 76 65 72 66 6c 6f 77 20 70  e way overflow p
9040: 61 79 6c 6f 61 64 20 69 73 20 64 69 73 74 72 69  ayload is distri
9050: 62 75 74 65 64 20 69 6e 20 61 6e 79 0a 20 20 20  buted in any.   
9060: 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65 73   ** way will res
9070: 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70  ult in an incomp
9080: 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d  atible file form
9090: 61 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  at..    */.    i
90a0: 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a  nt minLocal;  /*
90b0: 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20   Minimum amount 
90c0: 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20  of payload held 
90d0: 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69  locally */.    i
90e0: 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a  nt maxLocal;  /*
90f0: 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20   Maximum amount 
9100: 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20  of payload held 
9110: 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69  locally */.    i
9120: 6e 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a  nt surplus;   /*
9130: 20 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61   Overflow payloa
9140: 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  d available for 
9150: 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f  local storage */
9160: 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d  ..    minLocal =
9170: 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
9180: 3b 0a 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20 3d  ;.    maxLocal =
9190: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
91a0: 3b 0a 20 20 20 20 73 75 72 70 6c 75 73 20 3d 20  ;.    surplus = 
91b0: 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50 61 79  minLocal + (nPay
91c0: 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29  load - minLocal)
91d0: 25 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  %(pPage->pBt->us
91e0: 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20  ableSize - 4);. 
91f0: 20 20 20 69 66 28 20 73 75 72 70 6c 75 73 20 3c     if( surplus <
9200: 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  = maxLocal ){.  
9210: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
9220: 6c 20 3d 20 73 75 72 70 6c 75 73 3b 0a 20 20 20  l = surplus;.   
9230: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49   }else{.      pI
9240: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 6d 69  nfo->nLocal = mi
9250: 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20  nLocal;.    }.  
9260: 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c    pInfo->iOverfl
9270: 6f 77 20 3d 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  ow = pInfo->nLoc
9280: 61 6c 20 2b 20 6e 3b 0a 20 20 20 20 70 49 6e 66  al + n;.    pInf
9290: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70 49 6e 66 6f  o->nSize = pInfo
92a0: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 2b 20 34 3b  ->iOverflow + 4;
92b0: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
92c0: 69 64 20 70 61 72 73 65 43 65 6c 6c 28 0a 20 20  id parseCell(.  
92d0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
92e0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
92f0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
9300: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  ell */.  int iCe
9310: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
9320: 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64   /* The cell ind
9330: 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20  ex.  First cell 
9340: 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  is 0 */.  CellIn
9350: 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
9360: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69    /* Fill in thi
9370: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  s structure */.)
9380: 7b 0a 20 20 70 61 72 73 65 43 65 6c 6c 50 74 72  {.  parseCellPtr
9390: 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c  (pPage, findCell
93a0: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 2c 20  (pPage, iCell), 
93b0: 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pInfo);.}../*.**
93c0: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74   Compute the tot
93d0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  al number of byt
93e0: 65 73 20 74 68 61 74 20 61 20 43 65 6c 6c 20 6e  es that a Cell n
93f0: 65 65 64 73 20 69 6e 20 74 68 65 20 63 65 6c 6c  eeds in the cell
9400: 0a 2a 2a 20 64 61 74 61 20 61 72 65 61 20 6f 66  .** data area of
9410: 20 74 68 65 20 62 74 72 65 65 2d 70 61 67 65 2e   the btree-page.
9420: 20 20 54 68 65 20 72 65 74 75 72 6e 20 6e 75 6d    The return num
9430: 62 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68 65  ber includes the
9440: 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65   cell.** data he
9450: 61 64 65 72 20 61 6e 64 20 74 68 65 20 6c 6f 63  ader and the loc
9460: 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75 74 20  al payload, but 
9470: 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77  not any overflow
9480: 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20   page or.** the 
9490: 73 70 61 63 65 20 75 73 65 64 20 62 79 20 74 68  space used by th
94a0: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a  e cell pointer..
94b0: 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
94c0: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63 65 6c  G.static int cel
94d0: 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70  lSize(MemPage *p
94e0: 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29  Page, int iCell)
94f0: 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  {.  CellInfo inf
9500: 6f 3b 0a 20 20 70 61 72 73 65 43 65 6c 6c 28 70  o;.  parseCell(p
9510: 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 26 69 6e  Page, iCell, &in
9520: 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e  fo);.  return in
9530: 66 6f 2e 6e 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64  fo.nSize;.}.#end
9540: 69 66 0a 73 74 61 74 69 63 20 69 6e 74 20 63 65  if.static int ce
9550: 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50 61 67  llSizePtr(MemPag
9560: 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43  e *pPage, u8 *pC
9570: 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f  ell){.  CellInfo
9580: 20 69 6e 66 6f 3b 0a 20 20 70 61 72 73 65 43 65   info;.  parseCe
9590: 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
95a0: 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 72 65  ll, &info);.  re
95b0: 74 75 72 6e 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b  turn info.nSize;
95c0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
95d0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
95e0: 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  UM./*.** If the 
95f0: 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74  cell pCell, part
9600: 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63   of page pPage c
9610: 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
9620: 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66  r.** to an overf
9630: 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74  low page, insert
9640: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
9650: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a  he pointer-map.*
9660: 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  * for the overfl
9670: 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ow page..*/.stat
9680: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74  ic int ptrmapPut
9690: 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20  OvflPtr(MemPage 
96a0: 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c  *pPage, u8 *pCel
96b0: 6c 29 7b 0a 20 20 69 66 28 20 70 43 65 6c 6c 20  l){.  if( pCell 
96c0: 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20  ){.    CellInfo 
96d0: 69 6e 66 6f 3b 0a 20 20 20 20 70 61 72 73 65 43  info;.    parseC
96e0: 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
96f0: 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  ell, &info);.   
9700: 20 61 73 73 65 72 74 28 20 28 69 6e 66 6f 2e 6e   assert( (info.n
9710: 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74  Data+(pPage->int
9720: 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29  Key?0:info.nKey)
9730: 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  )==info.nPayload
9740: 20 29 3b 0a 20 20 20 20 69 66 28 20 28 69 6e 66   );.    if( (inf
9750: 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e  o.nData+(pPage->
9760: 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b  intKey?0:info.nK
9770: 65 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  ey))>info.nLocal
9780: 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6f   ){.      Pgno o
9790: 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26  vfl = get4byte(&
97a0: 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
97b0: 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20 72 65  flow]);.      re
97c0: 74 75 72 6e 20 70 74 72 6d 61 70 50 75 74 28 70  turn ptrmapPut(p
97d0: 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c  Page->pBt, ovfl,
97e0: 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
97f0: 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  1, pPage->pgno);
9800: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
9810: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
9820: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  ./*.** If the ce
9830: 6c 6c 20 77 69 74 68 20 69 6e 64 65 78 20 69 43  ll with index iC
9840: 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67  ell on page pPag
9850: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  e contains a poi
9860: 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76  nter.** to an ov
9870: 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73  erflow page, ins
9880: 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74  ert an entry int
9890: 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
98a0: 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65  p.** for the ove
98b0: 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73  rflow page..*/.s
98c0: 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70  tatic int ptrmap
98d0: 50 75 74 4f 76 66 6c 28 4d 65 6d 50 61 67 65 20  PutOvfl(MemPage 
98e0: 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c  *pPage, int iCel
98f0: 6c 29 7b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 3b  l){.  u8 *pCell;
9900: 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 4f  .  pCell = findO
9910: 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 67  verflowCell(pPag
9920: 65 2c 20 69 43 65 6c 6c 29 3b 0a 20 20 72 65 74  e, iCell);.  ret
9930: 75 72 6e 20 70 74 72 6d 61 70 50 75 74 4f 76 66  urn ptrmapPutOvf
9940: 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
9950: 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f  l);.}.#endif.../
9960: 2a 20 41 20 62 75 6e 63 68 20 6f 66 20 61 73 73  * A bunch of ass
9970: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
9980: 20 74 6f 20 63 68 65 63 6b 20 74 68 65 20 74 72   to check the tr
9990: 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20  ansaction state 
99a0: 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f 66 20  variables.** of 
99b0: 68 61 6e 64 6c 65 20 70 20 28 74 79 70 65 20 42  handle p (type B
99c0: 74 72 65 65 2a 29 20 61 72 65 20 69 6e 74 65 72  tree*) are inter
99d0: 6e 61 6c 6c 79 20 63 6f 6e 73 69 73 74 65 6e 74  nally consistent
99e0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 62 74 72  ..*/.#define btr
99f0: 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 20 5c  eeIntegrity(p) \
9a00: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e  .  assert( p->in
9a10: 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans!=TRANS_NON
9a20: 45 20 7c 7c 20 70 2d 3e 70 42 74 2d 3e 6e 54 72  E || p->pBt->nTr
9a30: 61 6e 73 61 63 74 69 6f 6e 3c 70 2d 3e 70 42 74  ansaction<p->pBt
9a40: 2d 3e 6e 52 65 66 20 29 3b 20 5c 0a 20 20 61 73  ->nRef ); \.  as
9a50: 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 6e 54  sert( p->pBt->nT
9a60: 72 61 6e 73 61 63 74 69 6f 6e 3c 3d 70 2d 3e 70  ransaction<=p->p
9a70: 42 74 2d 3e 6e 52 65 66 20 29 3b 20 5c 0a 20 20  Bt->nRef ); \.  
9a80: 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e  assert( p->pBt->
9a90: 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d 54  inTransaction!=T
9aa0: 52 41 4e 53 5f 4e 4f 4e 45 20 7c 7c 20 70 2d 3e  RANS_NONE || p->
9ab0: 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
9ac0: 6e 3d 3d 30 20 29 3b 20 5c 0a 20 20 61 73 73 65  n==0 ); \.  asse
9ad0: 72 74 28 20 70 2d 3e 70 42 74 2d 3e 69 6e 54 72  rt( p->pBt->inTr
9ae0: 61 6e 73 61 63 74 69 6f 6e 3e 3d 70 2d 3e 69 6e  ansaction>=p->in
9af0: 54 72 61 6e 73 20 29 3b 20 0a 0a 2f 2a 0a 2a 2a  Trans ); ../*.**
9b00: 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20   Defragment the 
9b10: 70 61 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c  page given.  All
9b20: 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64   Cells are moved
9b30: 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f   to the.** end o
9b40: 66 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 61  f the page and a
9b50: 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20 69 73  ll free space is
9b60: 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20   collected into 
9b70: 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42  one.** big FreeB
9b80: 6c 6b 20 74 68 61 74 20 6f 63 63 75 72 73 20 69  lk that occurs i
9b90: 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 68 65  n between the he
9ba0: 61 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a  ader and cell.**
9bb0: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61   pointer array a
9bc0: 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  nd the cell cont
9bd0: 65 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61  ent area..*/.sta
9be0: 74 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65  tic int defragme
9bf0: 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  ntPage(MemPage *
9c00: 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pPage){.  int i;
9c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c20: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
9c30: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63  nter */.  int pc
9c40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9c50: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
9c60: 6f 66 20 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a  of a i-th cell *
9c70: 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20  /.  int addr;   
9c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9c90: 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73  * Offset of firs
9ca0: 74 20 62 79 74 65 20 61 66 74 65 72 20 63 65 6c  t byte after cel
9cb0: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  l pointer array 
9cc0: 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
9cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ce0: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
9cf0: 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
9d00: 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20    int size;     
9d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9d20: 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a  Size of a cell *
9d30: 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  /.  int usableSi
9d40: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
9d50: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62  * Number of usab
9d60: 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61  le bytes on a pa
9d70: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  ge */.  int cell
9d80: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
9d90: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
9da0: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
9db0: 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
9dc0: 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  brk;            
9dd0: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
9de0: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
9df0: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69  tent area */.  i
9e00: 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20  nt nCell;       
9e10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
9e20: 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20  ber of cells on 
9e30: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e  the page */.  un
9e40: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
9e50: 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  a;       /* The 
9e60: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75  page data */.  u
9e70: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65  nsigned char *te
9e80: 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  mp;       /* Tem
9e90: 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20  p area for cell 
9ea0: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73  content */..  as
9eb0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
9ec0: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
9ed0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
9ee0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9ef0: 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ->pBt!=0 );.  as
9f00: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
9f10: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20  ->usableSize <= 
9f20: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
9f30: 53 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIZE );.  assert
9f40: 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
9f50: 6f 77 3d 3d 30 20 29 3b 0a 20 20 74 65 6d 70 20  ow==0 );.  temp 
9f60: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
9f70: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65  pPage->pBt->page
9f80: 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 74 65  Size );.  if( te
9f90: 6d 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  mp==0 ) return S
9fa0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 64  QLITE_NOMEM;.  d
9fb0: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
9fc0: 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67  ta;.  hdr = pPag
9fd0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
9fe0: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61  cellOffset = pPa
9ff0: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a  ge->cellOffset;.
a000: 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d    nCell = pPage-
a010: 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74  >nCell;.  assert
a020: 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74  ( nCell==get2byt
a030: 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20  e(&data[hdr+3]) 
a040: 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20  );.  usableSize 
a050: 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  = pPage->pBt->us
a060: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 62 72 6b 20  ableSize;.  brk 
a070: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
a080: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63  [hdr+5]);.  memc
a090: 70 79 28 26 74 65 6d 70 5b 62 72 6b 5d 2c 20 26  py(&temp[brk], &
a0a0: 64 61 74 61 5b 62 72 6b 5d 2c 20 75 73 61 62 6c  data[brk], usabl
a0b0: 65 53 69 7a 65 20 2d 20 62 72 6b 29 3b 0a 20 20  eSize - brk);.  
a0c0: 62 72 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  brk = usableSize
a0d0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
a0e0: 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
a0f0: 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f  u8 *pAddr;     /
a100: 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  * The i-th cell 
a110: 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70  pointer */.    p
a120: 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c  Addr = &data[cel
a130: 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a  lOffset + i*2];.
a140: 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74      pc = get2byt
a150: 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20 61 73  e(pAddr);.    as
a160: 73 65 72 74 28 20 70 63 3c 70 50 61 67 65 2d 3e  sert( pc<pPage->
a170: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
a180: 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 63 65  );.    size = ce
a190: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
a1a0: 20 26 74 65 6d 70 5b 70 63 5d 29 3b 0a 20 20 20   &temp[pc]);.   
a1b0: 20 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20   brk -= size;.  
a1c0: 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 62    memcpy(&data[b
a1d0: 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63 5d 2c 20  rk], &temp[pc], 
a1e0: 73 69 7a 65 29 3b 0a 20 20 20 20 70 75 74 32 62  size);.    put2b
a1f0: 79 74 65 28 70 41 64 64 72 2c 20 62 72 6b 29 3b  yte(pAddr, brk);
a200: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 62  .  }.  assert( b
a210: 72 6b 3e 3d 63 65 6c 6c 4f 66 66 73 65 74 2b 32  rk>=cellOffset+2
a220: 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20 70 75 74 32  *nCell );.  put2
a230: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
a240: 5d 2c 20 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b  ], brk);.  data[
a250: 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61  hdr+1] = 0;.  da
a260: 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20  ta[hdr+2] = 0;. 
a270: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30   data[hdr+7] = 0
a280: 3b 0a 20 20 61 64 64 72 20 3d 20 63 65 6c 6c 4f  ;.  addr = cellO
a290: 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 3b 0a 20  ffset+2*nCell;. 
a2a0: 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 61 64   memset(&data[ad
a2b0: 64 72 5d 2c 20 30 2c 20 62 72 6b 2d 61 64 64 72  dr], 0, brk-addr
a2c0: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
a2d0: 74 65 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  temp);.  return 
a2e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
a2f0: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79  .** Allocate nBy
a300: 74 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  te bytes of spac
a310: 65 20 6f 6e 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  e on a page..**.
a320: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  ** Return the in
a330: 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e  dex into pPage->
a340: 61 44 61 74 61 5b 5d 20 6f 66 20 74 68 65 20 66  aData[] of the f
a350: 69 72 73 74 20 62 79 74 65 20 6f 66 0a 2a 2a 20  irst byte of.** 
a360: 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69  the new allocati
a370: 6f 6e 2e 20 4f 72 20 72 65 74 75 72 6e 20 30 20  on. Or return 0 
a380: 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20  if there is not 
a390: 65 6e 6f 75 67 68 20 66 72 65 65 0a 2a 2a 20 73  enough free.** s
a3a0: 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65  pace on the page
a3b0: 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 20   to satisfy the 
a3c0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 72 65 71 75 65  allocation reque
a3d0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  st..**.** If the
a3e0: 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e   page contains n
a3f0: 42 79 74 65 73 20 6f 66 20 66 72 65 65 20 73 70  Bytes of free sp
a400: 61 63 65 20 62 75 74 20 64 6f 65 73 20 6e 6f 74  ace but does not
a410: 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 42 79 74   contain.** nByt
a420: 65 73 20 6f 66 20 63 6f 6e 74 69 67 75 6f 75 73  es of contiguous
a430: 20 66 72 65 65 20 73 70 61 63 65 2c 20 74 68 65   free space, the
a440: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  n this routine a
a450: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 2a 2a 20  utomatically.** 
a460: 63 61 6c 6c 73 20 64 65 66 72 61 67 65 6d 65 6e  calls defragemen
a470: 74 50 61 67 65 28 29 20 74 6f 20 63 6f 6e 73 6f  tPage() to conso
a480: 6c 69 64 61 74 65 20 61 6c 6c 20 66 72 65 65 20  lidate all free 
a490: 73 70 61 63 65 20 62 65 66 6f 72 65 20 0a 2a 2a  space before .**
a4a0: 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20   allocating the 
a4b0: 6e 65 77 20 63 68 75 6e 6b 2e 0a 2a 2f 0a 73 74  new chunk..*/.st
a4c0: 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
a4d0: 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a  eSpace(MemPage *
a4e0: 70 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65  pPage, int nByte
a4f0: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 70  ){.  int addr, p
a500: 63 2c 20 68 64 72 3b 0a 20 20 69 6e 74 20 73 69  c, hdr;.  int si
a510: 7a 65 3b 0a 20 20 69 6e 74 20 6e 46 72 61 67 3b  ze;.  int nFrag;
a520: 0a 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 69 6e  .  int top;.  in
a530: 74 20 6e 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 63  t nCell;.  int c
a540: 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 75 6e 73  ellOffset;.  uns
a550: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
a560: 3b 0a 20 20 0a 20 20 64 61 74 61 20 3d 20 70 50  ;.  .  data = pP
a570: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 61 73  age->aData;.  as
a580: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
a590: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
a5a0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
a5b0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
a5c0: 2d 3e 70 42 74 20 29 3b 0a 20 20 69 66 28 20 6e  ->pBt );.  if( n
a5d0: 42 79 74 65 3c 34 20 29 20 6e 42 79 74 65 20 3d  Byte<4 ) nByte =
a5e0: 20 34 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   4;.  if( pPage-
a5f0: 3e 6e 46 72 65 65 3c 6e 42 79 74 65 20 7c 7c 20  >nFree<nByte || 
a600: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
a610: 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  >0 ) return 0;. 
a620: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d   pPage->nFree -=
a630: 20 6e 42 79 74 65 3b 0a 20 20 68 64 72 20 3d 20   nByte;.  hdr = 
a640: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
a650: 3b 0a 0a 20 20 6e 46 72 61 67 20 3d 20 64 61 74  ;..  nFrag = dat
a660: 61 5b 68 64 72 2b 37 5d 3b 0a 20 20 69 66 28 20  a[hdr+7];.  if( 
a670: 6e 46 72 61 67 3c 36 30 20 29 7b 0a 20 20 20 20  nFrag<60 ){.    
a680: 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20 66 72  /* Search the fr
a690: 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66  eelist looking f
a6a0: 6f 72 20 61 20 73 6c 6f 74 20 62 69 67 20 65 6e  or a slot big en
a6b0: 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66 79 20  ough to satisfy 
a6c0: 74 68 65 0a 20 20 20 20 2a 2a 20 73 70 61 63 65  the.    ** space
a6d0: 20 72 65 71 75 65 73 74 2e 20 2a 2f 0a 20 20 20   request. */.   
a6e0: 20 61 64 64 72 20 3d 20 68 64 72 2b 31 3b 0a 20   addr = hdr+1;. 
a6f0: 20 20 20 77 68 69 6c 65 28 20 28 70 63 20 3d 20     while( (pc = 
a700: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61  get2byte(&data[a
a710: 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20  ddr]))>0 ){.    
a720: 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74    size = get2byt
a730: 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a  e(&data[pc+2]);.
a740: 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3e 3d        if( size>=
a750: 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20  nByte ){.       
a760: 20 69 66 28 20 73 69 7a 65 3c 6e 42 79 74 65 2b   if( size<nByte+
a770: 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  4 ){.          m
a780: 65 6d 63 70 79 28 26 64 61 74 61 5b 61 64 64 72  emcpy(&data[addr
a790: 5d 2c 20 26 64 61 74 61 5b 70 63 5d 2c 20 32 29  ], &data[pc], 2)
a7a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 64 61 74 61  ;.          data
a7b0: 5b 68 64 72 2b 37 5d 20 3d 20 6e 46 72 61 67 20  [hdr+7] = nFrag 
a7c0: 2b 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a  + size - nByte;.
a7d0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
a7e0: 20 70 63 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   pc;.        }el
a7f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75  se{.          pu
a800: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b  t2byte(&data[pc+
a810: 32 5d 2c 20 73 69 7a 65 2d 6e 42 79 74 65 29 3b  2], size-nByte);
a820: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
a830: 6e 20 70 63 20 2b 20 73 69 7a 65 20 2d 20 6e 42  n pc + size - nB
a840: 79 74 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  yte;.        }. 
a850: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 64 64       }.      add
a860: 72 20 3d 20 70 63 3b 0a 20 20 20 20 7d 0a 20 20  r = pc;.    }.  
a870: 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
a880: 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65   memory from the
a890: 20 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20   gap in between 
a8a0: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
a8b0: 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20   array.  ** and 
a8c0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
a8d0: 20 61 72 65 61 2e 0a 20 20 2a 2f 0a 20 20 74 6f   area..  */.  to
a8e0: 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
a8f0: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6e 43  ta[hdr+5]);.  nC
a900: 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26  ell = get2byte(&
a910: 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20  data[hdr+3]);.  
a920: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61  cellOffset = pPa
a930: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a  ge->cellOffset;.
a940: 20 20 69 66 28 20 6e 46 72 61 67 3e 3d 36 30 20    if( nFrag>=60 
a950: 7c 7c 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  || cellOffset + 
a960: 32 2a 6e 43 65 6c 6c 20 3e 20 74 6f 70 20 2d 20  2*nCell > top - 
a970: 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 69 66 28  nByte ){.    if(
a980: 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28   defragmentPage(
a990: 70 50 61 67 65 29 20 29 20 72 65 74 75 72 6e 20  pPage) ) return 
a9a0: 30 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74  0;.    top = get
a9b0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
a9c0: 35 5d 29 3b 0a 20 20 7d 0a 20 20 74 6f 70 20 2d  5]);.  }.  top -
a9d0: 3d 20 6e 42 79 74 65 3b 0a 20 20 61 73 73 65 72  = nByte;.  asser
a9e0: 74 28 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  t( cellOffset + 
a9f0: 32 2a 6e 43 65 6c 6c 20 3c 3d 20 74 6f 70 20 29  2*nCell <= top )
aa00: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
aa10: 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b  ta[hdr+5], top);
aa20: 0a 20 20 72 65 74 75 72 6e 20 74 6f 70 3b 0a 7d  .  return top;.}
aa30: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
aa40: 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20   section of the 
aa50: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20  pPage->aData to 
aa60: 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a  the freelist..**
aa70: 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20   The first byte 
aa80: 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65 65 20  of the new free 
aa90: 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e  block is pPage->
aaa0: 61 44 69 73 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20  aDisk[start].** 
aab0: 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
aac0: 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 22 73 69  the block is "si
aad0: 7a 65 22 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a  ze" bytes..**.**
aae0: 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 65 66 66   Most of the eff
aaf0: 6f 72 74 20 68 65 72 65 20 69 73 20 69 6e 76 6f  ort here is invo
ab00: 6c 76 65 64 20 69 6e 20 63 6f 61 6c 65 73 69 6e  lved in coalesin
ab10: 67 20 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 66 72  g adjacent.** fr
ab20: 65 65 20 62 6c 6f 63 6b 73 20 69 6e 74 6f 20 61  ee blocks into a
ab30: 20 73 69 6e 67 6c 65 20 62 69 67 20 66 72 65 65   single big free
ab40: 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69   block..*/.stati
ab50: 63 20 76 6f 69 64 20 66 72 65 65 53 70 61 63 65  c void freeSpace
ab60: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
ab70: 20 69 6e 74 20 73 74 61 72 74 2c 20 69 6e 74 20   int start, int 
ab80: 73 69 7a 65 29 7b 0a 20 20 69 6e 74 20 61 64 64  size){.  int add
ab90: 72 2c 20 70 62 65 67 69 6e 2c 20 68 64 72 3b 0a  r, pbegin, hdr;.
aba0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
abb0: 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61  *data = pPage->a
abc0: 44 61 74 61 3b 0a 0a 20 20 61 73 73 65 72 74 28  Data;..  assert(
abd0: 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
abe0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
abf0: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
ac00: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
ac10: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
ac20: 20 73 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68   start>=pPage->h
ac30: 64 72 4f 66 66 73 65 74 2b 36 2b 28 70 50 61 67  drOffset+6+(pPag
ac40: 65 2d 3e 6c 65 61 66 3f 30 3a 34 29 20 29 3b 0a  e->leaf?0:4) );.
ac50: 20 20 61 73 73 65 72 74 28 20 28 73 74 61 72 74    assert( (start
ac60: 20 2b 20 73 69 7a 65 29 3c 3d 70 50 61 67 65 2d   + size)<=pPage-
ac70: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
ac80: 20 29 3b 0a 20 20 69 66 28 20 73 69 7a 65 3c 34   );.  if( size<4
ac90: 20 29 20 73 69 7a 65 20 3d 20 34 3b 0a 0a 23 69   ) size = 4;..#i
aca0: 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55  fdef SQLITE_SECU
acb0: 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20 4f  RE_DELETE.  /* O
acc0: 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64  verwrite deleted
acd0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74   information wit
ace0: 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74 68 65  h zeros when the
acf0: 20 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 0a   SECURE_DELETE .
ad00: 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65    ** option is e
ad10: 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c  nabled at compil
ad20: 65 2d 74 69 6d 65 20 2a 2f 0a 20 20 6d 65 6d 73  e-time */.  mems
ad30: 65 74 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c  et(&data[start],
ad40: 20 30 2c 20 73 69 7a 65 29 3b 0a 23 65 6e 64 69   0, size);.#endi
ad50: 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20  f..  /* Add the 
ad60: 73 70 61 63 65 20 62 61 63 6b 20 69 6e 74 6f 20  space back into 
ad70: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
ad80: 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 2a 2f  of freeblocks */
ad90: 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
ada0: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 61 64 64  hdrOffset;.  add
adb0: 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 77  r = hdr + 1;.  w
adc0: 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20  hile( (pbegin = 
add0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61  get2byte(&data[a
ade0: 64 64 72 5d 29 29 3c 73 74 61 72 74 20 26 26 20  ddr]))<start && 
adf0: 70 62 65 67 69 6e 3e 30 20 29 7b 0a 20 20 20 20  pbegin>0 ){.    
ae00: 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d  assert( pbegin<=
ae10: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
ae20: 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20  leSize-4 );.    
ae30: 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61  assert( pbegin>a
ae40: 64 64 72 20 29 3b 0a 20 20 20 20 61 64 64 72 20  ddr );.    addr 
ae50: 3d 20 70 62 65 67 69 6e 3b 0a 20 20 7d 0a 20 20  = pbegin;.  }.  
ae60: 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d  assert( pbegin<=
ae70: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
ae80: 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 61 73  leSize-4 );.  as
ae90: 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64  sert( pbegin>add
aea0: 72 20 7c 7c 20 70 62 65 67 69 6e 3d 3d 30 20 29  r || pbegin==0 )
aeb0: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
aec0: 74 61 5b 61 64 64 72 5d 2c 20 73 74 61 72 74 29  ta[addr], start)
aed0: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
aee0: 74 61 5b 73 74 61 72 74 5d 2c 20 70 62 65 67 69  ta[start], pbegi
aef0: 6e 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  n);.  put2byte(&
af00: 64 61 74 61 5b 73 74 61 72 74 2b 32 5d 2c 20 73  data[start+2], s
af10: 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ize);.  pPage->n
af20: 46 72 65 65 20 2b 3d 20 73 69 7a 65 3b 0a 0a 20  Free += size;.. 
af30: 20 2f 2a 20 43 6f 61 6c 65 73 63 65 20 61 64 6a   /* Coalesce adj
af40: 61 63 65 6e 74 20 66 72 65 65 20 62 6c 6f 63 6b  acent free block
af50: 73 20 2a 2f 0a 20 20 61 64 64 72 20 3d 20 70 50  s */.  addr = pP
af60: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2b  age->hdrOffset +
af70: 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62   1;.  while( (pb
af80: 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28  egin = get2byte(
af90: 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 20  &data[addr]))>0 
afa0: 29 7b 0a 20 20 20 20 69 6e 74 20 70 6e 65 78 74  ){.    int pnext
afb0: 2c 20 70 73 69 7a 65 3b 0a 20 20 20 20 61 73 73  , psize;.    ass
afc0: 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72  ert( pbegin>addr
afd0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
afe0: 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70  pbegin<=pPage->p
aff0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  Bt->usableSize-4
b000: 20 29 3b 0a 20 20 20 20 70 6e 65 78 74 20 3d 20   );.    pnext = 
b010: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
b020: 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70 73 69  begin]);.    psi
b030: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ze = get2byte(&d
b040: 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a  ata[pbegin+2]);.
b050: 20 20 20 20 69 66 28 20 70 62 65 67 69 6e 20 2b      if( pbegin +
b060: 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20 70 6e   psize + 3 >= pn
b070: 65 78 74 20 26 26 20 70 6e 65 78 74 3e 30 20 29  ext && pnext>0 )
b080: 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 72 61 67  {.      int frag
b090: 20 3d 20 70 6e 65 78 74 20 2d 20 28 70 62 65 67   = pnext - (pbeg
b0a0: 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20 20 20  in+psize);.     
b0b0: 20 61 73 73 65 72 74 28 20 66 72 61 67 3c 3d 64   assert( frag<=d
b0c0: 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
b0d0: 66 73 65 74 2b 37 5d 20 29 3b 0a 20 20 20 20 20  fset+7] );.     
b0e0: 20 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72   data[pPage->hdr
b0f0: 4f 66 66 73 65 74 2b 37 5d 20 2d 3d 20 66 72 61  Offset+7] -= fra
b100: 67 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74  g;.      put2byt
b110: 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c  e(&data[pbegin],
b120: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
b130: 70 6e 65 78 74 5d 29 29 3b 0a 20 20 20 20 20 20  pnext]));.      
b140: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  put2byte(&data[p
b150: 62 65 67 69 6e 2b 32 5d 2c 20 70 6e 65 78 74 2b  begin+2], pnext+
b160: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
b170: 6e 65 78 74 2b 32 5d 29 2d 70 62 65 67 69 6e 29  next+2])-pbegin)
b180: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
b190: 20 20 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e     addr = pbegin
b1a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
b1b0: 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  * If the cell co
b1c0: 6e 74 65 6e 74 20 61 72 65 61 20 62 65 67 69 6e  ntent area begin
b1d0: 73 20 77 69 74 68 20 61 20 66 72 65 65 62 6c 6f  s with a freeblo
b1e0: 63 6b 2c 20 72 65 6d 6f 76 65 20 69 74 2e 20 2a  ck, remove it. *
b1f0: 2f 0a 20 20 69 66 28 20 64 61 74 61 5b 68 64 72  /.  if( data[hdr
b200: 2b 31 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 35 5d  +1]==data[hdr+5]
b210: 20 26 26 20 64 61 74 61 5b 68 64 72 2b 32 5d 3d   && data[hdr+2]=
b220: 3d 64 61 74 61 5b 68 64 72 2b 36 5d 20 29 7b 0a  =data[hdr+6] ){.
b230: 20 20 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 20      int top;.   
b240: 20 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79   pbegin = get2by
b250: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29  te(&data[hdr+1])
b260: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
b270: 74 61 5b 68 64 72 2b 31 5d 2c 20 26 64 61 74 61  ta[hdr+1], &data
b280: 5b 70 62 65 67 69 6e 5d 2c 20 32 29 3b 0a 20 20  [pbegin], 2);.  
b290: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
b2a0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
b2b0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
b2c0: 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 20 2b  ta[hdr+5], top +
b2d0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
b2e0: 70 62 65 67 69 6e 2b 32 5d 29 29 3b 0a 20 20 7d  pbegin+2]));.  }
b2f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65  .}../*.** Decode
b300: 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20   the flags byte 
b310: 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20  (the first byte 
b320: 6f 66 20 74 68 65 20 68 65 61 64 65 72 29 20 66  of the header) f
b330: 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64  or a page.** and
b340: 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c   initialize fiel
b350: 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67  ds of the MemPag
b360: 65 20 73 74 72 75 63 74 75 72 65 20 61 63 63 6f  e structure acco
b370: 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 73 74 61 74  rdingly..*/.stat
b380: 69 63 20 76 6f 69 64 20 64 65 63 6f 64 65 46 6c  ic void decodeFl
b390: 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ags(MemPage *pPa
b3a0: 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65  ge, int flagByte
b3b0: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
b3c0: 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70  Bt;     /* A cop
b3d0: 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20  y of pPage->pBt 
b3e0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
b3f0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d  age->hdrOffset==
b400: 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20  (pPage->pgno==1 
b410: 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20  ? 100 : 0) );.  
b420: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20  pPage->intKey = 
b430: 28 66 6c 61 67 42 79 74 65 20 26 20 28 50 54 46  (flagByte & (PTF
b440: 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46  _INTKEY|PTF_LEAF
b450: 44 41 54 41 29 29 21 3d 30 3b 0a 20 20 70 50 61  DATA))!=0;.  pPa
b460: 67 65 2d 3e 7a 65 72 6f 44 61 74 61 20 3d 20 28  ge->zeroData = (
b470: 66 6c 61 67 42 79 74 65 20 26 20 50 54 46 5f 5a  flagByte & PTF_Z
b480: 45 52 4f 44 41 54 41 29 21 3d 30 3b 0a 20 20 70  ERODATA)!=0;.  p
b490: 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 66 6c  Page->leaf = (fl
b4a0: 61 67 42 79 74 65 20 26 20 50 54 46 5f 4c 45 41  agByte & PTF_LEA
b4b0: 46 29 21 3d 30 3b 0a 20 20 70 50 61 67 65 2d 3e  F)!=0;.  pPage->
b4c0: 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34  childPtrSize = 4
b4d0: 2a 28 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30  *(pPage->leaf==0
b4e0: 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65  );.  pBt = pPage
b4f0: 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 66 6c 61  ->pBt;.  if( fla
b500: 67 42 79 74 65 20 26 20 50 54 46 5f 4c 45 41 46  gByte & PTF_LEAF
b510: 44 41 54 41 20 29 7b 0a 20 20 20 20 70 50 61 67  DATA ){.    pPag
b520: 65 2d 3e 6c 65 61 66 44 61 74 61 20 3d 20 31 3b  e->leafData = 1;
b530: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c  .    pPage->maxL
b540: 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c  ocal = pBt->maxL
b550: 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  eaf;.    pPage->
b560: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  minLocal = pBt->
b570: 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65  minLeaf;.  }else
b580: 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6c 65 61  {.    pPage->lea
b590: 66 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70  fData = 0;.    p
b5a0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d  Page->maxLocal =
b5b0: 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a   pBt->maxLocal;.
b5c0: 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f      pPage->minLo
b5d0: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f  cal = pBt->minLo
b5e0: 63 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  cal;.  }.  pPage
b5f0: 2d 3e 68 61 73 44 61 74 61 20 3d 20 21 28 70 50  ->hasData = !(pP
b600: 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61 20 7c 7c  age->zeroData ||
b610: 20 28 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 26   (!pPage->leaf &
b620: 26 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74  & pPage->leafDat
b630: 61 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  a));.}../*.** In
b640: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61 75 78  itialize the aux
b650: 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69  iliary informati
b660: 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20 62 6c  on for a disk bl
b670: 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ock..**.** The p
b680: 50 61 72 65 6e 74 20 70 61 72 61 6d 65 74 65 72  Parent parameter
b690: 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e 74   must be a point
b6a0: 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67  er to the MemPag
b6b0: 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 74 68  e which.** is th
b6c0: 65 20 70 61 72 65 6e 74 20 6f 66 20 74 68 65 20  e parent of the 
b6d0: 70 61 67 65 20 62 65 69 6e 67 20 69 6e 69 74 69  page being initi
b6e0: 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 72 6f 6f  alized.  The roo
b6f0: 74 20 6f 66 20 61 0a 2a 2a 20 42 54 72 65 65 20  t of a.** BTree 
b700: 68 61 73 20 6e 6f 20 70 61 72 65 6e 74 20 61 6e  has no parent an
b710: 64 20 73 6f 20 66 6f 72 20 74 68 61 74 20 70 61  d so for that pa
b720: 67 65 2c 20 70 50 61 72 65 6e 74 3d 3d 4e 55 4c  ge, pParent==NUL
b730: 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  L..**.** Return 
b740: 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
b750: 63 65 73 73 2e 20 20 49 66 20 77 65 20 73 65 65  cess.  If we see
b760: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 64   that the page d
b770: 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61  oes.** not conta
b780: 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  in a well-formed
b790: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20   database page, 
b7a0: 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20  then return .** 
b7b0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20  SQLITE_CORRUPT. 
b7c0: 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65 74   Note that a ret
b7d0: 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b  urn of SQLITE_OK
b7e0: 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61   does not.** gua
b7f0: 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20  rantee that the 
b800: 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72  page is well-for
b810: 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68  med.  It only sh
b820: 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20 66  ows that.** we f
b830: 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20  ailed to detect 
b840: 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  any corruption..
b850: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
b860: 69 74 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67  itPage(.  MemPag
b870: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
b880: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20   /* The page to 
b890: 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a  be initialized *
b8a0: 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
b8b0: 72 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 54 68  rent       /* Th
b8c0: 65 20 70 61 72 65 6e 74 2e 20 20 4d 69 67 68 74  e parent.  Might
b8d0: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   be NULL */.){. 
b8e0: 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20   int pc;        
b8f0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
b900: 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69  f a freeblock wi
b910: 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74  thin pPage->aDat
b920: 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72  a[] */.  int hdr
b930: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  ;           /* O
b940: 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69  ffset to beginni
b950: 6e 67 20 6f 66 20 70 61 67 65 20 68 65 61 64 65  ng of page heade
b960: 72 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  r */.  u8 *data;
b970: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75            /* Equ
b980: 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61  al to pPage->aDa
b990: 74 61 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  ta */.  BtShared
b9a0: 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a   *pBt;        /*
b9b0: 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20   The main btree 
b9c0: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69  structure */.  i
b9d0: 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20  nt usableSize;  
b9e0: 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75    /* Amount of u
b9f0: 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65  sable space on e
ba00: 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ach page */.  in
ba10: 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20  t cellOffset;   
ba20: 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20   /* Offset from 
ba30: 73 74 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f  start of page to
ba40: 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e   first cell poin
ba50: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72  ter */.  int nFr
ba60: 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ee;         /* N
ba70: 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20  umber of unused 
ba80: 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67  bytes on the pag
ba90: 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20  e */.  int top; 
baa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
bab0: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63  st byte of the c
bac0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
bad0: 20 2a 2f 0a 0a 20 20 70 42 74 20 3d 20 70 50 61   */..  pBt = pPa
bae0: 67 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72  ge->pBt;.  asser
baf0: 74 28 20 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  t( pBt!=0 );.  a
bb00: 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 3d 3d  ssert( pParent==
bb10: 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 70 42  0 || pParent->pB
bb20: 74 3d 3d 70 42 74 20 29 3b 0a 20 20 61 73 73 65  t==pBt );.  asse
bb30: 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d  rt( pPage->pgno=
bb40: 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67  =sqlite3PagerPag
bb50: 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70  enumber(pPage->p
bb60: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
bb70: 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
bb80: 61 20 3d 3d 20 26 28 28 75 6e 73 69 67 6e 65 64  a == &((unsigned
bb90: 20 63 68 61 72 2a 29 70 50 61 67 65 29 5b 2d 70   char*)pPage)[-p
bba0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 20 29 3b  Bt->pageSize] );
bbb0: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 50  .  if( pPage->pP
bbc0: 61 72 65 6e 74 21 3d 70 50 61 72 65 6e 74 20 26  arent!=pParent &
bbd0: 26 20 28 70 50 61 67 65 2d 3e 70 50 61 72 65 6e  & (pPage->pParen
bbe0: 74 21 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 69  t!=0 || pPage->i
bbf0: 73 49 6e 69 74 29 20 29 7b 0a 20 20 20 20 2f 2a  sInit) ){.    /*
bc00: 20 54 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   The parent page
bc10: 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 63 68   should never ch
bc20: 61 6e 67 65 20 75 6e 6c 65 73 73 20 74 68 65 20  ange unless the 
bc30: 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74 20  file is corrupt 
bc40: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
bc50: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
bc60: 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  T;.  }.  if( pPa
bc70: 67 65 2d 3e 69 73 49 6e 69 74 20 29 20 72 65 74  ge->isInit ) ret
bc80: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
bc90: 20 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61 72   if( pPage->pPar
bca0: 65 6e 74 3d 3d 30 20 26 26 20 70 50 61 72 65 6e  ent==0 && pParen
bcb0: 74 21 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67  t!=0 ){.    pPag
bcc0: 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 50 61  e->pParent = pPa
bcd0: 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  rent;.    sqlite
bce0: 33 50 61 67 65 72 52 65 66 28 70 50 61 72 65 6e  3PagerRef(pParen
bcf0: 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  t->pDbPage);.  }
bd00: 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
bd10: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 64 61 74  hdrOffset;.  dat
bd20: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
bd30: 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28  ;.  decodeFlags(
bd40: 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72 5d  pPage, data[hdr]
bd50: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65  );.  pPage->nOve
bd60: 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 70 50 61  rflow = 0;.  pPa
bd70: 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 30  ge->idxShift = 0
bd80: 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ;.  usableSize =
bd90: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
bda0: 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  ;.  pPage->cellO
bdb0: 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73  ffset = cellOffs
bdc0: 65 74 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20  et = hdr + 12 - 
bdd0: 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20  4*pPage->leaf;. 
bde0: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28   top = get2byte(
bdf0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
be00: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20   pPage->nCell = 
be10: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
be20: 64 72 2b 33 5d 29 3b 0a 20 20 69 66 28 20 70 50  dr+3]);.  if( pP
be30: 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45  age->nCell>MX_CE
be40: 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f  LL(pBt) ){.    /
be50: 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20  * To many cells 
be60: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67  for a single pag
be70: 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d 75 73  e.  The page mus
be80: 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a  t be corrupt */.
be90: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
bea0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
beb0: 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d    }.  if( pPage-
bec0: 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 70 50 61  >nCell==0 && pPa
bed0: 72 65 6e 74 21 3d 30 20 26 26 20 70 50 61 72 65  rent!=0 && pPare
bee0: 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 7b 0a 20  nt->pgno!=1 ){. 
bef0: 20 20 20 2f 2a 20 41 6c 6c 20 70 61 67 65 73 20     /* All pages 
bf00: 6d 75 73 74 20 68 61 76 65 20 61 74 20 6c 65 61  must have at lea
bf10: 73 74 20 6f 6e 65 20 63 65 6c 6c 2c 20 65 78 63  st one cell, exc
bf20: 65 70 74 20 66 6f 72 20 72 6f 6f 74 20 70 61 67  ept for root pag
bf30: 65 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  es */.    return
bf40: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
bf50: 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BKPT;.  }..  /* 
bf60: 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61  Compute the tota
bf70: 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f 6e 20  l free space on 
bf80: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 70 63  the page */.  pc
bf90: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
bfa0: 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 6e 46 72  a[hdr+1]);.  nFr
bfb0: 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d  ee = data[hdr+7]
bfc0: 20 2b 20 74 6f 70 20 2d 20 28 63 65 6c 6c 4f 66   + top - (cellOf
bfd0: 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e  fset + 2*pPage->
bfe0: 6e 43 65 6c 6c 29 3b 0a 20 20 77 68 69 6c 65 28  nCell);.  while(
bff0: 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74   pc>0 ){.    int
c000: 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20   next, size;.   
c010: 20 69 66 28 20 70 63 3e 75 73 61 62 6c 65 53 69   if( pc>usableSi
c020: 7a 65 2d 34 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ze-4 ){.      /*
c030: 20 46 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 6f   Free block is o
c040: 66 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  ff the page */. 
c050: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
c060: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
c070: 20 0a 20 20 20 20 7d 0a 20 20 20 20 6e 65 78 74   .    }.    next
c080: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
c090: 61 5b 70 63 5d 29 3b 0a 20 20 20 20 73 69 7a 65  a[pc]);.    size
c0a0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
c0b0: 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 69 66  a[pc+2]);.    if
c0c0: 28 20 6e 65 78 74 3e 30 20 26 26 20 6e 65 78 74  ( next>0 && next
c0d0: 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29 7b 0a 20  <=pc+size+3 ){. 
c0e0: 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f       /* Free blo
c0f0: 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61  cks must be in a
c100: 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a  ccending order *
c110: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
c120: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
c130: 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 6e  PT; .    }.    n
c140: 46 72 65 65 20 2b 3d 20 73 69 7a 65 3b 0a 20 20  Free += size;.  
c150: 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 7d    pc = next;.  }
c160: 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
c170: 3d 20 6e 46 72 65 65 3b 0a 20 20 69 66 28 20 6e  = nFree;.  if( n
c180: 46 72 65 65 3e 3d 75 73 61 62 6c 65 53 69 7a 65  Free>=usableSize
c190: 20 29 7b 0a 20 20 20 20 2f 2a 20 46 72 65 65 20   ){.    /* Free 
c1a0: 73 70 61 63 65 20 63 61 6e 6e 6f 74 20 65 78 63  space cannot exc
c1b0: 65 65 64 20 74 6f 74 61 6c 20 70 61 67 65 20 73  eed total page s
c1c0: 69 7a 65 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ize */.    retur
c1d0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
c1e0: 5f 42 4b 50 54 3b 20 0a 20 20 7d 0a 0a 20 20 70  _BKPT; .  }..  p
c1f0: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31  Page->isInit = 1
c200: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
c210: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
c220: 65 74 20 75 70 20 61 20 72 61 77 20 70 61 67 65  et up a raw page
c230: 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b   so that it look
c240: 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73  s like a databas
c250: 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a  e page holding.*
c260: 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f  * no entries..*/
c270: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72  .static void zer
c280: 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  oPage(MemPage *p
c290: 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29  Page, int flags)
c2a0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
c2b0: 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d  r *data = pPage-
c2c0: 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72  >aData;.  BtShar
c2d0: 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
c2e0: 3e 70 42 74 3b 0a 20 20 69 6e 74 20 68 64 72 20  >pBt;.  int hdr 
c2f0: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
c300: 65 74 3b 0a 20 20 69 6e 74 20 66 69 72 73 74 3b  et;.  int first;
c310: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
c320: 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
c330: 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  er(pPage->pDbPag
c340: 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20  e)==pPage->pgno 
c350: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 26 64 61  );.  assert( &da
c360: 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ta[pBt->pageSize
c370: 5d 20 3d 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  ] == (unsigned c
c380: 68 61 72 2a 29 70 50 61 67 65 20 29 3b 0a 20 20  har*)pPage );.  
c390: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
c3a0: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
c3b0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
c3c0: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  );.  memset(&dat
c3d0: 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e  a[hdr], 0, pBt->
c3e0: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72  usableSize - hdr
c3f0: 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d  );.  data[hdr] =
c400: 20 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20   flags;.  first 
c410: 3d 20 68 64 72 20 2b 20 38 20 2b 20 34 2a 28 28  = hdr + 8 + 4*((
c420: 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d  flags&PTF_LEAF)=
c430: 3d 30 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  =0);.  memset(&d
c440: 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34  ata[hdr+1], 0, 4
c450: 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  );.  data[hdr+7]
c460: 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65   = 0;.  put2byte
c470: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70  (&data[hdr+5], p
c480: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b  Bt->usableSize);
c490: 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
c4a0: 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
c4b0: 65 20 2d 20 66 69 72 73 74 3b 0a 20 20 64 65 63  e - first;.  dec
c4c0: 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20  odeFlags(pPage, 
c4d0: 66 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d  flags);.  pPage-
c4e0: 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 68 64 72  >hdrOffset = hdr
c4f0: 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  ;.  pPage->cellO
c500: 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20  ffset = first;. 
c510: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
c520: 77 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e  w = 0;.  pPage->
c530: 69 64 78 53 68 69 66 74 20 3d 20 30 3b 0a 20 20  idxShift = 0;.  
c540: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30  pPage->nCell = 0
c550: 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  ;.  pPage->isIni
c560: 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 1;.}../*.** 
c570: 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
c580: 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74  the pager.  Init
c590: 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61  ialize the MemPa
c5a0: 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65  ge.pBt and.** Me
c5b0: 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d  mPage.aData elem
c5c0: 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a  ents if needed..
c5d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
c5e0: 74 50 61 67 65 28 42 74 53 68 61 72 65 64 20 2a  tPage(BtShared *
c5f0: 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  pBt, Pgno pgno, 
c600: 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
c610: 2c 20 69 6e 74 20 63 6c 72 46 6c 61 67 29 7b 0a  , int clrFlag){.
c620: 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
c630: 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 44 62  age *pPage;.  Db
c640: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a  Page *pDbPage;..
c650: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
c660: 67 65 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e  gerAcquire(pBt->
c670: 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44  pPager, pgno, (D
c680: 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65  bPage**)&pDbPage
c690: 2c 20 63 6c 72 46 6c 61 67 29 3b 0a 20 20 69 66  , clrFlag);.  if
c6a0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
c6b0: 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d  ;.  pPage = (Mem
c6c0: 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61  Page *)sqlite3Pa
c6d0: 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62 50  gerGetExtra(pDbP
c6e0: 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61  age);.  pPage->a
c6f0: 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61  Data = sqlite3Pa
c700: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
c710: 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44  ge);.  pPage->pD
c720: 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 3b  bPage = pDbPage;
c730: 0a 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20  .  pPage->pBt = 
c740: 70 42 74 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67  pBt;.  pPage->pg
c750: 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61  no = pgno;.  pPa
c760: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20  ge->hdrOffset = 
c770: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f  pPage->pgno==1 ?
c780: 20 31 30 30 20 3a 20 30 3b 0a 20 20 2a 70 70 50   100 : 0;.  *ppP
c790: 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 69  age = pPage;.  i
c7a0: 66 28 20 63 6c 72 46 6c 61 67 20 29 7b 0a 20 20  f( clrFlag ){.  
c7b0: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f    sqlite3PagerDo
c7c0: 6e 74 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  ntRollback(pPage
c7d0: 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a  ->pDbPage);.  }.
c7e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c7f0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  OK;.}../*.** Get
c800: 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
c810: 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74 69   pager and initi
c820: 61 6c 69 7a 65 20 69 74 2e 20 20 54 68 69 73 20  alize it.  This 
c830: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 6a 75  routine.** is ju
c840: 73 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65  st a convenience
c850: 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20   wrapper around 
c860: 73 65 70 61 72 61 74 65 20 63 61 6c 6c 73 20 74  separate calls t
c870: 6f 0a 2a 2a 20 67 65 74 50 61 67 65 28 29 20 61  o.** getPage() a
c880: 6e 64 20 69 6e 69 74 50 61 67 65 28 29 2e 0a 2a  nd initPage()..*
c890: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
c8a0: 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42  AndInitPage(.  B
c8b0: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
c8c0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
c8d0: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
c8e0: 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
c8f0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
c900: 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 67  of the page to g
c910: 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  et */.  MemPage 
c920: 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
c930: 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20 70  Write the page p
c940: 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 20  ointer here */. 
c950: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
c960: 74 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20  t     /* Parent 
c970: 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 29  of the page */.)
c980: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  {.  int rc;.  if
c990: 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20  ( pgno==0 ){.   
c9a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
c9b0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
c9c0: 7d 0a 20 20 72 63 20 3d 20 67 65 74 50 61 67 65  }.  rc = getPage
c9d0: 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61  (pBt, pgno, ppPa
c9e0: 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  ge, 0);.  if( rc
c9f0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28  ==SQLITE_OK && (
ca00: 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74  *ppPage)->isInit
ca10: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
ca20: 69 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67 65  initPage(*ppPage
ca30: 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a  , pParent);.  }.
ca40: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
ca50: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
ca60: 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73  MemPage.  This s
ca70: 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
ca80: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 72  once for each pr
ca90: 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 67  ior.** call to g
caa0: 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  etPage..*/.stati
cab0: 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61  c void releasePa
cac0: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
cad0: 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 20  e){.  if( pPage 
cae0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
caf0: 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
cb00: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
cb10: 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20 61 73 73  ->pBt );.    ass
cb20: 65 72 74 28 20 26 70 50 61 67 65 2d 3e 61 44 61  ert( &pPage->aDa
cb30: 74 61 5b 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70  ta[pPage->pBt->p
cb40: 61 67 65 53 69 7a 65 5d 3d 3d 28 75 6e 73 69 67  ageSize]==(unsig
cb50: 6e 65 64 20 63 68 61 72 2a 29 70 50 61 67 65 20  ned char*)pPage 
cb60: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
cb70: 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 2d 3e  gerUnref(pPage->
cb80: 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a  pDbPage);.  }.}.
cb90: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
cba0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
cbb0: 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  en the reference
cbc0: 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67   count for a pag
cbd0: 65 0a 2a 2a 20 72 65 61 63 68 65 73 20 7a 65 72  e.** reaches zer
cbe0: 6f 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 75  o.  We need to u
cbf0: 6e 72 65 66 20 74 68 65 20 70 50 61 72 65 6e 74  nref the pParent
cc00: 20 70 6f 69 6e 74 65 72 20 77 68 65 6e 20 74 68   pointer when th
cc10: 61 74 0a 2a 2a 20 68 61 70 70 65 6e 73 2e 0a 2a  at.** happens..*
cc20: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
cc30: 67 65 44 65 73 74 72 75 63 74 6f 72 28 44 62 50  geDestructor(DbP
cc40: 61 67 65 20 2a 70 44 61 74 61 2c 20 69 6e 74 20  age *pData, int 
cc50: 70 61 67 65 53 69 7a 65 29 7b 0a 20 20 4d 65 6d  pageSize){.  Mem
cc60: 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61  Page *pPage;.  a
cc70: 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65  ssert( (pageSize
cc80: 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 70 50   & 7)==0 );.  pP
cc90: 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a  age = (MemPage *
cca0: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
ccb0: 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20  Extra(pData);.  
ccc0: 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65  if( pPage->pPare
ccd0: 6e 74 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  nt ){.    MemPag
cce0: 65 20 2a 70 50 61 72 65 6e 74 20 3d 20 70 50 61  e *pParent = pPa
ccf0: 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20  ge->pParent;.   
cd00: 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20   pPage->pParent 
cd10: 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  = 0;.    release
cd20: 50 61 67 65 28 70 50 61 72 65 6e 74 29 3b 0a 20  Page(pParent);. 
cd30: 20 7d 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e   }.  pPage->isIn
cd40: 69 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  it = 0;.}../*.**
cd50: 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   During a rollba
cd60: 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67  ck, when the pag
cd70: 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72  er reloads infor
cd80: 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  mation into the 
cd90: 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74  cache.** so that
cda0: 20 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65   the cache is re
cdb0: 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72  stored to its or
cdc0: 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20  iginal state at 
cdd0: 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20  the start of.** 
cde0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  the transaction,
cdf0: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72   for each page r
ce00: 65 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75  estored this rou
ce10: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
ce20: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
ce30: 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65  ne needs to rese
ce40: 74 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61  t the extra data
ce50: 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20   section at the 
ce60: 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61  end of the.** pa
ce70: 67 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68  ge to agree with
ce80: 20 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61   the restored da
ce90: 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ta..*/.static vo
cea0: 69 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62  id pageReinit(Db
ceb0: 50 61 67 65 20 2a 70 44 61 74 61 2c 20 69 6e 74  Page *pData, int
cec0: 20 70 61 67 65 53 69 7a 65 29 7b 0a 20 20 4d 65   pageSize){.  Me
ced0: 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
cee0: 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a  assert( (pageSiz
cef0: 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 70  e & 7)==0 );.  p
cf00: 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20  Page = (MemPage 
cf10: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
cf20: 74 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20  tExtra(pData);. 
cf30: 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e   if( pPage->isIn
cf40: 69 74 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d  it ){.    pPage-
cf50: 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20  >isInit = 0;.   
cf60: 20 69 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c   initPage(pPage,
cf70: 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 29   pPage->pParent)
cf80: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  ;.  }.}../*.** O
cf90: 70 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 66  pen a database f
cfa0: 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c  ile..** .** zFil
cfb0: 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d  ename is the nam
cfc0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
cfd0: 65 20 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c  e file.  If zFil
cfe0: 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a  ename is NULL.**
cff0: 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20   a new database 
d000: 77 69 74 68 20 61 20 72 61 6e 64 6f 6d 20 6e 61  with a random na
d010: 6d 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20  me is created.  
d020: 54 68 69 73 20 72 61 6e 64 6f 6d 6c 79 20 6e 61  This randomly na
d030: 6d 65 64 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  med.** database 
d040: 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c  file will be del
d050: 65 74 65 64 20 77 68 65 6e 20 73 71 6c 69 74 65  eted when sqlite
d060: 33 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73  3BtreeClose() is
d070: 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 69 6e 74 20   called..*/.int 
d080: 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e  sqlite3BtreeOpen
d090: 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
d0a0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e  zFilename,  /* N
d0b0: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
d0c0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42  containing the B
d0d0: 54 72 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f  Tree database */
d0e0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 70 53 71 6c  .  sqlite3 *pSql
d0f0: 69 74 65 2c 20 20 20 20 20 20 20 2f 2a 20 41 73  ite,       /* As
d100: 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73  sociated databas
d110: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74  e handle */.  Bt
d120: 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20  ree **ppBtree,  
d130: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
d140: 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62   to new Btree ob
d150: 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68 65 72  ject written her
d160: 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
d170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d180: 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  * Options */.){.
d190: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
d1a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
d1b0: 72 65 64 20 70 61 72 74 20 6f 66 20 62 74 72 65  red part of btre
d1c0: 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  e structure */. 
d1d0: 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20 20   Btree *p;      
d1e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
d1f0: 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  le to return */.
d200: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
d210: 6e 52 65 73 65 72 76 65 3b 0a 20 20 75 6e 73 69  nReserve;.  unsi
d220: 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65 61  gned char zDbHea
d230: 64 65 72 5b 31 30 30 5d 3b 0a 23 69 66 20 21 64  der[100];.#if !d
d240: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
d250: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
d260: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
d270: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
d280: 0a 20 20 63 6f 6e 73 74 20 54 68 72 65 61 64 44  .  const ThreadD
d290: 61 74 61 20 2a 70 54 73 64 72 6f 3b 0a 23 65 6e  ata *pTsdro;.#en
d2a0: 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68  dif..  /* Set th
d2b0: 65 20 76 61 72 69 61 62 6c 65 20 69 73 4d 65 6d  e variable isMem
d2c0: 64 62 20 74 6f 20 74 72 75 65 20 66 6f 72 20 61  db to true for a
d2d0: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
d2e0: 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66  base, or .  ** f
d2f0: 61 6c 73 65 20 66 6f 72 20 61 20 66 69 6c 65 2d  alse for a file-
d300: 62 61 73 65 64 20 64 61 74 61 62 61 73 65 2e 20  based database. 
d310: 54 68 69 73 20 73 79 6d 62 6f 6c 20 69 73 20 6f  This symbol is o
d320: 6e 6c 79 20 72 65 71 75 69 72 65 64 20 69 66 0a  nly required if.
d330: 20 20 2a 2a 20 65 69 74 68 65 72 20 6f 66 20 74    ** either of t
d340: 68 65 20 73 68 61 72 65 64 2d 64 61 74 61 20 6f  he shared-data o
d350: 72 20 61 75 74 6f 76 61 63 75 75 6d 20 66 65 61  r autovacuum fea
d360: 74 75 72 65 73 20 61 72 65 20 63 6f 6d 70 69 6c  tures are compil
d370: 65 64 20 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68  ed .  ** into th
d380: 65 20 6c 69 62 72 61 72 79 2e 0a 20 20 2a 2f 0a  e library..  */.
d390: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
d3a0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
d3b0: 43 41 43 48 45 29 20 7c 7c 20 21 64 65 66 69 6e  CACHE) || !defin
d3c0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ed(SQLITE_OMIT_A
d3d0: 55 54 4f 56 41 43 55 55 4d 29 0a 20 20 23 69 66  UTOVACUUM).  #if
d3e0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d3f0: 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 63 6f 6e  MEMORYDB.    con
d400: 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d  st int isMemdb =
d410: 20 30 3b 0a 20 20 23 65 6c 73 65 0a 20 20 20 20   0;.  #else.    
d420: 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64  const int isMemd
d430: 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  b = zFilename &&
d440: 20 21 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61   !strcmp(zFilena
d450: 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3b  me, ":memory:");
d460: 0a 20 20 23 65 6e 64 69 66 0a 23 65 6e 64 69 66  .  #endif.#endif
d470: 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 4d 61  ..  p = sqliteMa
d480: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 42 74 72 65  lloc(sizeof(Btre
d490: 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b  e));.  if( !p ){
d4a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
d4b0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
d4c0: 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
d4d0: 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 70 53  NS_NONE;.  p->pS
d4e0: 71 6c 69 74 65 20 3d 20 70 53 71 6c 69 74 65 3b  qlite = pSqlite;
d4f0: 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69  ..  /* Try to fi
d500: 6e 64 20 61 6e 20 65 78 69 73 74 69 6e 67 20 42  nd an existing B
d510: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 6f  tree structure o
d520: 70 65 6e 65 64 20 6f 6e 20 7a 46 69 6c 65 6e 61  pened on zFilena
d530: 6d 65 2e 20 2a 2f 0a 23 69 66 20 21 64 65 66 69  me. */.#if !defi
d540: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
d550: 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
d560: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
d570: 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20  _OMIT_DISKIO).  
d580: 70 54 73 64 72 6f 20 3d 20 73 71 6c 69 74 65 33  pTsdro = sqlite3
d590: 54 68 72 65 61 64 44 61 74 61 52 65 61 64 4f 6e  ThreadDataReadOn
d5a0: 6c 79 28 29 3b 0a 20 20 69 66 28 20 70 54 73 64  ly();.  if( pTsd
d5b0: 72 6f 2d 3e 75 73 65 53 68 61 72 65 64 44 61 74  ro->useSharedDat
d5c0: 61 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 20 26  a && zFilename &
d5d0: 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20  & !isMemdb ){.  
d5e0: 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74    char *zFullPat
d5f0: 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f  hname = sqlite3O
d600: 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46  sFullPathname(zF
d610: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ilename);.    if
d620: 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ( !zFullPathname
d630: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
d640: 46 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 72  Free(p);.      r
d650: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
d660: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  EM;.    }.    fo
d670: 72 28 70 42 74 3d 70 54 73 64 72 6f 2d 3e 70 42  r(pBt=pTsdro->pB
d680: 74 72 65 65 3b 20 70 42 74 3b 20 70 42 74 3d 70  tree; pBt; pBt=p
d690: 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  Bt->pNext){.    
d6a0: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
d6b0: 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 69  Ref>0 );.      i
d6c0: 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75  f( 0==strcmp(zFu
d6d0: 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69  llPathname, sqli
d6e0: 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65  te3PagerFilename
d6f0: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29 20 29  (pBt->pPager)) )
d700: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74  {.        p->pBt
d710: 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20   = pBt;.        
d720: 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  *ppBtree = p;.  
d730: 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b        pBt->nRef+
d740: 2b 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  +;.        sqlit
d750: 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  eFree(zFullPathn
d760: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ame);.        re
d770: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
d780: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
d790: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75    sqliteFree(zFu
d7a0: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d  llPathname);.  }
d7b0: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20  .#endif..  /*.  
d7c0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
d7d0: 20 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75   asserts make su
d7e0: 72 65 20 74 68 61 74 20 73 74 72 75 63 74 75 72  re that structur
d7f0: 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20 62  es used by the b
d800: 74 72 65 65 20 61 72 65 0a 20 20 2a 2a 20 74 68  tree are.  ** th
d810: 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54  e right size.  T
d820: 68 69 73 20 69 73 20 74 6f 20 67 75 61 72 64 20  his is to guard 
d830: 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61  against size cha
d840: 6e 67 65 73 20 74 68 61 74 20 72 65 73 75 6c 74  nges that result
d850: 0a 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69  .  ** when compi
d860: 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66 65 72  ling on a differ
d870: 65 6e 74 20 61 72 63 68 69 74 65 63 74 75 72 65  ent architecture
d880: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
d890: 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20   sizeof(i64)==8 
d8a0: 7c 7c 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d  || sizeof(i64)==
d8b0: 34 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  4 );.  assert( s
d8c0: 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c  izeof(u64)==8 ||
d8d0: 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20   sizeof(u64)==4 
d8e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a  );.  assert( siz
d8f0: 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20  eof(u32)==4 );. 
d900: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
d910: 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 61 73 73  u16)==2 );.  ass
d920: 65 72 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f  ert( sizeof(Pgno
d930: 29 3d 3d 34 20 29 3b 0a 0a 20 20 70 42 74 20 3d  )==4 );..  pBt =
d940: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
d950: 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20  izeof(*pBt) );. 
d960: 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20   if( pBt==0 ){. 
d970: 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b     *ppBtree = 0;
d980: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
d990: 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  p);.    return S
d9a0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
d9b0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
d9c0: 61 67 65 72 4f 70 65 6e 28 26 70 42 74 2d 3e 70  agerOpen(&pBt->p
d9d0: 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65  Pager, zFilename
d9e0: 2c 20 45 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c  , EXTRA_SIZE, fl
d9f0: 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ags);.  if( rc==
da00: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
da10: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
da20: 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72  erReadFileheader
da30: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a  (pBt->pPager,siz
da40: 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a  eof(zDbHeader),z
da50: 44 62 48 65 61 64 65 72 29 3b 0a 20 20 7d 0a 20  DbHeader);.  }. 
da60: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
da70: 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42  OK ){.    if( pB
da80: 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20  t->pPager ){.   
da90: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43     sqlite3PagerC
daa0: 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72  lose(pBt->pPager
dab0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
dac0: 69 74 65 46 72 65 65 28 70 42 74 29 3b 0a 20 20  iteFree(pBt);.  
dad0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b    sqliteFree(p);
dae0: 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20  .    *ppBtree = 
daf0: 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  0;.    return rc
db00: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 42 74 20 3d  ;.  }.  p->pBt =
db10: 20 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33   pBt;..  sqlite3
db20: 50 61 67 65 72 53 65 74 44 65 73 74 72 75 63 74  PagerSetDestruct
db30: 6f 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  or(pBt->pPager, 
db40: 70 61 67 65 44 65 73 74 72 75 63 74 6f 72 29 3b  pageDestructor);
db50: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  .  sqlite3PagerS
db60: 65 74 52 65 69 6e 69 74 65 72 28 70 42 74 2d 3e  etReiniter(pBt->
db70: 70 50 61 67 65 72 2c 20 70 61 67 65 52 65 69 6e  pPager, pageRein
db80: 69 74 29 3b 0a 20 20 70 42 74 2d 3e 70 43 75 72  it);.  pBt->pCur
db90: 73 6f 72 20 3d 20 30 3b 0a 20 20 70 42 74 2d 3e  sor = 0;.  pBt->
dba0: 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 70 42  pPage1 = 0;.  pB
dbb0: 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 73 71  t->readOnly = sq
dbc0: 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64  lite3PagerIsread
dbd0: 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72  only(pBt->pPager
dbe0: 29 3b 0a 20 20 70 42 74 2d 3e 70 61 67 65 53 69  );.  pBt->pageSi
dbf0: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 7a  ze = get2byte(&z
dc00: 44 62 48 65 61 64 65 72 5b 31 36 5d 29 3b 0a 20  DbHeader[16]);. 
dc10: 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69   if( pBt->pageSi
dc20: 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70  ze<512 || pBt->p
dc30: 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
dc40: 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20  AX_PAGE_SIZE.   
dc50: 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61      || ((pBt->pa
dc60: 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70  geSize-1)&pBt->p
dc70: 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20  ageSize)!=0 ){. 
dc80: 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
dc90: 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
dca0: 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20  T_PAGE_SIZE;.   
dcb0: 20 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72   pBt->maxEmbedFr
dcc0: 61 63 20 3d 20 36 34 3b 20 20 20 2f 2a 20 32 35  ac = 64;   /* 25
dcd0: 25 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 6d 69  % */.    pBt->mi
dce0: 6e 45 6d 62 65 64 46 72 61 63 20 3d 20 33 32 3b  nEmbedFrac = 32;
dcf0: 20 20 20 2f 2a 20 31 32 2e 35 25 20 2a 2f 0a 20     /* 12.5% */. 
dd00: 20 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 46     pBt->minLeafF
dd10: 72 61 63 20 3d 20 33 32 3b 20 20 20 20 2f 2a 20  rac = 32;    /* 
dd20: 31 32 2e 35 25 20 2a 2f 0a 23 69 66 6e 64 65 66  12.5% */.#ifndef
dd30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
dd40: 4f 56 41 43 55 55 4d 0a 20 20 20 20 2f 2a 20 49  OVACUUM.    /* I
dd50: 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65  f the magic name
dd60: 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c   ":memory:" will
dd70: 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65   create an in-me
dd80: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 74  mory database, t
dd90: 68 65 6e 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f  hen.    ** do no
dda0: 74 20 73 65 74 20 74 68 65 20 61 75 74 6f 2d 76  t set the auto-v
ddb0: 61 63 75 75 6d 20 66 6c 61 67 2c 20 65 76 65 6e  acuum flag, even
ddc0: 20 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55   if SQLITE_DEFAU
ddd0: 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  LT_AUTOVACUUM.  
dde0: 20 20 2a 2a 20 69 73 20 74 72 75 65 2e 20 4f 6e    ** is true. On
ddf0: 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
de00: 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   if SQLITE_OMIT_
de10: 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65  MEMORYDB has bee
de20: 6e 20 64 65 66 69 6e 65 64 2c 0a 20 20 20 20 2a  n defined,.    *
de30: 2a 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a  * then ":memory:
de40: 22 20 69 73 20 6a 75 73 74 20 61 20 72 65 67 75  " is just a regu
de50: 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 52  lar file-name. R
de60: 65 73 70 65 63 74 20 74 68 65 20 61 75 74 6f 2d  espect the auto-
de70: 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a 20 64 65  vacuum.    ** de
de80: 66 61 75 6c 74 20 69 6e 20 74 68 69 73 20 63 61  fault in this ca
de90: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  se..    */.    i
dea0: 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
deb0: 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20  !isMemdb ){.    
dec0: 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
ded0: 6d 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  m = SQLITE_DEFAU
dee0: 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3b 0a 20  LT_AUTOVACUUM;. 
def0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
df00: 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20  nReserve = 0;.  
df10: 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 52 65 73 65  }else{.    nRese
df20: 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b  rve = zDbHeader[
df30: 32 30 5d 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 61  20];.    pBt->ma
df40: 78 45 6d 62 65 64 46 72 61 63 20 3d 20 7a 44 62  xEmbedFrac = zDb
df50: 48 65 61 64 65 72 5b 32 31 5d 3b 0a 20 20 20 20  Header[21];.    
df60: 70 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46 72 61  pBt->minEmbedFra
df70: 63 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 32  c = zDbHeader[22
df80: 5d 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 69 6e 4c  ];.    pBt->minL
df90: 65 61 66 46 72 61 63 20 3d 20 7a 44 62 48 65 61  eafFrac = zDbHea
dfa0: 64 65 72 5b 32 33 5d 3b 0a 20 20 20 20 70 42 74  der[23];.    pBt
dfb0: 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20  ->pageSizeFixed 
dfc0: 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 1;.#ifndef SQL
dfd0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
dfe0: 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74  UUM.    pBt->aut
dff0: 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  oVacuum = (get4b
e000: 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33  yte(&zDbHeader[3
e010: 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 4*4])?1:0);.
e020: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 42 74  #endif.  }.  pBt
e030: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  ->usableSize = p
e040: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e  Bt->pageSize - n
e050: 52 65 73 65 72 76 65 3b 0a 20 20 61 73 73 65 72  Reserve;.  asser
e060: 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  t( (pBt->pageSiz
e070: 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a  e & 7)==0 );  /*
e080: 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e   8-byte alignmen
e090: 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f  t of pageSize */
e0a0: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  .  sqlite3PagerS
e0b0: 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
e0c0: 70 50 61 67 65 72 2c 20 70 42 74 2d 3e 70 61 67  pPager, pBt->pag
e0d0: 65 53 69 7a 65 29 3b 0a 0a 23 69 66 20 21 64 65  eSize);..#if !de
e0e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
e0f0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
e100: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
e110: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
e120: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77    /* Add the new
e130: 20 62 74 72 65 65 20 74 6f 20 74 68 65 20 6c 69   btree to the li
e140: 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69  nked list starti
e150: 6e 67 20 61 74 20 54 68 72 65 61 64 44 61 74 61  ng at ThreadData
e160: 2e 70 42 74 72 65 65 2e 0a 20 20 2a 2a 20 54 68  .pBtree..  ** Th
e170: 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65  ere is no chance
e180: 20 74 68 61 74 20 61 20 6d 61 6c 6c 6f 63 28 29   that a malloc()
e190: 20 6d 61 79 20 66 61 69 6c 20 69 6e 73 69 64 65   may fail inside
e1a0: 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 73 71   of the .  ** sq
e1b0: 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28  lite3ThreadData(
e1c0: 29 20 63 61 6c 6c 2c 20 61 73 20 74 68 65 20 54  ) call, as the T
e1d0: 68 72 65 61 64 44 61 74 61 20 73 74 72 75 63 74  hreadData struct
e1e0: 75 72 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c  ure must have al
e1f0: 72 65 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20  ready.  ** been 
e200: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 70 54  allocated for pT
e210: 73 64 72 6f 2d 3e 75 73 65 53 68 61 72 65 64 44  sdro->useSharedD
e220: 61 74 61 20 74 6f 20 62 65 20 6e 6f 6e 2d 7a 65  ata to be non-ze
e230: 72 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ro..  */.  if( p
e240: 54 73 64 72 6f 2d 3e 75 73 65 53 68 61 72 65 64  Tsdro->useShared
e250: 44 61 74 61 20 26 26 20 7a 46 69 6c 65 6e 61 6d  Data && zFilenam
e260: 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b  e && !isMemdb ){
e270: 0a 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20  .    pBt->pNext 
e280: 3d 20 70 54 73 64 72 6f 2d 3e 70 42 74 72 65 65  = pTsdro->pBtree
e290: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 68 72  ;.    sqlite3Thr
e2a0: 65 61 64 44 61 74 61 28 29 2d 3e 70 42 74 72 65  eadData()->pBtre
e2b0: 65 20 3d 20 70 42 74 3b 0a 20 20 7d 0a 23 65 6e  e = pBt;.  }.#en
e2c0: 64 69 66 0a 20 20 70 42 74 2d 3e 6e 52 65 66 20  dif.  pBt->nRef 
e2d0: 3d 20 31 3b 0a 20 20 2a 70 70 42 74 72 65 65 20  = 1;.  *ppBtree 
e2e0: 3d 20 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = p;.  return SQ
e2f0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
e300: 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20  * Close an open 
e310: 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76  database and inv
e320: 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73  alidate all curs
e330: 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ors..*/.int sqli
e340: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74  te3BtreeClose(Bt
e350: 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
e360: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
e370: 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  t;.  BtCursor *p
e380: 43 75 72 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  Cur;..#ifndef SQ
e390: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
e3a0: 5f 43 41 43 48 45 0a 20 20 54 68 72 65 61 64 44  _CACHE.  ThreadD
e3b0: 61 74 61 20 2a 70 54 73 64 3b 0a 23 65 6e 64 69  ata *pTsd;.#endi
e3c0: 66 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c  f..  /* Close al
e3d0: 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64  l cursors opened
e3e0: 20 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65   via this handle
e3f0: 2e 20 20 2a 2f 0a 20 20 70 43 75 72 20 3d 20 70  .  */.  pCur = p
e400: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77  Bt->pCursor;.  w
e410: 68 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20  hile( pCur ){.  
e420: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70    BtCursor *pTmp
e430: 20 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75   = pCur;.    pCu
e440: 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  r = pCur->pNext;
e450: 0a 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70  .    if( pTmp->p
e460: 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20  Btree==p ){.    
e470: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
e480: 6f 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b  oseCursor(pTmp);
e490: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
e4a0: 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63   Rollback any ac
e4b0: 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
e4c0: 20 61 6e 64 20 66 72 65 65 20 74 68 65 20 68 61   and free the ha
e4d0: 6e 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a  ndle structure..
e4e0: 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f    ** The call to
e4f0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
e500: 6c 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e  lback() drops an
e510: 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65  y table-locks he
e520: 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20  ld by.  ** this 
e530: 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73  handle..  */.  s
e540: 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
e550: 61 63 6b 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ack(p);.  sqlite
e560: 46 72 65 65 28 70 29 3b 0a 0a 23 69 66 6e 64 65  Free(p);..#ifnde
e570: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
e580: 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a 20  ARED_CACHE.  /* 
e590: 49 66 20 74 68 65 72 65 20 61 72 65 20 73 74 69  If there are sti
e5a0: 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e  ll other outstan
e5b0: 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
e5c0: 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  to the shared-bt
e5d0: 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75  ree.  ** structu
e5e0: 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20  re, return now. 
e5f0: 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  The remainder of
e600: 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   this procedure 
e610: 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20  cleans .  ** up 
e620: 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
e630: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
e640: 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pBt->nRef>0 );.
e650: 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20    pBt->nRef--;. 
e660: 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 20 29   if( pBt->nRef )
e670: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
e680: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
e690: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 68 61  * Remove the sha
e6a0: 72 65 64 2d 62 74 72 65 65 20 66 72 6f 6d 20 74  red-btree from t
e6b0: 68 65 20 74 68 72 65 61 64 20 77 69 64 65 20 6c  he thread wide l
e6c0: 69 73 74 2e 20 43 61 6c 6c 20 0a 20 20 2a 2a 20  ist. Call .  ** 
e6d0: 54 68 72 65 61 64 44 61 74 61 52 65 61 64 4f 6e  ThreadDataReadOn
e6e0: 6c 79 28 29 20 61 6e 64 20 74 68 65 6e 20 63 61  ly() and then ca
e6f0: 73 74 20 61 77 61 79 20 74 68 65 20 63 6f 6e 73  st away the cons
e700: 74 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68  t property of th
e710: 65 20 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20  e .  ** pointer 
e720: 74 6f 20 61 76 6f 69 64 20 61 6c 6c 6f 63 61 74  to avoid allocat
e730: 69 6e 67 20 74 68 72 65 61 64 20 64 61 74 61 20  ing thread data 
e740: 69 66 20 69 74 20 69 73 20 6e 6f 74 20 72 65 61  if it is not rea
e750: 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 0a 20 20  lly required..  
e760: 2a 2f 0a 20 20 70 54 73 64 20 3d 20 28 54 68 72  */.  pTsd = (Thr
e770: 65 61 64 44 61 74 61 20 2a 29 73 71 6c 69 74 65  eadData *)sqlite
e780: 33 54 68 72 65 61 64 44 61 74 61 52 65 61 64 4f  3ThreadDataReadO
e790: 6e 6c 79 28 29 3b 0a 20 20 69 66 28 20 70 54 73  nly();.  if( pTs
e7a0: 64 2d 3e 70 42 74 72 65 65 3d 3d 70 42 74 20 29  d->pBtree==pBt )
e7b0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  {.    assert( pT
e7c0: 73 64 3d 3d 73 71 6c 69 74 65 33 54 68 72 65 61  sd==sqlite3Threa
e7d0: 64 44 61 74 61 28 29 20 29 3b 0a 20 20 20 20 70  dData() );.    p
e7e0: 54 73 64 2d 3e 70 42 74 72 65 65 20 3d 20 70 42  Tsd->pBtree = pB
e7f0: 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73  t->pNext;.  }els
e800: 65 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  e{.    BtShared 
e810: 2a 70 50 72 65 76 3b 0a 20 20 20 20 66 6f 72 28  *pPrev;.    for(
e820: 70 50 72 65 76 3d 70 54 73 64 2d 3e 70 42 74 72  pPrev=pTsd->pBtr
e830: 65 65 3b 20 70 50 72 65 76 20 26 26 20 70 50 72  ee; pPrev && pPr
e840: 65 76 2d 3e 70 4e 65 78 74 21 3d 70 42 74 3b 20  ev->pNext!=pBt; 
e850: 70 50 72 65 76 3d 70 50 72 65 76 2d 3e 70 4e 65  pPrev=pPrev->pNe
e860: 78 74 29 7b 7d 0a 20 20 20 20 69 66 28 20 70 50  xt){}.    if( pP
e870: 72 65 76 20 29 7b 0a 20 20 20 20 20 20 61 73 73  rev ){.      ass
e880: 65 72 74 28 20 70 54 73 64 3d 3d 73 71 6c 69 74  ert( pTsd==sqlit
e890: 65 33 54 68 72 65 61 64 44 61 74 61 28 29 20 29  e3ThreadData() )
e8a0: 3b 0a 20 20 20 20 20 20 70 50 72 65 76 2d 3e 70  ;.      pPrev->p
e8b0: 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78  Next = pBt->pNex
e8c0: 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  t;.    }.  }.#en
e8d0: 64 69 66 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20  dif..  /* Close 
e8e0: 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 66 72  the pager and fr
e8f0: 65 65 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  ee the shared-bt
e900: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
e910: 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d  .  assert( !pBt-
e920: 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 73 71  >pCursor );.  sq
e930: 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
e940: 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
e950: 69 66 28 20 70 42 74 2d 3e 78 46 72 65 65 53 63  if( pBt->xFreeSc
e960: 68 65 6d 61 20 26 26 20 70 42 74 2d 3e 70 53 63  hema && pBt->pSc
e970: 68 65 6d 61 20 29 7b 0a 20 20 20 20 70 42 74 2d  hema ){.    pBt-
e980: 3e 78 46 72 65 65 53 63 68 65 6d 61 28 70 42 74  >xFreeSchema(pBt
e990: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a  ->pSchema);.  }.
e9a0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 42 74    sqliteFree(pBt
e9b0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 73 71  ->pSchema);.  sq
e9c0: 6c 69 74 65 46 72 65 65 28 70 42 74 29 3b 0a 20  liteFree(pBt);. 
e9d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
e9e0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
e9f0: 67 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ge the busy hand
ea00: 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e  ler callback fun
ea10: 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
ea20: 6c 69 74 65 33 42 74 72 65 65 53 65 74 42 75 73  lite3BtreeSetBus
ea30: 79 48 61 6e 64 6c 65 72 28 42 74 72 65 65 20 2a  yHandler(Btree *
ea40: 70 2c 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  p, BusyHandler *
ea50: 70 48 61 6e 64 6c 65 72 29 7b 0a 20 20 42 74 53  pHandler){.  BtS
ea60: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
ea70: 70 42 74 3b 0a 20 20 70 42 74 2d 3e 70 42 75 73  pBt;.  pBt->pBus
ea80: 79 48 61 6e 64 6c 65 72 20 3d 20 70 48 61 6e 64  yHandler = pHand
ea90: 6c 65 72 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  ler;.  sqlite3Pa
eaa0: 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
eab0: 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  r(pBt->pPager, p
eac0: 48 61 6e 64 6c 65 72 29 3b 0a 20 20 72 65 74 75  Handler);.  retu
ead0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
eae0: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
eaf0: 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e  e limit on the n
eb00: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 61  umber of pages a
eb10: 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65 20 63 61  llowed in the ca
eb20: 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  che..**.** The m
eb30: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
eb40: 20 63 61 63 68 65 20 70 61 67 65 73 20 69 73 20   cache pages is 
eb50: 73 65 74 20 74 6f 20 74 68 65 20 61 62 73 6f 6c  set to the absol
eb60: 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  ute.** value of 
eb70: 6d 78 50 61 67 65 2e 20 20 49 66 20 6d 78 50 61  mxPage.  If mxPa
eb80: 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  ge is negative, 
eb90: 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a  the pager will.*
eba0: 2a 20 6f 70 65 72 61 74 65 20 61 73 79 6e 63 68  * operate asynch
ebb0: 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77 69  ronously - it wi
ebc0: 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64  ll not stop to d
ebd0: 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f  o fsync()s.** to
ebe0: 20 69 6e 73 75 72 65 20 64 61 74 61 20 69 73 20   insure data is 
ebf0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
ec00: 69 73 6b 20 73 75 72 66 61 63 65 20 62 65 66 6f  isk surface befo
ec10: 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67  re.** continuing
ec20: 2e 20 20 54 72 61 6e 73 61 63 74 69 6f 6e 73 20  .  Transactions 
ec30: 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79  still work if sy
ec40: 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66  nchronous is off
ec50: 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74  ,.** and the dat
ec60: 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20  abase cannot be 
ec70: 63 6f 72 72 75 70 74 65 64 20 69 66 20 74 68 69  corrupted if thi
ec80: 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61  s program.** cra
ec90: 73 68 65 73 2e 20 20 42 75 74 20 69 66 20 74 68  shes.  But if th
eca0: 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
ecb0: 65 6d 20 63 72 61 73 68 65 73 20 6f 72 20 74 68  em crashes or th
ecc0: 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72  ere is.** an abr
ecd0: 75 70 74 20 70 6f 77 65 72 20 66 61 69 6c 75 72  upt power failur
ece0: 65 20 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f  e when synchrono
ecf0: 75 73 20 69 73 20 6f 66 66 2c 20 74 68 65 20 64  us is off, the d
ed00: 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64  atabase.** could
ed10: 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69   be left in an i
ed20: 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20  nconsistent and 
ed30: 75 6e 72 65 63 6f 76 65 72 61 62 6c 65 20 73 74  unrecoverable st
ed40: 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e  ate..** Synchron
ed50: 6f 75 73 20 69 73 20 6f 6e 20 62 79 20 64 65 66  ous is on by def
ed60: 61 75 6c 74 20 73 6f 20 64 61 74 61 62 61 73 65  ault so database
ed70: 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 6e   corruption is n
ed80: 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61  ot.** normally a
ed90: 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73   worry..*/.int s
eda0: 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61  qlite3BtreeSetCa
edb0: 63 68 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  cheSize(Btree *p
edc0: 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
edd0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
ede0: 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
edf0: 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73  e3PagerSetCaches
ee00: 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
ee10: 20 6d 78 50 61 67 65 29 3b 0a 20 20 72 65 74 75   mxPage);.  retu
ee20: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
ee30: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
ee40: 65 20 77 61 79 20 64 61 74 61 20 69 73 20 73 79  e way data is sy
ee50: 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 69 6e 20  nced to disk in 
ee60: 6f 72 64 65 72 20 74 6f 20 69 6e 63 72 65 61 73  order to increas
ee70: 65 20 6f 72 20 64 65 63 72 65 61 73 65 0a 2a 2a  e or decrease.**
ee80: 20 68 6f 77 20 77 65 6c 6c 20 74 68 65 20 64 61   how well the da
ee90: 74 61 62 61 73 65 20 72 65 73 69 73 74 73 20 64  tabase resists d
eea0: 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20  amage due to OS 
eeb0: 63 72 61 73 68 65 73 20 61 6e 64 20 70 6f 77 65  crashes and powe
eec0: 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20 20  r.** failures.  
eed0: 4c 65 76 65 6c 20 31 20 69 73 20 74 68 65 20 73  Level 1 is the s
eee0: 61 6d 65 20 61 73 20 61 73 79 6e 63 68 72 6f 6e  ame as asynchron
eef0: 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73 28 29 20  ous (no syncs() 
ef00: 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65  occur and.** the
ef10: 72 65 20 69 73 20 61 20 68 69 67 68 20 70 72 6f  re is a high pro
ef20: 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
ef30: 67 65 29 20 20 4c 65 76 65 6c 20 32 20 69 73 20  ge)  Level 2 is 
ef40: 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20 54 68  the default.  Th
ef50: 65 72 65 0a 2a 2a 20 69 73 20 61 20 76 65 72 79  ere.** is a very
ef60: 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72   low but non-zer
ef70: 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  o probability of
ef80: 20 64 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20   damage.  Level 
ef90: 33 20 72 65 64 75 63 65 73 20 74 68 65 0a 2a 2a  3 reduces the.**
efa0: 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
efb0: 64 61 6d 61 67 65 20 74 6f 20 6e 65 61 72 20 7a  damage to near z
efc0: 65 72 6f 20 62 75 74 20 77 69 74 68 20 61 20 77  ero but with a w
efd0: 72 69 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  rite performance
efe0: 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23   reduction..*/.#
eff0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
f000: 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
f010: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
f020: 65 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  eSetSafetyLevel(
f030: 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6c 65  Btree *p, int le
f040: 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e  vel, int fullSyn
f050: 63 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  c){.  BtShared *
f060: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
f070: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53  sqlite3PagerSetS
f080: 61 66 65 74 79 4c 65 76 65 6c 28 70 42 74 2d 3e  afetyLevel(pBt->
f090: 70 50 61 67 65 72 2c 20 6c 65 76 65 6c 2c 20 66  pPager, level, f
f0a0: 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 72 65 74 75  ullSync);.  retu
f0b0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
f0c0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
f0d0: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
f0e0: 20 67 69 76 65 6e 20 62 74 72 65 65 20 69 73 20   given btree is 
f0f0: 73 65 74 20 74 6f 20 73 61 66 65 74 79 20 6c 65  set to safety le
f100: 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68 65 72  vel 1.  In other
f110: 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74 75 72  .** words, retur
f120: 6e 20 54 52 55 45 20 69 66 20 6e 6f 20 73 79 6e  n TRUE if no syn
f130: 63 28 29 20 6f 63 63 75 72 73 20 6f 6e 20 74 68  c() occurs on th
f140: 65 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f  e disk files..*/
f150: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
f160: 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 42 74  eSyncDisabled(Bt
f170: 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
f180: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
f190: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  t;.  assert( pBt
f1a0: 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20   && pBt->pPager 
f1b0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
f1c0: 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 70  te3PagerNosync(p
f1d0: 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a  Bt->pPager);.}..
f1e0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
f1f0: 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
f200: 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69  RAGMAS) || !defi
f210: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
f220: 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 43 68  VACUUM)./*.** Ch
f230: 61 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c 74  ange the default
f240: 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20   pages size and 
f250: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
f260: 73 65 72 76 65 64 20 62 79 74 65 73 20 70 65 72  served bytes per
f270: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
f280: 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20   page size must 
f290: 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20  be a power of 2 
f2a0: 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20  between 512 and 
f2b0: 36 35 35 33 36 2e 20 20 49 66 20 74 68 65 20 70  65536.  If the p
f2c0: 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70  age.** size supp
f2d0: 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65  lied does not me
f2e0: 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69  et this constrai
f2f0: 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  nt then the page
f300: 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20   size is not.** 
f310: 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50  changed..**.** P
f320: 61 67 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f  age sizes are co
f330: 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20  nstrained to be 
f340: 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73  a power of two s
f350: 6f 20 74 68 61 74 20 74 68 65 20 72 65 67 69 6f  o that the regio
f360: 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61  n.** of the data
f370: 62 61 73 65 20 66 69 6c 65 20 75 73 65 64 20 66  base file used f
f380: 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69  or locking (begi
f390: 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47  nning at PENDING
f3a0: 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69  _BYTE,.** the fi
f3b0: 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68  rst byte past th
f3c0: 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20  e 1GB boundary, 
f3d0: 30 78 34 30 30 30 30 30 30 30 29 20 6e 65 65 64  0x40000000) need
f3e0: 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74  s to occur.** at
f3f0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
f400: 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  f a page..**.** 
f410: 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65  If parameter nRe
f420: 73 65 72 76 65 20 69 73 20 6c 65 73 73 20 74 68  serve is less th
f430: 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  an zero, then th
f440: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  e number of rese
f450: 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65  rved.** bytes pe
f460: 72 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 75  r page is left u
f470: 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74  nchanged..*/.int
f480: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
f490: 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a  PageSize(Btree *
f4a0: 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c  p, int pageSize,
f4b0: 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a   int nReserve){.
f4c0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
f4d0: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20  = p->pBt;.  if( 
f4e0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78  pBt->pageSizeFix
f4f0: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
f500: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
f510: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73  ;.  }.  if( nRes
f520: 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52  erve<0 ){.    nR
f530: 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61  eserve = pBt->pa
f540: 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73  geSize - pBt->us
f550: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20  ableSize;.  }.  
f560: 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31  if( pageSize>=51
f570: 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53  2 && pageSize<=S
f580: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
f590: 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20 20 28  IZE &&.        (
f5a0: 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67  (pageSize-1)&pag
f5b0: 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20  eSize)==0 ){.   
f5c0: 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69   assert( (pageSi
f5d0: 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20  ze & 7)==0 );.  
f5e0: 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
f5f0: 70 50 61 67 65 31 20 26 26 20 21 70 42 74 2d 3e  pPage1 && !pBt->
f600: 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70  pCursor );.    p
f610: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 73  Bt->pageSize = s
f620: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
f630: 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
f640: 65 72 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20  er, pageSize);. 
f650: 20 7d 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65   }.  pBt->usable
f660: 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Size = pBt->page
f670: 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b  Size - nReserve;
f680: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
f690: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
f6a0: 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
f6b0: 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67 65 20  ly defined page 
f6c0: 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  size.*/.int sqli
f6d0: 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 53  te3BtreeGetPageS
f6e0: 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ize(Btree *p){. 
f6f0: 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e   return p->pBt->
f700: 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 69 6e 74 20  pageSize;.}.int 
f710: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52  sqlite3BtreeGetR
f720: 65 73 65 72 76 65 28 42 74 72 65 65 20 2a 70 29  eserve(Btree *p)
f730: 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42  {.  return p->pB
f740: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d  t->pageSize - p-
f750: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
f760: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ;.}.#endif /* !d
f770: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
f780: 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
f790: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
f7a0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d  LITE_OMIT_VACUUM
f7b0: 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  ) */../*.** Chan
f7c0: 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63  ge the 'auto-vac
f7d0: 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66  uum' property of
f7e0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
f7f0: 66 20 74 68 65 20 27 61 75 74 6f 56 61 63 75 75  f the 'autoVacuu
f800: 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  m'.** parameter 
f810: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
f820: 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f  n auto-vacuum mo
f830: 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49  de is enabled. I
f840: 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73  f zero, it.** is
f850: 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64   disabled. The d
f860: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72  efault value for
f870: 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
f880: 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a   property is .**
f890: 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
f8a0: 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  he SQLITE_DEFAUL
f8b0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63  T_AUTOVACUUM mac
f8c0: 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ro..*/.int sqlit
f8d0: 65 33 42 74 72 65 65 53 65 74 41 75 74 6f 56 61  e3BtreeSetAutoVa
f8e0: 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69  cuum(Btree *p, i
f8f0: 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a  nt autoVacuum){.
f900: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
f910: 3d 20 70 2d 3e 70 42 74 3b 3b 0a 23 69 66 64 65  = p->pBt;;.#ifde
f920: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
f930: 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72  TOVACUUM.  retur
f940: 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
f950: 59 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 70  Y;.#else.  if( p
f960: 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
f970: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
f980: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
f990: 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 61 75 74 6f  .  }.  pBt->auto
f9a0: 56 61 63 75 75 6d 20 3d 20 28 61 75 74 6f 56 61  Vacuum = (autoVa
f9b0: 63 75 75 6d 3f 31 3a 30 29 3b 0a 20 20 72 65 74  cuum?1:0);.  ret
f9c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
f9d0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
f9e0: 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
f9f0: 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63  of the 'auto-vac
fa00: 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49  uum' property. I
fa10: 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73  f auto-vacuum is
fa20: 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69   .** enabled 1 i
fa30: 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
fa40: 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20  rwise 0..*/.int 
fa50: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 41  sqlite3BtreeGetA
fa60: 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20  utoVacuum(Btree 
fa70: 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  *p){.#ifdef SQLI
fa80: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
fa90: 55 4d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23  UM.  return 0;.#
faa0: 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 70 2d  else.  return p-
fab0: 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  >pBt->autoVacuum
fac0: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a  ;.#endif.}.../*.
fad0: 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72 65 6e  ** Get a referen
fae0: 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20  ce to pPage1 of 
faf0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
fb00: 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a  e.  This will.**
fb10: 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20   also acquire a 
fb20: 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74  readlock on that
fb30: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c   file..**.** SQL
fb40: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
fb50: 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ed on success.  
fb60: 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e  If the file is n
fb70: 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72  ot a.** well-for
fb80: 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  med database fil
fb90: 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43  e, then SQLITE_C
fba0: 4f 52 52 55 50 54 20 69 73 20 72 65 74 75 72 6e  ORRUPT is return
fbb0: 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55  ed..** SQLITE_BU
fbc0: 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  SY is returned i
fbd0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
fbe0: 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54  s locked.  SQLIT
fbf0: 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65  E_NOMEM.** is re
fc00: 74 75 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e  turned if we run
fc10: 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20   out of memory. 
fc20: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
fc30: 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61 72 65  ockBtree(BtShare
fc40: 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72  d *pBt){.  int r
fc50: 63 2c 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 4d  c, pageSize;.  M
fc60: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
fc70: 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65    if( pBt->pPage
fc80: 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  1 ) return SQLIT
fc90: 45 5f 4f 4b 3b 0a 20 20 72 63 20 3d 20 67 65 74  E_OK;.  rc = get
fca0: 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50  Page(pBt, 1, &pP
fcb0: 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66 28 20  age1, 0);.  if( 
fcc0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
fcd0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 0a 0a 20  return rc;.  .. 
fce0: 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63   /* Do some chec
fcf0: 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73  king to help ins
fd00: 75 72 65 20 74 68 65 20 66 69 6c 65 20 77 65 20  ure the file we 
fd10: 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73  opened really is
fd20: 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61  .  ** a valid da
fd30: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20  tabase file. .  
fd40: 2a 2f 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45  */.  rc = SQLITE
fd50: 5f 4e 4f 54 41 44 42 3b 0a 20 20 69 66 28 20 73  _NOTADB;.  if( s
fd60: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
fd70: 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
fd80: 29 3e 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70  )>0 ){.    u8 *p
fd90: 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61  age1 = pPage1->a
fda0: 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20 6d 65  Data;.    if( me
fdb0: 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67  mcmp(page1, zMag
fdc0: 69 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30  icHeader, 16)!=0
fdd0: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
fde0: 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
fdf0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
fe00: 70 61 67 65 31 5b 31 38 5d 3e 31 20 7c 7c 20 70  page1[18]>1 || p
fe10: 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20  age1[19]>1 ){.  
fe20: 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
fe30: 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
fe40: 7d 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d  }.    pageSize =
fe50: 20 67 65 74 32 62 79 74 65 28 26 70 61 67 65 31   get2byte(&page1
fe60: 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 28  [16]);.    if( (
fe70: 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67  (pageSize-1)&pag
fe80: 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20  eSize)!=0 ){.   
fe90: 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
fea0: 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
feb0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61  .    assert( (pa
fec0: 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
fed0: 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  ;.    pBt->pageS
fee0: 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a  ize = pageSize;.
fef0: 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
ff00: 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d  ize = pageSize -
ff10: 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20   page1[20];.    
ff20: 69 66 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  if( pBt->usableS
ff30: 69 7a 65 3c 35 30 30 20 29 7b 0a 20 20 20 20 20  ize<500 ){.     
ff40: 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
ff50: 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
ff60: 20 20 20 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64     pBt->maxEmbed
ff70: 46 72 61 63 20 3d 20 70 61 67 65 31 5b 32 31 5d  Frac = page1[21]
ff80: 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 69 6e 45 6d  ;.    pBt->minEm
ff90: 62 65 64 46 72 61 63 20 3d 20 70 61 67 65 31 5b  bedFrac = page1[
ffa0: 32 32 5d 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 69  22];.    pBt->mi
ffb0: 6e 4c 65 61 66 46 72 61 63 20 3d 20 70 61 67 65  nLeafFrac = page
ffc0: 31 5b 32 33 5d 3b 0a 23 69 66 6e 64 65 66 20 53  1[23];.#ifndef S
ffd0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
ffe0: 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61  ACUUM.    pBt->a
fff0: 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74  utoVacuum = (get
10000 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20  4byte(&page1[36 
10010 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65  + 4*4])?1:0);.#e
10020 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d  ndif.  }..  /* m
10030 61 78 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d  axLocal is the m
10040 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  aximum amount of
10050 20 70 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72   payload to stor
10060 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20  e locally for.  
10070 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65  ** a cell.  Make
10080 20 73 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c   sure it is smal
10090 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74  l enough so that
100a0 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e   at least minFan
100b0 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63  out.  ** cells c
100c0 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f  an will fit on o
100d0 6e 65 20 70 61 67 65 2e 20 20 57 65 20 61 73 73  ne page.  We ass
100e0 75 6d 65 20 61 20 31 30 2d 62 79 74 65 20 70 61  ume a 10-byte pa
100f0 67 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20  ge header..  ** 
10100 42 65 73 69 64 65 73 20 74 68 65 20 70 61 79 6c  Besides the payl
10110 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75  oad, the cell mu
10120 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20  st store:.  **  
10130 20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65     2-byte pointe
10140 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20  r to the cell.  
10150 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 63 68  **     4-byte ch
10160 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  ild pointer.  **
10170 20 20 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79       9-byte nKey
10180 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20   value.  **     
10190 34 2d 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c  4-byte nData val
101a0 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ue.  **     4-by
101b0 74 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  te overflow page
101c0 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f   pointer.  ** So
101d0 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73   a cell consists
101e0 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69   of a 2-byte poi
101f0 6e 65 72 2c 20 61 20 68 65 61 64 65 72 20 77 68  ner, a header wh
10200 69 63 68 20 69 73 20 61 73 20 6d 75 63 68 20 61  ich is as much a
10210 73 0a 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20  s.  ** 17 bytes 
10220 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74  long, 0 to N byt
10230 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61  es of payload, a
10240 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34  nd an optional 4
10250 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20   byte overflow. 
10260 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72   ** page pointer
10270 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61  ..  */.  pBt->ma
10280 78 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75  xLocal = (pBt->u
10290 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 70 42  sableSize-12)*pB
102a0 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72 61 63 2f  t->maxEmbedFrac/
102b0 32 35 35 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d  255 - 23;.  pBt-
102c0 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 70 42 74  >minLocal = (pBt
102d0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
102e0 2a 70 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46 72  *pBt->minEmbedFr
102f0 61 63 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 70  ac/255 - 23;.  p
10300 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 70 42  Bt->maxLeaf = pB
10310 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
10320 33 35 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65  35;.  pBt->minLe
10330 61 66 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c  af = (pBt->usabl
10340 65 53 69 7a 65 2d 31 32 29 2a 70 42 74 2d 3e 6d  eSize-12)*pBt->m
10350 69 6e 4c 65 61 66 46 72 61 63 2f 32 35 35 20 2d  inLeafFrac/255 -
10360 20 32 33 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e   23;.  if( pBt->
10370 6d 69 6e 4c 6f 63 61 6c 3e 70 42 74 2d 3e 6d 61  minLocal>pBt->ma
10380 78 4c 6f 63 61 6c 20 7c 7c 20 70 42 74 2d 3e 6d  xLocal || pBt->m
10390 61 78 4c 6f 63 61 6c 3c 30 20 29 7b 0a 20 20 20  axLocal<0 ){.   
103a0 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
103b0 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 0a 20 20 61  _failed;.  }.  a
103c0 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c  ssert( pBt->maxL
103d0 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43  eaf + 23 <= MX_C
103e0 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b  ELL_SIZE(pBt) );
103f0 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d  .  pBt->pPage1 =
10400 20 70 50 61 67 65 31 3b 0a 20 20 72 65 74 75 72   pPage1;.  retur
10410 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61  n SQLITE_OK;..pa
10420 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a  ge1_init_failed:
10430 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
10440 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70  Page1);.  pBt->p
10450 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74  Page1 = 0;.  ret
10460 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
10470 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f   This routine wo
10480 72 6b 73 20 6c 69 6b 65 20 6c 6f 63 6b 42 74 72  rks like lockBtr
10490 65 65 28 29 20 65 78 63 65 70 74 20 74 68 61 74  ee() except that
104a0 20 69 74 20 61 6c 73 6f 20 69 6e 76 6f 6b 65 73   it also invokes
104b0 20 74 68 65 0a 2a 2a 20 62 75 73 79 20 63 61 6c   the.** busy cal
104c0 6c 62 61 63 6b 20 69 66 20 74 68 65 72 65 20 69  lback if there i
104d0 73 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f  s lock contentio
104e0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
104f0 20 6c 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65   lockBtreeWithRe
10500 74 72 79 28 42 74 72 65 65 20 2a 70 52 65 66 29  try(Btree *pRef)
10510 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
10520 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 52  ITE_OK;.  if( pR
10530 65 66 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41  ef->inTrans==TRA
10540 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 75  NS_NONE ){.    u
10550 38 20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  8 inTransaction 
10560 3d 20 70 52 65 66 2d 3e 70 42 74 2d 3e 69 6e 54  = pRef->pBt->inT
10570 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20  ransaction;.    
10580 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
10590 52 65 66 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  Ref);.    rc = s
105a0 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
105b0 54 72 61 6e 73 28 70 52 65 66 2c 20 30 29 3b 0a  Trans(pRef, 0);.
105c0 20 20 20 20 70 52 65 66 2d 3e 70 42 74 2d 3e 69      pRef->pBt->i
105d0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 69  nTransaction = i
105e0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20 20  nTransaction;.  
105f0 20 20 70 52 65 66 2d 3e 69 6e 54 72 61 6e 73 20    pRef->inTrans 
10600 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
10610 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
10620 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 52 65  _OK ){.      pRe
10630 66 2d 3e 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  f->pBt->nTransac
10640 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  tion--;.    }.  
10650 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
10660 28 70 52 65 66 29 3b 0a 20 20 7d 0a 20 20 72 65  (pRef);.  }.  re
10670 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 20 20 20 20  turn rc;.}.     
10680 20 20 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65    ../*.** If the
10690 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
106a0 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e  nding cursors an
106b0 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20  d we are not in 
106c0 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66  the middle.** of
106d0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62   a transaction b
106e0 75 74 20 74 68 65 72 65 20 69 73 20 61 20 72 65  ut there is a re
106f0 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
10700 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a  atabase, then.**
10710 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e   this routine un
10720 72 65 66 73 20 74 68 65 20 66 69 72 73 74 20 70  refs the first p
10730 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
10740 61 73 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a  ase file which .
10750 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66 65 63  ** has the effec
10760 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74  t of releasing t
10770 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a  he read lock..**
10780 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
10790 20 61 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67   any outstanding
107a0 20 63 75 72 73 6f 72 73 2c 20 74 68 69 73 20 72   cursors, this r
107b0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
107c0 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  p..**.** If ther
107d0 65 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69  e is a transacti
107e0 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20  on in progress, 
107f0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
10800 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
10810 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74  ic void unlockBt
10820 72 65 65 49 66 55 6e 75 73 65 64 28 42 74 53 68  reeIfUnused(BtSh
10830 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66  ared *pBt){.  if
10840 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
10850 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  tion==TRANS_NONE
10860 20 26 26 20 70 42 74 2d 3e 70 43 75 72 73 6f 72   && pBt->pCursor
10870 3d 3d 30 20 26 26 20 70 42 74 2d 3e 70 50 61 67  ==0 && pBt->pPag
10880 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  e1!=0 ){.    if(
10890 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
108a0 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
108b0 72 29 3e 3d 31 20 29 7b 0a 20 20 20 20 20 20 69  r)>=1 ){.      i
108c0 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  f( pBt->pPage1->
108d0 61 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20  aData==0 ){.    
108e0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
108f0 67 65 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  ge = pBt->pPage1
10900 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 2d  ;.        pPage-
10910 3e 61 44 61 74 61 20 3d 20 26 28 28 75 38 2a 29  >aData = &((u8*)
10920 70 50 61 67 65 29 5b 2d 70 42 74 2d 3e 70 61 67  pPage)[-pBt->pag
10930 65 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20 20  eSize];.        
10940 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74  pPage->pBt = pBt
10950 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 2d  ;.        pPage-
10960 3e 70 67 6e 6f 20 3d 20 31 3b 0a 20 20 20 20 20  >pgno = 1;.     
10970 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65   }.      release
10980 50 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 31  Page(pBt->pPage1
10990 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74  );.    }.    pBt
109a0 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
109b0 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20    pBt->inStmt = 
109c0 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
109d0 43 72 65 61 74 65 20 61 20 6e 65 77 20 64 61 74  Create a new dat
109e0 61 62 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c  abase by initial
109f0 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  izing the first 
10a00 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66  page of the.** f
10a10 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
10a20 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65 28 42  nt newDatabase(B
10a30 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
10a40 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20   MemPage *pP1;. 
10a50 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
10a60 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  data;.  int rc;.
10a70 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
10a80 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
10a90 3e 70 50 61 67 65 72 29 3e 30 20 29 20 72 65 74  >pPager)>0 ) ret
10aa0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
10ab0 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67   pP1 = pBt->pPag
10ac0 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e1;.  assert( pP
10ad0 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d  1!=0 );.  data =
10ae0 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72   pP1->aData;.  r
10af0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
10b00 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61  Write(pP1->pDbPa
10b10 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
10b20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d  return rc;.  mem
10b30 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63  cpy(data, zMagic
10b40 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a  Header, sizeof(z
10b50 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20  MagicHeader));. 
10b60 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
10b70 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31  zMagicHeader)==1
10b80 36 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  6 );.  put2byte(
10b90 26 64 61 74 61 5b 31 36 5d 2c 20 70 42 74 2d 3e  &data[16], pBt->
10ba0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74  pageSize);.  dat
10bb0 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74  a[18] = 1;.  dat
10bc0 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 64 61 74  a[19] = 1;.  dat
10bd0 61 5b 32 30 5d 20 3d 20 70 42 74 2d 3e 70 61 67  a[20] = pBt->pag
10be0 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61  eSize - pBt->usa
10bf0 62 6c 65 53 69 7a 65 3b 0a 20 20 64 61 74 61 5b  bleSize;.  data[
10c00 32 31 5d 20 3d 20 70 42 74 2d 3e 6d 61 78 45 6d  21] = pBt->maxEm
10c10 62 65 64 46 72 61 63 3b 0a 20 20 64 61 74 61 5b  bedFrac;.  data[
10c20 32 32 5d 20 3d 20 70 42 74 2d 3e 6d 69 6e 45 6d  22] = pBt->minEm
10c30 62 65 64 46 72 61 63 3b 0a 20 20 64 61 74 61 5b  bedFrac;.  data[
10c40 32 33 5d 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65  23] = pBt->minLe
10c50 61 66 46 72 61 63 3b 0a 20 20 6d 65 6d 73 65 74  afFrac;.  memset
10c60 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31  (&data[24], 0, 1
10c70 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61  00-24);.  zeroPa
10c80 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b  ge(pP1, PTF_INTK
10c90 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f  EY|PTF_LEAF|PTF_
10ca0 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42  LEAFDATA );.  pB
10cb0 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
10cc0 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 1;.#ifndef SQ
10cd0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
10ce0 43 55 55 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e  CUUM.  if( pBt->
10cf0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
10d00 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61    put4byte(&data
10d10 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 31 29 3b 0a  [36 + 4*4], 1);.
10d20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
10d30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
10d40 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
10d50 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 74  to start a new t
10d60 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72  ransaction. A wr
10d70 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ite-transaction.
10d80 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20 69 66  ** is started if
10d90 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
10da0 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c  ment is nonzero,
10db0 20 6f 74 68 65 72 77 69 73 65 20 61 20 72 65 61   otherwise a rea
10dc0 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  d-.** transactio
10dd0 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e  n.  If the secon
10de0 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20  d argument is 2 
10df0 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c  or more and excl
10e00 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63  usive.** transac
10e10 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c  tion is started,
10e20 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f   meaning that no
10e30 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
10e40 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  s allowed.** to 
10e50 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
10e60 61 73 65 2e 20 20 41 20 70 72 65 65 78 69 73 74  ase.  A preexist
10e70 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ing transaction 
10e80 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70  may not be.** up
10e90 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73  graded to exclus
10ea0 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74  ive by calling t
10eb0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65  his routine a se
10ec0 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a  cond time - the.
10ed0 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20 66  ** exclusivity f
10ee0 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66  lag only works f
10ef0 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  or a new transac
10f00 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72  tion..**.** A wr
10f10 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
10f20 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20  must be started 
10f30 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
10f40 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65  g any .** change
10f50 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
10f60 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20  e.  None of the 
10f70 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
10f80 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b  es .** will work
10f90 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61   unless a transa
10fa0 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64  ction is started
10fb0 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20   first:.**.**   
10fc0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
10fd0 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20  reateTable().** 
10fe0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
10ff0 65 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a  eCreateIndex().*
11000 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
11010 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a  reeClearTable().
11020 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
11030 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a  treeDropTable().
11040 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
11050 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20  treeInsert().** 
11060 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
11070 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20  eDelete().**    
11080 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70    sqlite3BtreeUp
11090 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a  dateMeta().**.**
110a0 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61   If an initial a
110b0 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72  ttempt to acquir
110c0 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73  e the lock fails
110d0 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b   because of lock
110e0 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61   contention.** a
110f0 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
11100 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75  was previously u
11110 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e  nlocked, then in
11120 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
11130 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72  ndler.** if ther
11140 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69  e is one.  But i
11150 66 20 74 68 65 72 65 20 77 61 73 20 70 72 65 76  f there was prev
11160 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f  iously a read-lo
11170 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e  ck, do not.** in
11180 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
11190 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74  ndler - just ret
111a0 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
111b0 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73    SQLITE_BUSY is
111c0 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68   .** returned wh
111d0 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  en there is alre
111e0 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ady a read-lock 
111f0 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69  in order to avoi
11200 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a  d a deadlock..**
11210 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72  .** Suppose ther
11220 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73  e are two proces
11230 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20  ses A and B.  A 
11240 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  has a read lock 
11250 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72  and B has.** a r
11260 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42  eserved lock.  B
11270 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74   tries to promot
11280 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62  e to exclusive b
11290 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65  ut is blocked be
112a0 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20  cause.** of A's 
112b0 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72  read lock.  A tr
112c0 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74  ies to promote t
112d0 6f 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69  o reserved but i
112e0 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a  s blocked by B..
112f0 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74  ** One or the ot
11300 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70  her of the two p
11310 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69  rocesses must gi
11320 76 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20  ve way or there 
11330 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f  can be.** no pro
11340 67 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 72  gress.  By retur
11350 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59  ning SQLITE_BUSY
11360 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e   and not invokin
11370 67 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  g the busy callb
11380 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c  ack.** when A al
11390 72 65 61 64 79 20 68 61 73 20 61 20 72 65 61 64  ready has a read
113a0 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72   lock, we encour
113b0 61 67 65 20 41 20 74 6f 20 67 69 76 65 20 75 70  age A to give up
113c0 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72   and let B.** pr
113d0 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  oceed..*/.int sq
113e0 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
113f0 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69  rans(Btree *p, i
11400 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 42 74  nt wrflag){.  Bt
11410 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
11420 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  >pBt;.  int rc =
11430 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 62   SQLITE_OK;..  b
11440 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
11450 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62  ;..  /* If the b
11460 74 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20  tree is already 
11470 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  in a write-trans
11480 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20  action, or it.  
11490 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ** is already in
114a0 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
114b0 69 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74  ion and a read-t
114c0 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
114d0 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  is requested, th
114e0 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  is is a no-op.. 
114f0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   */.  if( p->inT
11500 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
11510 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73  E || (p->inTrans
11520 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20  ==TRANS_READ && 
11530 21 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20  !wrflag) ){.    
11540 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11550 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74  ;.  }..  /* Writ
11560 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  e transactions a
11570 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  re not possible 
11580 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64  on a read-only d
11590 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28  atabase */.  if(
115a0 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26   pBt->readOnly &
115b0 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
115c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
115d0 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20 2f  ADONLY;.  }..  /
115e0 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74  * If another dat
115f0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73  abase handle has
11600 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20   already opened 
11610 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  a write transact
11620 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69  ion .  ** on thi
11630 73 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 73  s shared-btree s
11640 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 73  tructure and a s
11650 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e  econd write tran
11660 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  saction is.  ** 
11670 72 65 71 75 65 73 74 65 64 2c 20 72 65 74 75 72  requested, retur
11680 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20  n SQLITE_BUSY.. 
11690 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 69   */.  if( pBt->i
116a0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
116b0 41 4e 53 5f 57 52 49 54 45 20 26 26 20 77 72 66  ANS_WRITE && wrf
116c0 6c 61 67 20 29 7b 0a 20 20 20 20 72 65 74 75 72  lag ){.    retur
116d0 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
116e0 20 7d 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69   }..  do {.    i
116f0 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d  f( pBt->pPage1==
11700 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
11710 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29 3b 0a  lockBtree(pBt);.
11720 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
11730 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
11740 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
11750 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
11760 67 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70 50  gerBegin(pBt->pP
11770 61 67 65 31 2d 3e 70 44 62 50 61 67 65 2c 20 77  age1->pDbPage, w
11780 72 66 6c 61 67 3e 31 29 3b 0a 20 20 20 20 20 20  rflag>1);.      
11790 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
117a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
117b0 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42  = newDatabase(pB
117c0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
117d0 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63 3d  }.  .    if( rc=
117e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
117f0 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 20 29      if( wrflag )
11800 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30   pBt->inStmt = 0
11810 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
11820 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
11830 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20  Unused(pBt);.   
11840 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d   }.  }while( rc=
11850 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
11860 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
11870 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  on==TRANS_NONE &
11880 26 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  &.          sqli
11890 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  te3InvokeBusyHan
118a0 64 6c 65 72 28 70 42 74 2d 3e 70 42 75 73 79 48  dler(pBt->pBusyH
118b0 61 6e 64 6c 65 72 29 20 29 3b 0a 0a 20 20 69 66  andler) );..  if
118c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
118d0 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  ){.    if( p->in
118e0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans==TRANS_NON
118f0 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  E ){.      pBt->
11900 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a  nTransaction++;.
11910 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54      }.    p->inT
11920 72 61 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54  rans = (wrflag?T
11930 52 41 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53  RANS_WRITE:TRANS
11940 5f 52 45 41 44 29 3b 0a 20 20 20 20 69 66 28 20  _READ);.    if( 
11950 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e  p->inTrans>pBt->
11960 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b  inTransaction ){
11970 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  .      pBt->inTr
11980 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69  ansaction = p->i
11990 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20  nTrans;.    }.  
119a0 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  }..  btreeIntegr
119b0 69 74 79 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ity(p);.  return
119c0 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
119d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
119e0 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65  VACUUM../*.** Se
119f0 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  t the pointer-ma
11a00 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c  p entries for al
11a10 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61  l children of pa
11a20 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20  ge pPage. Also, 
11a30 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74  if.** pPage cont
11a40 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20  ains cells that 
11a50 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f  point to overflo
11a60 77 20 70 61 67 65 73 2c 20 73 65 74 20 74 68 65  w pages, set the
11a70 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20   pointer.** map 
11a80 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20  entries for the 
11a90 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
11aa0 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  s well..*/.stati
11ab0 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74  c int setChildPt
11ac0 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70  rmaps(MemPage *p
11ad0 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Page){.  int i; 
11ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11af0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
11b00 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20  ounter variable 
11b10 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20  */.  int nCell; 
11b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b30 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
11b40 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61  r of cells in pa
11b50 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e  ge pPage */.  in
11b60 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
11b70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11b80 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
11b90 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
11ba0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
11bb0 0a 20 20 69 6e 74 20 69 73 49 6e 69 74 4f 72 69  .  int isInitOri
11bc0 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  g = pPage->isIni
11bd0 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  t;.  Pgno pgno =
11be0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20   pPage->pgno;.. 
11bf0 20 69 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c   initPage(pPage,
11c00 20 30 29 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70   0);.  nCell = p
11c10 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20  Page->nCell;..  
11c20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
11c30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
11c40 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
11c50 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20  (pPage, i);..   
11c60 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f   rc = ptrmapPutO
11c70 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  vflPtr(pPage, pC
11c80 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ell);.    if( rc
11c90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11ca0 20 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68       goto set_ch
11cb0 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b  ild_ptrmaps_out;
11cc0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
11cd0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
11ce0 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64        Pgno child
11cf0 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
11d00 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 72 63  pCell);.      rc
11d10 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
11d20 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52  , childPgno, PTR
11d30 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29  MAP_BTREE, pgno)
11d40 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
11d50 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
11d60 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61   set_child_ptrma
11d70 70 73 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ps_out;.    }.  
11d80 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  }..  if( !pPage-
11d90 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e  >leaf ){.    Pgn
11da0 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65  o childPgno = ge
11db0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
11dc0 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
11dd0 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 72  ffset+8]);.    r
11de0 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
11df0 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54  t, childPgno, PT
11e00 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f  RMAP_BTREE, pgno
11e10 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c  );.  }..set_chil
11e20 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20  d_ptrmaps_out:. 
11e30 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
11e40 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72   isInitOrig;.  r
11e50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
11e60 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20  ** Somewhere on 
11e70 70 50 61 67 65 2c 20 77 68 69 63 68 20 69 73 20  pPage, which is 
11e80 67 75 61 72 65 6e 74 65 65 64 20 74 6f 20 62 65  guarenteed to be
11e90 20 61 20 62 74 72 65 65 20 70 61 67 65 2c 20 6e   a btree page, n
11ea0 6f 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a  ot an overflow.*
11eb0 2a 20 70 61 67 65 2c 20 69 73 20 61 20 70 6f 69  * page, is a poi
11ec0 6e 74 65 72 20 74 6f 20 70 61 67 65 20 69 46 72  nter to page iFr
11ed0 6f 6d 2e 20 4d 6f 64 69 66 79 20 74 68 69 73 20  om. Modify this 
11ee0 70 6f 69 6e 74 65 72 20 73 6f 20 74 68 61 74 20  pointer so that 
11ef0 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20  it points to.** 
11f00 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20 65  iTo. Parameter e
11f10 54 79 70 65 20 64 65 73 63 72 69 62 65 73 20 74  Type describes t
11f20 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e 74  he type of point
11f30 65 72 20 74 6f 20 62 65 20 6d 6f 64 69 66 69 65  er to be modifie
11f40 64 2c 20 61 73 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  d, as .** follow
11f50 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  s:.**.** PTRMAP_
11f60 42 54 52 45 45 3a 20 20 20 20 20 70 50 61 67 65  BTREE:     pPage
11f70 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65   is a btree-page
11f80 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f  . The pointer po
11f90 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64 20  ints at a child 
11fa0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
11fb0 20 20 20 20 20 20 70 61 67 65 20 6f 66 20 70 50        page of pP
11fc0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  age..**.** PTRMA
11fd0 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50 61  P_OVERFLOW1: pPa
11fe0 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61  ge is a btree-pa
11ff0 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
12000 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76 65  points at an ove
12010 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20  rflow.**        
12020 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20             page 
12030 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e  pointed to by on
12040 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f  e of the cells o
12050 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  n pPage..**.** P
12060 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a  TRMAP_OVERFLOW2:
12070 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65   pPage is an ove
12080 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65 20  rflow-page. The 
12090 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
120a0 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20  t the next.**   
120b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120c0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
120d0 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74   the list..*/.st
120e0 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79 50  atic int modifyP
120f0 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61  agePointer(MemPa
12100 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20  ge *pPage, Pgno 
12110 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c  iFrom, Pgno iTo,
12120 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20 69 66   u8 eType){.  if
12130 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
12140 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20  OVERFLOW2 ){.   
12150 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
12160 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 66 69  is always the fi
12170 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74  rst 4 bytes of t
12180 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  he page in this 
12190 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  case.  */.    if
121a0 28 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65  ( get4byte(pPage
121b0 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20  ->aData)!=iFrom 
121c0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
121d0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
121e0 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  KPT;.    }.    p
121f0 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  ut4byte(pPage->a
12200 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65  Data, iTo);.  }e
12210 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 73 49  lse{.    int isI
12220 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d  nitOrig = pPage-
12230 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74  >isInit;.    int
12240 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c   i;.    int nCel
12250 6c 3b 0a 0a 20 20 20 20 69 6e 69 74 50 61 67 65  l;..    initPage
12260 28 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20  (pPage, 0);.    
12270 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
12280 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69  Cell;..    for(i
12290 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
122a0 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65  ){.      u8 *pCe
122b0 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
122c0 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  age, i);.      i
122d0 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
122e0 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20  _OVERFLOW1 ){.  
122f0 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69        CellInfo i
12300 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 70 61 72  nfo;.        par
12310 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
12320 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
12330 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f          if( info
12340 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  .iOverflow ){.  
12350 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72 6f          if( iFro
12360 6d 3d 3d 67 65 74 34 62 79 74 65 28 26 70 43 65  m==get4byte(&pCe
12370 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
12380 77 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  w]) ){.         
12390 20 20 20 70 75 74 34 62 79 74 65 28 26 70 43 65     put4byte(&pCe
123a0 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
123b0 77 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20  w], iTo);.      
123c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
123d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
123e0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
123f0 20 20 20 20 20 20 20 20 69 66 28 20 67 65 74 34          if( get4
12400 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72  byte(pCell)==iFr
12410 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  om ){.          
12420 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20  put4byte(pCell, 
12430 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iTo);.          
12440 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
12450 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12460 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65   .    if( i==nCe
12470 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ll ){.      if( 
12480 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54  eType!=PTRMAP_BT
12490 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  REE || .        
124a0 20 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67    get4byte(&pPag
124b0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
124c0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69  hdrOffset+8])!=i
124d0 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  From ){.        
124e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
124f0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
12500 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79    }.      put4by
12510 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
12520 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
12530 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20  t+8], iTo);.    
12540 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  }..    pPage->is
12550 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69  Init = isInitOri
12560 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  g;.  }.  return 
12570 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
12580 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70  *.** Move the op
12590 65 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65  en database page
125a0 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61   pDbPage to loca
125b0 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69  tion iFreePage i
125c0 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  n the .** databa
125d0 73 65 2e 20 54 68 65 20 70 44 62 50 61 67 65 20  se. The pDbPage 
125e0 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e  reference remain
125f0 73 20 76 61 6c 69 64 2e 0a 2a 2f 0a 73 74 61 74  s valid..*/.stat
12600 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50  ic int relocateP
12610 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
12620 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20  *pBt,           
12630 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65  /* Btree */.  Me
12640 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20  mPage *pDbPage, 
12650 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70         /* Open p
12660 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20  age to move */. 
12670 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20   u8 eType,      
12680 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
12690 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65 27 20  nter map 'type' 
126a0 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67  entry for pDbPag
126b0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72  e */.  Pgno iPtr
126c0 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
126d0 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27  /* Pointer map '
126e0 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66  page-no' entry f
126f0 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  or pDbPage */.  
12700 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 20 20  Pgno iFreePage  
12710 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
12720 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65  location to move
12730 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 29   pDbPage to */.)
12740 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74  {.  MemPage *pPt
12750 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20  rPage;   /* The 
12760 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
12770 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
12780 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
12790 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44 62 50  o iDbPage = pDbP
127a0 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67  age->pgno;.  Pag
127b0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74  er *pPager = pBt
127c0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
127d0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65  rc;..  assert( e
127e0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
127f0 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d  RFLOW2 || eType=
12800 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
12810 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70  1 || .      eTyp
12820 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
12830 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
12840 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 0a 20 20  _ROOTPAGE );..  
12850 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62  /* Move page iDb
12860 50 61 67 65 20 66 72 6f 6d 20 69 74 27 73 20 63  Page from it's c
12870 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
12880 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  to page number i
12890 46 72 65 65 50 61 67 65 20 2a 2f 0a 20 20 54 52  FreePage */.  TR
128a0 41 43 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d  ACE(("AUTOVACUUM
128b0 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20 66  : Moving %d to f
128c0 72 65 65 20 70 61 67 65 20 25 64 20 28 70 74 72  ree page %d (ptr
128d0 20 70 61 67 65 20 25 64 20 74 79 70 65 20 25 64   page %d type %d
128e0 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69 44 62  )\n", .      iDb
128f0 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c  Page, iFreePage,
12900 20 69 50 74 72 50 61 67 65 2c 20 65 54 79 70 65   iPtrPage, eType
12910 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ));.  rc = sqlit
12920 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28  e3PagerMovepage(
12930 70 50 61 67 65 72 2c 20 70 44 62 50 61 67 65 2d  pPager, pDbPage-
12940 3e 70 44 62 50 61 67 65 2c 20 69 46 72 65 65 50  >pDbPage, iFreeP
12950 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
12960 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12970 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
12980 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20    pDbPage->pgno 
12990 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20  = iFreePage;..  
129a0 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20 77 61  /* If pDbPage wa
129b0 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20  s a btree-page, 
129c0 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65  then it may have
129d0 20 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64   child pages and
129e0 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74  /or cells.  ** t
129f0 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65  hat point to ove
12a00 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65  rflow pages. The
12a10 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
12a20 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65  ries for all the
12a30 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65  se.  ** pages ne
12a40 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64  ed to be changed
12a50 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
12a60 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65  DbPage is an ove
12a70 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e  rflow page, then
12a80 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
12a90 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20  es may store a. 
12aa0 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61   ** pointer to a
12ab0 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72   subsequent over
12ac0 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68  flow page. If th
12ad0 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  is is the case, 
12ae0 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f  then.  ** the po
12af0 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20  inter map needs 
12b00 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 66 6f  to be updated fo
12b10 72 20 74 68 65 20 73 75 62 73 65 71 75 65 6e 74  r the subsequent
12b20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a   overflow page..
12b30 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
12b40 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c  ==PTRMAP_BTREE |
12b50 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
12b60 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
12b70 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72  rc = setChildPtr
12b80 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20  maps(pDbPage);. 
12b90 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
12ba0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
12bb0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
12bc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f   }else{.    Pgno
12bd0 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34   nextOvfl = get4
12be0 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44  byte(pDbPage->aD
12bf0 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65  ata);.    if( ne
12c00 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20  xtOvfl!=0 ){.   
12c10 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
12c20 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c  t(pBt, nextOvfl,
12c30 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
12c40 32 2c 20 69 46 72 65 65 50 61 67 65 29 3b 0a 20  2, iFreePage);. 
12c50 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
12c60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
12c70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
12c80 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
12c90 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74    /* Fix the dat
12ca0 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e  abase pointer on
12cb0 20 70 61 67 65 20 69 50 74 72 50 61 67 65 20 74   page iPtrPage t
12cc0 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69  hat pointed at i
12cd0 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74  DbPage so.  ** t
12ce0 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74  hat it points at
12cf0 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f   iFreePage. Also
12d00 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72   fix the pointer
12d10 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20   map entry for. 
12d20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20   ** iPtrPage..  
12d30 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d  */.  if( eType!=
12d40 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
12d50 29 7b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 50  ){.    rc = getP
12d60 61 67 65 28 70 42 74 2c 20 69 50 74 72 50 61 67  age(pBt, iPtrPag
12d70 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20 30 29  e, &pPtrPage, 0)
12d80 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
12d90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12da0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
12db0 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
12dc0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 74  e3PagerWrite(pPt
12dd0 72 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  rPage->pDbPage);
12de0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
12df0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
12e00 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72  releasePage(pPtr
12e10 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Page);.      ret
12e20 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
12e30 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67    rc = modifyPag
12e40 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67  ePointer(pPtrPag
12e50 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46 72 65  e, iDbPage, iFre
12e60 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20  ePage, eType);. 
12e70 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
12e80 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66  PtrPage);.    if
12e90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
12ea0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74  ){.      rc = pt
12eb0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46 72  rmapPut(pBt, iFr
12ec0 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69  eePage, eType, i
12ed0 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  PtrPage);.    }.
12ee0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
12ef0 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64  .}../* Forward d
12f00 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69  eclaration requi
12f10 72 65 64 20 62 79 20 61 75 74 6f 56 61 63 75 75  red by autoVacuu
12f20 6d 43 6f 6d 6d 69 74 28 29 2e 20 2a 2f 0a 73 74  mCommit(). */.st
12f30 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
12f40 65 42 74 72 65 65 50 61 67 65 28 42 74 53 68 61  eBtreePage(BtSha
12f50 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a  red *, MemPage *
12f60 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c  *, Pgno *, Pgno,
12f70 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   u8);../*.** Thi
12f80 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
12f90 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c  led prior to sql
12fa0 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 20  ite3PagerCommit 
12fb0 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
12fc0 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 65  on.** is commite
12fd0 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61  d for an auto-va
12fe0 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a  cuum database..*
12ff0 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f  *.** If SQLITE_O
13000 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74  K is returned, t
13010 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73 20  hen *pnTrunc is 
13020 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
13030 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74 68  r of pages.** th
13040 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
13050 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61  should be trunca
13060 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20 74 68  ted to during th
13070 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73  e commit process
13080 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64  . .** i.e. the d
13090 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e  atabase has been
130a0 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20   reorganized so 
130b0 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20 66 69  that only the fi
130c0 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20  rst *pnTrunc.** 
130d0 70 61 67 65 73 20 61 72 65 20 69 6e 20 75 73 65  pages are in use
130e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
130f0 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74  autoVacuumCommit
13100 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
13110 50 67 6e 6f 20 2a 70 6e 54 72 75 6e 63 29 7b 0a  Pgno *pnTrunc){.
13120 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
13130 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20  = pBt->pPager;. 
13140 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b   Pgno nFreeList;
13150 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
13160 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 72  umber of pages r
13170 65 6d 61 69 6e 69 6e 67 20 6f 6e 20 74 68 65 20  emaining on the 
13180 66 72 65 65 2d 6c 69 73 74 2e 20 2a 2f 0a 20 20  free-list. */.  
13190 69 6e 74 20 6e 50 74 72 4d 61 70 3b 20 20 20 20  int nPtrMap;    
131a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
131b0 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 2d  mber of pointer-
131c0 6d 61 70 20 70 61 67 65 73 20 64 65 61 6c 6c 6f  map pages deallo
131d0 63 61 74 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20  cated */.  Pgno 
131e0 6f 72 69 67 53 69 7a 65 3b 20 20 20 20 20 20 20  origSize;       
131f0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73 20 69        /* Pages i
13200 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
13210 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 66 69  ile */.  Pgno fi
13220 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  nSize;          
13230 20 20 20 20 2f 2a 20 50 61 67 65 73 20 69 6e 20      /* Pages in 
13240 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
13250 65 20 61 66 74 65 72 20 74 72 75 6e 63 61 74 69  e after truncati
13260 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  on */.  int rc; 
13270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13280 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
13290 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 3b  e */.  u8 eType;
132a0 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 42  .  int pgsz = pB
132b0 74 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 2f 2a  t->pageSize;  /*
132c0 20 50 61 67 65 20 73 69 7a 65 20 66 6f 72 20 74   Page size for t
132d0 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  his database */.
132e0 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65 3b 20    Pgno iDbPage; 
132f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13300 54 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67  The database pag
13310 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 4d  e to move */.  M
13320 65 6d 50 61 67 65 20 2a 70 44 62 4d 65 6d 50 61  emPage *pDbMemPa
13330 67 65 20 3d 20 30 3b 20 20 20 2f 2a 20 22 22 20  ge = 0;   /* "" 
13340 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61  */.  Pgno iPtrPa
13350 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
13360 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74  /* The page that
13370 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
13380 74 65 72 20 74 6f 20 69 44 62 50 61 67 65 20 2a  ter to iDbPage *
13390 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61  /.  Pgno iFreePa
133a0 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ge;            /
133b0 2a 20 54 68 65 20 66 72 65 65 2d 6c 69 73 74 20  * The free-list 
133c0 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 69 44 62  page to move iDb
133d0 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 4d 65 6d  Page to */.  Mem
133e0 50 61 67 65 20 2a 70 46 72 65 65 4d 65 6d 50 61  Page *pFreeMemPa
133f0 67 65 20 3d 20 30 3b 20 2f 2a 20 22 22 20 2a 2f  ge = 0; /* "" */
13400 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
13410 0a 20 20 69 6e 74 20 6e 52 65 66 20 3d 20 73 71  .  int nRef = sq
13420 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
13430 6e 74 28 70 50 61 67 65 72 29 3b 0a 23 65 6e 64  nt(pPager);.#end
13440 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42  if..  assert( pB
13450 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b  t->autoVacuum );
13460 0a 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53  .  if( PTRMAP_IS
13470 50 41 47 45 28 70 42 74 2c 20 73 71 6c 69 74 65  PAGE(pBt, sqlite
13480 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
13490 70 50 61 67 65 72 29 29 20 29 7b 0a 20 20 20 20  pPager)) ){.    
134a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
134b0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
134c0 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
134d0 20 68 6f 77 20 6d 61 6e 79 20 66 72 65 65 2d 70   how many free-p
134e0 61 67 65 73 20 61 72 65 20 69 6e 20 74 68 65 20  ages are in the 
134f0 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65  database. If the
13500 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 66  re are no.  ** f
13510 72 65 65 20 70 61 67 65 73 2c 20 74 68 65 6e 20  ree pages, then 
13520 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 61  auto-vacuum is a
13530 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 6e   no-op..  */.  n
13540 46 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62  FreeList = get4b
13550 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
13560 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
13570 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30  if( nFreeList==0
13580 20 29 7b 0a 20 20 20 20 2a 70 6e 54 72 75 6e 63   ){.    *pnTrunc
13590 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
135a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
135b0 0a 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b  .  /* This block
135c0 20 66 69 67 75 72 65 73 20 6f 75 74 20 68 6f 77   figures out how
135d0 20 6d 61 6e 79 20 70 61 67 65 73 20 74 68 65 72   many pages ther
135e0 65 20 61 72 65 20 69 6e 20 74 68 65 20 64 61 74  e are in the dat
135f0 61 62 61 73 65 0a 20 20 2a 2a 20 6e 6f 77 20 28  abase.  ** now (
13600 76 61 72 69 61 62 6c 65 20 6f 72 69 67 53 69 7a  variable origSiz
13610 65 29 2c 20 61 6e 64 20 68 6f 77 20 6d 61 6e 79  e), and how many
13620 20 74 68 65 72 65 20 77 69 6c 6c 20 62 65 20 61   there will be a
13630 66 74 65 72 20 74 68 65 0a 20 20 2a 2a 20 74 72  fter the.  ** tr
13640 75 6e 63 61 74 69 6f 6e 20 28 76 61 72 69 61 62  uncation (variab
13650 6c 65 20 66 69 6e 53 69 7a 65 29 2e 0a 20 20 2a  le finSize)..  *
13660 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 6e 61 6c  *.  ** The final
13670 20 73 69 7a 65 20 69 73 20 74 68 65 20 6f 72 69   size is the ori
13680 67 69 6e 61 6c 20 73 69 7a 65 2c 20 6c 65 73 73  ginal size, less
13690 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
136a0 72 65 65 20 70 61 67 65 73 0a 20 20 2a 2a 20 69  ree pages.  ** i
136b0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  n the database, 
136c0 6c 65 73 73 20 61 6e 79 20 70 6f 69 6e 74 65 72  less any pointer
136d0 2d 6d 61 70 20 70 61 67 65 73 20 74 68 61 74 20  -map pages that 
136e0 77 69 6c 6c 20 6e 6f 20 6c 6f 6e 67 65 72 0a 20  will no longer. 
136f0 20 2a 2a 20 62 65 20 72 65 71 75 69 72 65 64 2c   ** be required,
13700 20 6c 65 73 73 20 31 20 69 66 20 74 68 65 20 70   less 1 if the p
13710 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67 65  ending-byte page
13720 20 77 61 73 20 70 61 72 74 20 6f 66 20 74 68 65   was part of the
13730 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 62   database.  ** b
13740 75 74 20 69 73 20 6e 6f 74 20 61 66 74 65 72 20  ut is not after 
13750 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 2e 0a  the truncation..
13760 20 20 2a 2a 2f 0a 20 20 6f 72 69 67 53 69 7a 65    **/.  origSize
13770 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
13780 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29  agecount(pPager)
13790 3b 0a 20 20 69 66 28 20 6f 72 69 67 53 69 7a 65  ;.  if( origSize
137a0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
137b0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
137c0 6f 72 69 67 53 69 7a 65 2d 2d 3b 0a 20 20 7d 0a  origSize--;.  }.
137d0 20 20 6e 50 74 72 4d 61 70 20 3d 20 28 6e 46 72    nPtrMap = (nFr
137e0 65 65 4c 69 73 74 2d 6f 72 69 67 53 69 7a 65 2b  eeList-origSize+
137f0 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
13800 74 2c 20 6f 72 69 67 53 69 7a 65 29 2b 70 67 73  t, origSize)+pgs
13810 7a 2f 35 29 2f 28 70 67 73 7a 2f 35 29 3b 0a 20  z/5)/(pgsz/5);. 
13820 20 66 69 6e 53 69 7a 65 20 3d 20 6f 72 69 67 53   finSize = origS
13830 69 7a 65 20 2d 20 6e 46 72 65 65 4c 69 73 74 20  ize - nFreeList 
13840 2d 20 6e 50 74 72 4d 61 70 3b 0a 20 20 69 66 28  - nPtrMap;.  if(
13850 20 6f 72 69 67 53 69 7a 65 3e 50 45 4e 44 49 4e   origSize>PENDIN
13860 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
13870 20 26 26 20 66 69 6e 53 69 7a 65 3c 3d 50 45 4e   && finSize<=PEN
13880 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
13890 42 74 29 20 29 7b 0a 20 20 20 20 66 69 6e 53 69  Bt) ){.    finSi
138a0 7a 65 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  ze--;.  }.  whil
138b0 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  e( PTRMAP_ISPAGE
138c0 28 70 42 74 2c 20 66 69 6e 53 69 7a 65 29 20 7c  (pBt, finSize) |
138d0 7c 20 66 69 6e 53 69 7a 65 3d 3d 50 45 4e 44 49  | finSize==PENDI
138e0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
138f0 29 20 29 7b 0a 20 20 20 20 66 69 6e 53 69 7a 65  ) ){.    finSize
13900 2d 2d 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45 28  --;.  }.  TRACE(
13910 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 42 65  ("AUTOVACUUM: Be
13920 67 69 6e 20 28 64 62 20 73 69 7a 65 20 25 64 2d  gin (db size %d-
13930 3e 25 64 29 5c 6e 22 2c 20 6f 72 69 67 53 69 7a  >%d)\n", origSiz
13940 65 2c 20 66 69 6e 53 69 7a 65 29 29 3b 0a 0a 20  e, finSize));.. 
13950 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 27 66 69   /* Variable 'fi
13960 6e 53 69 7a 65 27 20 77 69 6c 6c 20 62 65 20 74  nSize' will be t
13970 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
13980 69 6c 65 20 69 6e 20 70 61 67 65 73 20 61 66 74  ile in pages aft
13990 65 72 0a 20 20 2a 2a 20 74 68 65 20 61 75 74 6f  er.  ** the auto
139a0 2d 76 61 63 75 75 6d 20 68 61 73 20 63 6f 6d 70  -vacuum has comp
139b0 6c 65 74 65 64 20 28 74 68 65 20 63 75 72 72 65  leted (the curre
139c0 6e 74 20 66 69 6c 65 20 73 69 7a 65 20 6d 69 6e  nt file size min
139d0 75 73 20 74 68 65 20 6e 75 6d 62 65 72 0a 20 20  us the number.  
139e0 2a 2a 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74  ** of pages on t
139f0 68 65 20 66 72 65 65 20 6c 69 73 74 29 2e 20 4c  he free list). L
13a00 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68 65 20  oop through the 
13a10 70 61 67 65 73 20 74 68 61 74 20 6c 69 65 20 62  pages that lie b
13a20 65 79 6f 6e 64 0a 20 20 2a 2a 20 74 68 69 73 20  eyond.  ** this 
13a30 6d 61 72 6b 2c 20 61 6e 64 20 69 66 20 74 68 65  mark, and if the
13a40 79 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64  y are not alread
13a50 79 20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c 69  y on the free li
13a60 73 74 2c 20 6d 6f 76 65 20 74 68 65 6d 0a 20 20  st, move them.  
13a70 2a 2a 20 74 6f 20 61 20 66 72 65 65 20 70 61 67  ** to a free pag
13a80 65 20 65 61 72 6c 69 65 72 20 69 6e 20 74 68 65  e earlier in the
13a90 20 66 69 6c 65 20 28 73 6f 6d 65 77 68 65 72 65   file (somewhere
13aa0 20 62 65 66 6f 72 65 20 66 69 6e 53 69 7a 65 29   before finSize)
13ab0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 20 69 44  ..  */.  for( iD
13ac0 62 50 61 67 65 3d 66 69 6e 53 69 7a 65 2b 31 3b  bPage=finSize+1;
13ad0 20 69 44 62 50 61 67 65 3c 3d 6f 72 69 67 53 69   iDbPage<=origSi
13ae0 7a 65 3b 20 69 44 62 50 61 67 65 2b 2b 20 29 7b  ze; iDbPage++ ){
13af0 0a 20 20 20 20 2f 2a 20 49 66 20 69 44 62 50 61  .    /* If iDbPa
13b00 67 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ge is a pointer 
13b10 6d 61 70 20 70 61 67 65 2c 20 6f 72 20 74 68 65  map page, or the
13b20 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61   pending-byte pa
13b30 67 65 2c 20 73 6b 69 70 20 69 74 2e 20 2a 2f 0a  ge, skip it. */.
13b40 20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49      if( PTRMAP_I
13b50 53 50 41 47 45 28 70 42 74 2c 20 69 44 62 50 61  SPAGE(pBt, iDbPa
13b60 67 65 29 20 7c 7c 20 69 44 62 50 61 67 65 3d 3d  ge) || iDbPage==
13b70 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
13b80 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
13b90 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
13ba0 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
13bb0 47 65 74 28 70 42 74 2c 20 69 44 62 50 61 67 65  Get(pBt, iDbPage
13bc0 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74 72 50  , &eType, &iPtrP
13bd0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
13be0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
13bf0 74 6f 20 61 75 74 6f 76 61 63 75 75 6d 5f 6f 75  to autovacuum_ou
13c00 74 3b 0a 20 20 20 20 69 66 28 20 65 54 79 70 65  t;.    if( eType
13c10 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
13c20 45 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  E ){.      rc = 
13c30 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
13c40 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
13c50 61 75 74 6f 76 61 63 75 75 6d 5f 6f 75 74 3b 0a  autovacuum_out;.
13c60 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
13c70 20 69 44 62 50 61 67 65 20 69 73 20 66 72 65 65   iDbPage is free
13c80 2c 20 64 6f 20 6e 6f 74 20 73 77 61 70 20 69 74  , do not swap it
13c90 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 54  .  */.    if( eT
13ca0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
13cb0 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 63 6f  PAGE ){.      co
13cc0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
13cd0 20 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70    rc = getPage(p
13ce0 42 74 2c 20 69 44 62 50 61 67 65 2c 20 26 70 44  Bt, iDbPage, &pD
13cf0 62 4d 65 6d 50 61 67 65 2c 20 30 29 3b 0a 20 20  bMemPage, 0);.  
13d00 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
13d10 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 75 74 6f 76  _OK ) goto autov
13d20 61 63 75 75 6d 5f 6f 75 74 3b 0a 0a 20 20 20 20  acuum_out;..    
13d30 2f 2a 20 46 69 6e 64 20 74 68 65 20 6e 65 78 74  /* Find the next
13d40 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65   page in the fre
13d50 65 2d 6c 69 73 74 20 74 68 61 74 20 69 73 20 6e  e-list that is n
13d60 6f 74 20 61 6c 72 65 61 64 79 20 61 74 20 74 68  ot already at th
13d70 65 20 65 6e 64 20 0a 20 20 20 20 2a 2a 20 6f 66  e end .    ** of
13d80 20 74 68 65 20 66 69 6c 65 2e 20 41 20 70 61 67   the file. A pag
13d90 65 20 63 61 6e 20 62 65 20 70 75 6c 6c 65 64 20  e can be pulled 
13da0 6f 66 66 20 74 68 65 20 66 72 65 65 20 6c 69 73  off the free lis
13db0 74 20 75 73 69 6e 67 20 74 68 65 20 0a 20 20 20  t using the .   
13dc0 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 42 74 72 65   ** allocateBtre
13dd0 65 50 61 67 65 28 29 20 72 6f 75 74 69 6e 65 2e  ePage() routine.
13de0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 7b 0a  .    */.    do{.
13df0 20 20 20 20 20 20 69 66 28 20 70 46 72 65 65 4d        if( pFreeM
13e00 65 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  emPage ){.      
13e10 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46    releasePage(pF
13e20 72 65 65 4d 65 6d 50 61 67 65 29 3b 0a 20 20 20  reeMemPage);.   
13e30 20 20 20 20 20 70 46 72 65 65 4d 65 6d 50 61 67       pFreeMemPag
13e40 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 0;.      }. 
13e50 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
13e60 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
13e70 20 26 70 46 72 65 65 4d 65 6d 50 61 67 65 2c 20   &pFreeMemPage, 
13e80 26 69 46 72 65 65 50 61 67 65 2c 20 30 2c 20 30  &iFreePage, 0, 0
13e90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
13ea0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13eb0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
13ec0 65 28 70 44 62 4d 65 6d 50 61 67 65 29 3b 0a 20  e(pDbMemPage);. 
13ed0 20 20 20 20 20 20 20 67 6f 74 6f 20 61 75 74 6f         goto auto
13ee0 76 61 63 75 75 6d 5f 6f 75 74 3b 0a 20 20 20 20  vacuum_out;.    
13ef0 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
13f00 28 20 69 46 72 65 65 50 61 67 65 3c 3d 6f 72 69  ( iFreePage<=ori
13f10 67 53 69 7a 65 20 29 3b 0a 20 20 20 20 7d 77 68  gSize );.    }wh
13f20 69 6c 65 28 20 69 46 72 65 65 50 61 67 65 3e 66  ile( iFreePage>f
13f30 69 6e 53 69 7a 65 20 29 3b 0a 20 20 20 20 72 65  inSize );.    re
13f40 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65 4d  leasePage(pFreeM
13f50 65 6d 50 61 67 65 29 3b 0a 20 20 20 20 70 46 72  emPage);.    pFr
13f60 65 65 4d 65 6d 50 61 67 65 20 3d 20 30 3b 0a 0a  eeMemPage = 0;..
13f70 20 20 20 20 2f 2a 20 52 65 6c 6f 63 61 74 65 20      /* Relocate 
13f80 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68  the page into th
13f90 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20 66 69  e body of the fi
13fa0 6c 65 2e 20 4e 6f 74 65 20 74 68 61 74 20 61 6c  le. Note that al
13fb0 74 68 6f 75 67 68 20 74 68 65 20 0a 20 20 20 20  though the .    
13fc0 2a 2a 20 70 61 67 65 20 68 61 73 20 6d 6f 76 65  ** page has move
13fd0 64 20 77 69 74 68 69 6e 20 74 68 65 20 64 61 74  d within the dat
13fe0 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 20  abase file, the 
13ff0 70 44 62 4d 65 6d 50 61 67 65 20 70 6f 69 6e 74  pDbMemPage point
14000 65 72 20 0a 20 20 20 20 2a 2a 20 72 65 6d 61 69  er .    ** remai
14010 6e 73 20 76 61 6c 69 64 2e 20 54 68 69 73 20 6d  ns valid. This m
14020 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 20 66  eans that this f
14030 75 6e 63 74 69 6f 6e 20 63 61 6e 20 72 75 6e 20  unction can run 
14040 77 69 74 68 6f 75 74 0a 20 20 20 20 2a 2a 20 69  without.    ** i
14050 6e 76 61 6c 69 64 61 74 69 6e 67 20 63 75 72 73  nvalidating curs
14060 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ors open on the 
14070 62 74 72 65 65 2e 20 54 68 69 73 20 69 73 20 69  btree. This is i
14080 6d 70 6f 72 74 61 6e 74 20 69 6e 20 0a 20 20 20  mportant in .   
14090 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65   ** shared-cache
140a0 20 6d 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   mode..    */.  
140b0 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50    rc = relocateP
140c0 61 67 65 28 70 42 74 2c 20 70 44 62 4d 65 6d 50  age(pBt, pDbMemP
140d0 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72  age, eType, iPtr
140e0 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 29  Page, iFreePage)
140f0 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
14100 65 28 70 44 62 4d 65 6d 50 61 67 65 29 3b 0a 20  e(pDbMemPage);. 
14110 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
14120 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 75 74 6f  E_OK ) goto auto
14130 76 61 63 75 75 6d 5f 6f 75 74 3b 0a 20 20 7d 0a  vacuum_out;.  }.
14140 0a 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65  .  /* The entire
14150 20 66 72 65 65 2d 6c 69 73 74 20 68 61 73 20 62   free-list has b
14160 65 65 6e 20 73 77 61 70 70 65 64 20 74 6f 20 74  een swapped to t
14170 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
14180 6c 65 2e 20 53 6f 0a 20 20 2a 2a 20 74 72 75 6e  le. So.  ** trun
14190 63 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73  cate the databas
141a0 65 20 66 69 6c 65 20 74 6f 20 66 69 6e 53 69 7a  e file to finSiz
141b0 65 20 70 61 67 65 73 20 61 6e 64 20 63 6f 6e 73  e pages and cons
141c0 69 64 65 72 20 74 68 65 0a 20 20 2a 2a 20 66 72  ider the.  ** fr
141d0 65 65 2d 6c 69 73 74 20 65 6d 70 74 79 2e 0a 20  ee-list empty.. 
141e0 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
141f0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74  e3PagerWrite(pBt
14200 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
14210 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
14220 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61  LITE_OK ) goto a
14230 75 74 6f 76 61 63 75 75 6d 5f 6f 75 74 3b 0a 20  utovacuum_out;. 
14240 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
14250 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
14260 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74  ], 0);.  put4byt
14270 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
14280 61 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20  aData[36], 0);. 
14290 20 2a 70 6e 54 72 75 6e 63 20 3d 20 66 69 6e 53   *pnTrunc = finS
142a0 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 66  ize;.  assert( f
142b0 69 6e 53 69 7a 65 21 3d 50 45 4e 44 49 4e 47 5f  inSize!=PENDING_
142c0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
142d0 3b 0a 0a 61 75 74 6f 76 61 63 75 75 6d 5f 6f 75  ;..autovacuum_ou
142e0 74 3a 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  t:.  assert( nRe
142f0 66 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52  f==sqlite3PagerR
14300 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20  efcount(pPager) 
14310 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
14320 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
14330 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
14340 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
14350 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
14360 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
14370 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  s routine does t
14380 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 6f  he first phase o
14390 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f  f a two-phase co
143a0 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74  mmit.  This rout
143b0 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20  ine.** causes a 
143c0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
143d0 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 28   to be created (
143e0 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61  if it does not a
143f0 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a  lready exist).**
14400 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77   and populated w
14410 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72  ith enough infor
14420 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69  mation so that i
14430 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f  f a power loss o
14440 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74  ccurs.** the dat
14450 61 62 61 73 65 20 63 61 6e 20 62 65 20 72 65 73  abase can be res
14460 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
14470 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70  ginal state by p
14480 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74  laying back.** t
14490 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  he journal.  The
144a0 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  n the contents o
144b0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72  f the journal ar
144c0 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f  e flushed out to
144d0 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41  .** the disk.  A
144e0 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  fter the journal
144f0 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78   is safely on ox
14500 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73  ide, the changes
14510 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   to the.** datab
14520 61 73 65 20 61 72 65 20 77 72 69 74 74 65 6e 20  ase are written 
14530 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
14540 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68  e file and flush
14550 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20  ed to oxide..** 
14560 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  At the end of th
14570 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c  is call, the rol
14580 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74  lback journal st
14590 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68  ill exists on th
145a0 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65  e.** disk and we
145b0 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69   are still holdi
145c0 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f  ng all locks, so
145d0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
145e0 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d   has not.** comm
145f0 69 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69  itted.  See sqli
14600 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 29  te3BtreeCommit()
14610 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20   for the second 
14620 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20  phase of the.** 
14630 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a  commit process..
14640 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20  **.** This call 
14650 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f  is a no-op if no
14660 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
14670 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  on is currently 
14680 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a  active on pBt..*
14690 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
146a0 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  sync the databas
146b0 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62  e file for the b
146c0 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65  tree pBt. zMaste
146d0 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74  r points to.** t
146e0 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
146f0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
14700 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
14710 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
14720 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  .** individual j
14730 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20  ournal file, or 
14740 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74  is NULL, indicat
14750 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  ing no master jo
14760 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28  urnal file .** (
14770 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
14780 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a  transaction)..**
14790 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
147a0 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73   called, the mas
147b0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75  ter journal shou
147c0 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  ld already have 
147d0 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c  been.** created,
147e0 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
147f0 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  this journal poi
14800 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20  nter and synced 
14810 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f  to disk..**.** O
14820 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f 75 74  nce this is rout
14830 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65 64  ine has returned
14840 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  , the only thing
14850 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d   required to com
14860 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65  mit.** the write
14870 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72  -transaction for
14880 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 66   this database f
14890 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65  ile is to delete
148a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f   the journal..*/
148b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
148c0 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
148d0 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20  Btree *p, const 
148e0 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
148f0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
14900 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69  E_OK;.  if( p->i
14910 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
14920 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61  ITE ){.    BtSha
14930 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
14940 74 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 54 72 75  t;.    Pgno nTru
14950 6e 63 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  nc = 0;.#ifndef 
14960 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
14970 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
14980 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
14990 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75 74  {.      rc = aut
149a0 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42  oVacuumCommit(pB
149b0 74 2c 20 26 6e 54 72 75 6e 63 29 3b 20 0a 20 20  t, &nTrunc); .  
149c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
149d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
149e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
149f0 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
14a00 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
14a10 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
14a20 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65 72  eOne(pBt->pPager
14a30 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e  , zMaster, nTrun
14a40 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  c);.  }.  return
14a50 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   rc;.}../*.** Co
14a60 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
14a70 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69  tion currently i
14a80 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a  n progress..**.*
14a90 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
14aa0 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65  mplements the se
14ab0 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20  cond phase of a 
14ac0 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20  2-phase commit. 
14ad0 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42   The.** sqlite3B
14ae0 74 72 65 65 53 79 6e 63 28 29 20 72 6f 75 74 69  treeSync() routi
14af0 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73  ne does the firs
14b00 74 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75  t phase and shou
14b10 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 0a 2a 2a  ld be invoked.**
14b20 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
14b30 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
14b40 20 54 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   The sqlite3Btre
14b50 65 53 79 6e 63 28 29 20 72 6f 75 74 69 6e 65 20  eSync() routine 
14b60 64 69 64 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 77  did.** all the w
14b70 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69  ork of writing i
14b80 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74  nformation out t
14b90 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68  o disk and flush
14ba0 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  ing the.** conte
14bb0 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68 65 79  nts so that they
14bc0 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74   are written ont
14bd0 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74  o the disk platt
14be0 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a  er.  All this.**
14bf0 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20   routine has to 
14c00 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20  do is delete or 
14c10 74 72 75 6e 63 61 74 65 20 74 68 65 20 72 6f 6c  truncate the rol
14c20 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  lback journal.**
14c30 20 28 77 68 69 63 68 20 63 61 75 73 65 73 20 74   (which causes t
14c40 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  he transaction t
14c50 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 20 64 72  o commit) and dr
14c60 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20  op locks..**.** 
14c70 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73  This will releas
14c80 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
14c90 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
14ca0 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
14cb0 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
14cc0 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c  e cursors, it al
14cd0 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20  so releases the 
14ce0 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e  read lock..*/.in
14cf0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
14d00 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42 74 72  mmitPhaseTwo(Btr
14d10 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
14d20 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
14d30 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  ;..  btreeIntegr
14d40 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ity(p);..  /* If
14d50 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20   the handle has 
14d60 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
14d70 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74  ion open, commit
14d80 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
14d90 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  es .  ** transac
14da0 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68 65  tion and set the
14db0 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f   shared state to
14dc0 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a   TRANS_READ..  *
14dd0 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  /.  if( p->inTra
14de0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
14df0 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
14e00 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
14e10 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
14e20 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
14e30 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
14e40 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b  Transaction>0 );
14e50 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
14e60 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
14e70 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65 72  eTwo(pBt->pPager
14e80 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
14e90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14ea0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
14eb0 20 7d 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72   }.    pBt->inTr
14ec0 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
14ed0 53 5f 52 45 41 44 3b 0a 20 20 20 20 70 42 74 2d  S_READ;.    pBt-
14ee0 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d  >inStmt = 0;.  }
14ef0 0a 20 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c  .  unlockAllTabl
14f00 65 73 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  es(p);..  /* If 
14f10 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61  the handle has a
14f20 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73  ny kind of trans
14f30 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63  action open, dec
14f40 72 65 6d 65 6e 74 20 74 68 65 20 74 72 61 6e 73  rement the trans
14f50 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 63 6f 75 6e  action.  ** coun
14f60 74 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20  t of the shared 
14f70 62 74 72 65 65 2e 20 49 66 20 74 68 65 20 74 72  btree. If the tr
14f80 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20  ansaction count 
14f90 72 65 61 63 68 65 73 20 30 2c 20 73 65 74 0a 20  reaches 0, set. 
14fa0 20 2a 2a 20 74 68 65 20 73 68 61 72 65 64 20 73   ** the shared s
14fb0 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f  tate to TRANS_NO
14fc0 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74  NE. The unlockBt
14fd0 72 65 65 49 66 55 6e 75 73 65 64 28 29 20 63 61  reeIfUnused() ca
14fe0 6c 6c 20 62 65 6c 6f 77 0a 20 20 2a 2a 20 77 69  ll below.  ** wi
14ff0 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61  ll unlock the pa
15000 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ger..  */.  if( 
15010 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  p->inTrans!=TRAN
15020 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 70 42  S_NONE ){.    pB
15030 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d  t->nTransaction-
15040 2d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 70 42  -;.    if( 0==pB
15050 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  t->nTransaction 
15060 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  ){.      pBt->in
15070 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
15080 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ANS_NONE;.    }.
15090 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
150a0 65 20 68 61 6e 64 6c 65 73 20 63 75 72 72 65 6e  e handles curren
150b0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74  t transaction st
150c0 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e  ate to TRANS_NON
150d0 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 0a 20 20 2a  E and unlock.  *
150e0 2a 20 74 68 65 20 70 61 67 65 72 20 69 66 20 74  * the pager if t
150f0 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20  his call closed 
15100 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72  the only read or
15110 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
15120 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69 6e  on..  */.  p->in
15130 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f  Trans = TRANS_NO
15140 4e 45 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65  NE;.  unlockBtre
15150 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
15160 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
15170 79 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  y(p);.  return S
15180 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
15190 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65  ** Do both phase
151a0 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a  s of a commit..*
151b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
151c0 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a  eeCommit(Btree *
151d0 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
151e0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
151f0 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
15200 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  p, 0);.  if( rc=
15210 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15220 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
15230 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
15240 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  o(p);.  }.  retu
15250 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
15260 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52  f NDEBUG./*.** R
15270 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
15280 20 6f 66 20 77 72 69 74 65 2d 63 75 72 73 6f 72   of write-cursor
15290 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 68  s open on this h
152a0 61 6e 64 6c 65 2e 20 54 68 69 73 20 69 73 20 66  andle. This is f
152b0 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73  or use.** in ass
152c0 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e  ert() expression
152d0 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79  s, so it is only
152e0 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45   compiled if NDE
152f0 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65  BUG is not.** de
15300 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  fined..*/.static
15310 20 69 6e 74 20 63 6f 75 6e 74 57 72 69 74 65 43   int countWriteC
15320 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20  ursors(BtShared 
15330 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72 73 6f  *pBt){.  BtCurso
15340 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72  r *pCur;.  int r
15350 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75 72   = 0;.  for(pCur
15360 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
15370 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e  Cur; pCur=pCur->
15380 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
15390 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29 20 72  pCur->wrFlag ) r
153a0 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72  ++; .  }.  retur
153b0 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  n r;.}.#endif..#
153c0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
153d0 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e  E_TEST) || defin
153e0 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
153f0 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 64 65 62  ./*.** Print deb
15400 75 67 67 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  ugging informati
15410 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20 63 75 72  on about all cur
15420 73 6f 72 73 20 74 6f 20 73 74 61 6e 64 61 72 64  sors to standard
15430 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 76 6f 69 64   output..*/.void
15440 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
15450 73 6f 72 4c 69 73 74 28 42 74 72 65 65 20 2a 70  sorList(Btree *p
15460 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
15470 43 75 72 3b 0a 20 20 42 74 53 68 61 72 65 64 20  Cur;.  BtShared 
15480 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
15490 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70   for(pCur=pBt->p
154a0 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43  Cursor; pCur; pC
154b0 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b  ur=pCur->pNext){
154c0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
154d0 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
154e0 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 6f  e;.    char *zMo
154f0 64 65 20 3d 20 70 43 75 72 2d 3e 77 72 46 6c 61  de = pCur->wrFla
15500 67 20 3f 20 22 72 77 22 20 3a 20 22 72 6f 22 3b  g ? "rw" : "ro";
15510 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
15520 67 50 72 69 6e 74 66 28 22 43 55 52 53 4f 52 20  gPrintf("CURSOR 
15530 25 70 20 72 6f 6f 74 65 64 20 61 74 20 25 34 64  %p rooted at %4d
15540 28 25 73 29 20 63 75 72 72 65 6e 74 6c 79 20 61  (%s) currently a
15550 74 20 25 64 2e 25 64 25 73 5c 6e 22 2c 0a 20 20  t %d.%d%s\n",.  
15560 20 20 20 20 20 70 43 75 72 2c 20 70 43 75 72 2d       pCur, pCur-
15570 3e 70 67 6e 6f 52 6f 6f 74 2c 20 7a 4d 6f 64 65  >pgnoRoot, zMode
15580 2c 0a 20 20 20 20 20 20 20 70 50 61 67 65 20 3f  ,.       pPage ?
15590 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3a 20 30   pPage->pgno : 0
155a0 2c 20 70 43 75 72 2d 3e 69 64 78 2c 0a 20 20 20  , pCur->idx,.   
155b0 20 20 20 20 28 70 43 75 72 2d 3e 65 53 74 61 74      (pCur->eStat
155c0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29  e==CURSOR_VALID)
155d0 20 3f 20 22 22 20 3a 20 22 20 65 6f 66 22 0a 20   ? "" : " eof". 
155e0 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64     );.  }.}.#end
155f0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  if../*.** Rollba
15600 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
15610 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 20  on in progress. 
15620 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 77 69 6c   All cursors wil
15630 6c 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65  l be.** invalide
15640 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74  d by this operat
15650 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  ion.  Any attemp
15660 74 20 74 6f 20 75 73 65 20 61 20 63 75 72 73 6f  t to use a curso
15670 72 0a 2a 2a 20 74 68 61 74 20 77 61 73 20 6f 70  r.** that was op
15680 65 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  en at the beginn
15690 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65 72  ing of this oper
156a0 61 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c  ation will resul
156b0 74 0a 2a 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72  t.** in an error
156c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c  ..**.** This wil
156d0 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  l release the wr
156e0 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
156f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
15700 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  If there.** are 
15710 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72  no active cursor
15720 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61  s, it also relea
15730 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ses the read loc
15740 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
15750 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42  3BtreeRollback(B
15760 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
15770 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
15780 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
15790 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
157a0 0a 0a 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c  ..  rc = saveAll
157b0 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20  Cursors(pBt, 0, 
157c0 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0);.#ifndef SQLI
157d0 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
157e0 41 43 48 45 0a 20 20 69 66 28 20 72 63 21 3d 53  ACHE.  if( rc!=S
157f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15800 2f 2a 20 54 68 69 73 20 69 73 20 61 20 68 6f 72  /* This is a hor
15810 72 69 62 6c 65 20 73 69 74 75 61 74 69 6f 6e 2e  rible situation.
15820 20 41 6e 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63   An IO or malloc
15830 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64  () error occured
15840 20 77 68 69 6c 73 74 0a 20 20 20 20 2a 2a 20 74   whilst.    ** t
15850 72 79 69 6e 67 20 74 6f 20 73 61 76 65 20 63 75  rying to save cu
15860 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 73 2e 20  rsor positions. 
15870 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75  If this is an au
15880 74 6f 6d 61 74 69 63 20 72 6f 6c 6c 62 61 63 6b  tomatic rollback
15890 20 28 61 73 0a 20 20 20 20 2a 2a 20 74 68 65 20   (as.    ** the 
158a0 72 65 73 75 6c 74 20 6f 66 20 61 20 63 6f 6e 73  result of a cons
158b0 74 72 61 69 6e 74 2c 20 6d 61 6c 6c 6f 63 28 29  traint, malloc()
158c0 20 66 61 69 6c 75 72 65 20 6f 72 20 49 4f 20 65   failure or IO e
158d0 72 72 6f 72 29 20 74 68 65 6e 20 0a 20 20 20 20  rror) then .    
158e0 2a 2a 20 74 68 65 20 63 61 63 68 65 20 6d 61 79  ** the cache may
158f0 20 62 65 20 69 6e 74 65 72 6e 61 6c 6c 79 20 69   be internally i
15900 6e 63 6f 6e 73 69 73 74 65 6e 74 20 28 6e 6f 74  nconsistent (not
15910 20 63 6f 6e 74 61 69 6e 20 76 61 6c 69 64 20 74   contain valid t
15920 72 65 65 73 29 20 73 6f 0a 20 20 20 20 2a 2a 20  rees) so.    ** 
15930 77 65 20 63 61 6e 6e 6f 74 20 73 69 6d 70 6c 79  we cannot simply
15940 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
15950 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  r to the caller.
15960 20 49 6e 73 74 65 61 64 2c 20 61 62 6f 72 74 20   Instead, abort 
15970 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 71 75 65 72  .    ** all quer
15980 69 65 73 20 74 68 61 74 20 6d 61 79 20 62 65 20  ies that may be 
15990 75 73 69 6e 67 20 61 6e 79 20 6f 66 20 74 68 65  using any of the
159a0 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 66 61   cursors that fa
159b0 69 6c 65 64 20 74 6f 20 73 61 76 65 2e 0a 20 20  iled to save..  
159c0 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20    */.    while( 
159d0 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a  pBt->pCursor ){.
159e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
159f0 62 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  b = pBt->pCursor
15a00 2d 3e 70 42 74 72 65 65 2d 3e 70 53 71 6c 69 74  ->pBtree->pSqlit
15a10 65 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 20  e;.      if( db 
15a20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
15a30 65 33 41 62 6f 72 74 4f 74 68 65 72 41 63 74 69  e3AbortOtherActi
15a40 76 65 56 64 62 65 73 28 64 62 2c 20 30 29 3b 0a  veVdbes(db, 0);.
15a50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15a60 7d 0a 23 65 6e 64 69 66 0a 20 20 62 74 72 65 65  }.#endif.  btree
15a70 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20  Integrity(p);.  
15a80 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28  unlockAllTables(
15a90 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e  p);..  if( p->in
15aa0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
15ab0 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  TE ){.    int rc
15ac0 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  2;..    assert( 
15ad0 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74  TRANS_WRITE==pBt
15ae0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
15af0 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c  );.    rc2 = sql
15b00 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
15b10 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  k(pBt->pPager);.
15b20 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c      if( rc2!=SQL
15b30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15b40 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a  rc = rc2;.    }.
15b50 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c  .    /* The roll
15b60 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65  back may have de
15b70 73 74 72 6f 79 65 64 20 74 68 65 20 70 50 61 67  stroyed the pPag
15b80 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e  e1->aData value.
15b90 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c    So.    ** call
15ba0 20 67 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61   getPage() on pa
15bb0 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61  ge 1 again to ma
15bc0 6b 65 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e  ke sure pPage1->
15bd0 61 44 61 74 61 20 69 73 0a 20 20 20 20 2a 2a 20  aData is.    ** 
15be0 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a  set correctly. *
15bf0 2f 0a 20 20 20 20 69 66 28 20 67 65 74 50 61 67  /.    if( getPag
15c00 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65  e(pBt, 1, &pPage
15c10 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  1, 0)==SQLITE_OK
15c20 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
15c30 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
15c40 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
15c50 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f   countWriteCurso
15c60 72 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20  rs(pBt)==0 );.  
15c70 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
15c80 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41  tion = TRANS_REA
15c90 44 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d  D;.  }..  if( p-
15ca0 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f  >inTrans!=TRANS_
15cb0 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 61 73 73 65  NONE ){.    asse
15cc0 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61  rt( pBt->nTransa
15cd0 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 70  ction>0 );.    p
15ce0 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
15cf0 2d 2d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 70  --;.    if( 0==p
15d00 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
15d10 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69   ){.      pBt->i
15d20 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
15d30 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d  RANS_NONE;.    }
15d40 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 6e 54 72 61  .  }..  p->inTra
15d50 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  ns = TRANS_NONE;
15d60 0a 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d  .  pBt->inStmt =
15d70 20 30 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65   0;.  unlockBtre
15d80 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
15d90 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
15da0 79 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  y(p);.  return r
15db0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72  c;.}../*.** Star
15dc0 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75  t a statement su
15dd0 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 54  btransaction.  T
15de0 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  he subtransactio
15df0 6e 20 63 61 6e 0a 2a 2a 20 63 61 6e 20 62 65 20  n can.** can be 
15e00 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 64 65  rolled back inde
15e10 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65  pendently of the
15e20 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f   main transactio
15e30 6e 2e 0a 2a 2a 20 59 6f 75 20 6d 75 73 74 20 73  n..** You must s
15e40 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69  tart a transacti
15e50 6f 6e 20 62 65 66 6f 72 65 20 73 74 61 72 74 69  on before starti
15e60 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61 63 74  ng a subtransact
15e70 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 73 75 62 74  ion..** The subt
15e80 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e  ransaction is en
15e90 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ded automaticall
15ea0 79 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72  y if the main tr
15eb0 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 63 6f 6d  ansaction.** com
15ec0 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61  mits or rolls ba
15ed0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 6f  ck..**.** Only o
15ee0 6e 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  ne subtransactio
15ef0 6e 20 6d 61 79 20 62 65 20 61 63 74 69 76 65 20  n may be active 
15f00 61 74 20 61 20 74 69 6d 65 2e 20 20 49 74 20 69  at a time.  It i
15f10 73 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 74 72  s an error to tr
15f20 79 0a 2a 2a 20 74 6f 20 73 74 61 72 74 20 61 20  y.** to start a 
15f30 6e 65 77 20 73 75 62 74 72 61 6e 73 61 63 74 69  new subtransacti
15f40 6f 6e 20 69 66 20 61 6e 6f 74 68 65 72 20 73 75  on if another su
15f50 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  btransaction is 
15f60 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e 0a  already active..
15f70 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20  **.** Statement 
15f80 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  subtransactions 
15f90 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20  are used around 
15fa0 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73  individual SQL s
15fb0 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61  tatements.** tha
15fc0 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  t are contained 
15fd0 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e  within a BEGIN..
15fe0 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20  .COMMIT block.  
15ff0 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a  If a constraint.
16000 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  ** error occurs 
16010 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65  within the state
16020 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74  ment, the effect
16030 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61   of that one sta
16040 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65  tement.** can be
16050 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74   rolled back wit
16060 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72  hout having to r
16070 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69  ollback the enti
16080 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  re transaction..
16090 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
160a0 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72  reeBeginStmt(Btr
160b0 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
160c0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
160d0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66  t = p->pBt;.  if
160e0 28 20 28 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  ( (p->inTrans!=T
160f0 52 41 4e 53 5f 57 52 49 54 45 29 20 7c 7c 20 70  RANS_WRITE) || p
16100 42 74 2d 3e 69 6e 53 74 6d 74 20 29 7b 0a 20 20  Bt->inStmt ){.  
16110 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 72 65    return pBt->re
16120 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f  adOnly ? SQLITE_
16130 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54  READONLY : SQLIT
16140 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61  E_ERROR;.  }.  a
16150 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
16160 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
16170 5f 57 52 49 54 45 20 29 3b 0a 20 20 72 63 20 3d  _WRITE );.  rc =
16180 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f   pBt->readOnly ?
16190 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c   SQLITE_OK : sql
161a0 69 74 65 33 50 61 67 65 72 53 74 6d 74 42 65 67  ite3PagerStmtBeg
161b0 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  in(pBt->pPager);
161c0 0a 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d  .  pBt->inStmt =
161d0 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   1;.  return rc;
161e0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  .}.../*.** Commi
161f0 74 20 74 68 65 20 73 74 61 74 6d 65 6e 74 20 73  t the statment s
16200 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75  ubtransaction cu
16210 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72  rrently in progr
16220 65 73 73 2e 20 20 49 66 20 6e 6f 0a 2a 2a 20 73  ess.  If no.** s
16230 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  ubtransaction is
16240 20 61 63 74 69 76 65 2c 20 74 68 69 73 20 69 73   active, this is
16250 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74   a no-op..*/.int
16260 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
16270 6d 69 74 53 74 6d 74 28 42 74 72 65 65 20 2a 70  mitStmt(Btree *p
16280 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
16290 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
162a0 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 70 42 74  ->pBt;.  if( pBt
162b0 2d 3e 69 6e 53 74 6d 74 20 26 26 20 21 70 42 74  ->inStmt && !pBt
162c0 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
162d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
162e0 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70 42  gerStmtCommit(pB
162f0 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 7d 65  t->pPager);.  }e
16300 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
16310 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
16320 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a  Bt->inStmt = 0;.
16330 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
16340 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74  /*.** Rollback t
16350 68 65 20 61 63 74 69 76 65 20 73 74 61 74 65 6d  he active statem
16360 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69  ent subtransacti
16370 6f 6e 2e 20 20 49 66 20 6e 6f 20 73 75 62 74 72  on.  If no subtr
16380 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
16390 61 63 74 69 76 65 20 74 68 69 73 20 72 6f 75 74  active this rout
163a0 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
163b0 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72  **.** All cursor
163c0 73 20 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69  s will be invali
163d0 64 61 74 65 64 20 62 79 20 74 68 69 73 20 6f 70  dated by this op
163e0 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74  eration.  Any at
163f0 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 75 73 65 20  tempt.** to use 
16400 61 20 63 75 72 73 6f 72 20 74 68 61 74 20 77 61  a cursor that wa
16410 73 20 6f 70 65 6e 20 61 74 20 74 68 65 20 62 65  s open at the be
16420 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73 20  ginning of this 
16430 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 77 69 6c  operation.** wil
16440 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 65  l result in an e
16450 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rror..*/.int sql
16460 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
16470 6b 53 74 6d 74 28 42 74 72 65 65 20 2a 70 29 7b  kStmt(Btree *p){
16480 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
16490 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65  TE_OK;.  BtShare
164a0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
164b0 0a 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  .  sqlite3Malloc
164c0 44 69 73 61 6c 6c 6f 77 28 29 3b 0a 20 20 69 66  Disallow();.  if
164d0 28 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 26 26  ( pBt->inStmt &&
164e0 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20   !pBt->readOnly 
164f0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
16500 74 65 33 50 61 67 65 72 53 74 6d 74 52 6f 6c 6c  te3PagerStmtRoll
16510 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72  back(pBt->pPager
16520 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 63  );.    assert( c
16530 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73  ountWriteCursors
16540 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20  (pBt)==0 );.    
16550 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b  pBt->inStmt = 0;
16560 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4d 61  .  }.  sqlite3Ma
16570 6c 6c 6f 63 41 6c 6c 6f 77 28 29 3b 0a 20 20 72  llocAllow();.  r
16580 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
16590 2a 2a 20 44 65 66 61 75 6c 74 20 6b 65 79 20 63  ** Default key c
165a0 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
165b0 6f 6e 20 74 6f 20 62 65 20 75 73 65 64 20 69 66  on to be used if
165c0 20 6e 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66   no comparison f
165d0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 70  unction.** is sp
165e0 65 63 69 66 69 65 64 20 6f 6e 20 74 68 65 20 73  ecified on the s
165f0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
16600 72 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61  r() call..*/.sta
16610 74 69 63 20 69 6e 74 20 64 66 6c 74 43 6f 6d 70  tic int dfltComp
16620 61 72 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  are(.  void *Not
16630 55 73 65 64 2c 20 20 20 20 20 20 20 20 20 20 20  Used,           
16640 20 20 2f 2a 20 55 73 65 72 20 64 61 74 61 20 69    /* User data i
16650 73 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20  s not used */.  
16660 69 6e 74 20 6e 31 2c 20 63 6f 6e 73 74 20 76 6f  int n1, const vo
16670 69 64 20 2a 70 31 2c 20 20 20 20 2f 2a 20 46 69  id *p1,    /* Fi
16680 72 73 74 20 6b 65 79 20 74 6f 20 63 6f 6d 70 61  rst key to compa
16690 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 32 2c 20  re */.  int n2, 
166a0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 32 20 20  const void *p2  
166b0 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 6b 65 79     /* Second key
166c0 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 29   to compare */.)
166d0 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 63 20 3d  {.  int c;.  c =
166e0 20 6d 65 6d 63 6d 70 28 70 31 2c 20 70 32 2c 20   memcmp(p1, p2, 
166f0 6e 31 3c 6e 32 20 3f 20 6e 31 20 3a 20 6e 32 29  n1<n2 ? n1 : n2)
16700 3b 0a 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a  ;.  if( c==0 ){.
16710 20 20 20 20 63 20 3d 20 6e 31 20 2d 20 6e 32 3b      c = n1 - n2;
16720 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 3b  .  }.  return c;
16730 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
16740 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f   a new cursor fo
16750 72 20 74 68 65 20 42 54 72 65 65 20 77 68 6f 73  r the BTree whos
16760 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65  e root is on the
16770 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e   page.** iTable.
16780 20 20 54 68 65 20 61 63 74 20 6f 66 20 61 63 71    The act of acq
16790 75 69 72 69 6e 67 20 61 20 63 75 72 73 6f 72 20  uiring a cursor 
167a0 67 65 74 73 20 61 20 72 65 61 64 20 6c 6f 63 6b  gets a read lock
167b0 20 6f 6e 20 0a 2a 2a 20 74 68 65 20 64 61 74 61   on .** the data
167c0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
167d0 20 49 66 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74   If wrFlag==0, t
167e0 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63  hen the cursor c
167f0 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20  an only be used 
16800 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20  for reading..** 
16810 49 66 20 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68  If wrFlag==1, th
16820 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61  en the cursor ca
16830 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65  n be used for re
16840 61 64 69 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20  ading or for.** 
16850 77 72 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72  writing if other
16860 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20   conditions for 
16870 77 72 69 74 69 6e 67 20 61 72 65 20 61 6c 73 6f  writing are also
16880 20 6d 65 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20   met.  These.** 
16890 61 72 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f  are the conditio
168a0 6e 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20  ns that must be 
168b0 6d 65 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72  met in order for
168c0 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62   writing to.** b
168d0 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a  e allowed:.**.**
168e0 20 31 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20   1:  The cursor 
168f0 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f  must have been o
16900 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61  pened with wrFla
16910 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f  g==1.**.** 2:  O
16920 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
16930 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73  nnections that s
16940 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 70 61  hare the same pa
16950 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20  ger cache.**    
16960 20 62 75 74 20 77 68 69 63 68 20 61 72 65 20 6e   but which are n
16970 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55  ot in the READ_U
16980 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65  NCOMMITTED state
16990 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a   may not have.**
169a0 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65       cursors ope
169b0 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30  n with wrFlag==0
169c0 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62   on the same tab
169d0 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a  le.  Otherwise.*
169e0 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e 67 65  *     the change
169f0 73 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 77  s made by this w
16a00 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c  rite cursor woul
16a10 64 20 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a  d be visible to.
16a20 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61 64 20  **     the read 
16a30 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f  cursors in the o
16a40 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
16a50 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nnection..**.** 
16a60 33 3a 20 20 54 68 65 20 64 61 74 61 62 61 73 65  3:  The database
16a70 20 6d 75 73 74 20 62 65 20 77 72 69 74 61 62 6c   must be writabl
16a80 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f  e (not on read-o
16a90 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a  nly media).**.**
16aa0 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20   4:  There must 
16ab0 62 65 20 61 6e 20 61 63 74 69 76 65 20 74 72 61  be an active tra
16ac0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
16ad0 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64  No checking is d
16ae0 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  one to make sure
16af0 20 74 68 61 74 20 70 61 67 65 20 69 54 61 62 6c   that page iTabl
16b00 65 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a  e really is the.
16b10 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  ** root page of 
16b20 61 20 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74  a b-tree.  If it
16b30 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68   is not, then th
16b40 65 20 63 75 72 73 6f 72 20 61 63 71 75 69 72 65  e cursor acquire
16b50 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f  d.** will not wo
16b60 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a  rk correctly..**
16b70 0a 2a 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73  .** The comparis
16b80 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  on function must
16b90 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79 20 74 68   be logically th
16ba0 65 20 73 61 6d 65 20 66 6f 72 20 65 76 65 72 79  e same for every
16bb0 20 63 75 72 73 6f 72 0a 2a 2a 20 6f 6e 20 61 20   cursor.** on a 
16bc0 70 61 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65  particular table
16bd0 2e 20 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20  .  Changing the 
16be0 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
16bf0 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a  ion will result.
16c00 2a 2a 20 69 6e 20 69 6e 63 6f 72 72 65 63 74 20  ** in incorrect 
16c10 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20 49 66 20  operations.  If 
16c20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66  the comparison f
16c30 75 6e 63 74 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c  unction is NULL,
16c40 20 61 0a 2a 2a 20 64 65 66 61 75 6c 74 20 63 6f   a.** default co
16c50 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
16c60 6e 20 69 73 20 75 73 65 64 2e 20 20 54 68 65 20  n is used.  The 
16c70 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
16c80 69 6f 6e 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73  ion is.** always
16c90 20 69 67 6e 6f 72 65 64 20 66 6f 72 20 49 4e 54   ignored for INT
16ca0 4b 45 59 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 69  KEY tables..*/.i
16cb0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
16cc0 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a  ursor(.  Btree *
16cd0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
16ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16cf0 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
16d00 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  e */.  int iTabl
16d10 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
16d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d30 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
16d40 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e  of table to open
16d50 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67   */.  int wrFlag
16d60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
16d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d80 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e    /* 1 to write.
16d90 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a   0 read-only */.
16da0 20 20 69 6e 74 20 28 2a 78 43 6d 70 29 28 76 6f    int (*xCmp)(vo
16db0 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
16dc0 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
16dd0 69 64 2a 29 2c 20 2f 2a 20 4b 65 79 20 43 6f 6d  id*), /* Key Com
16de0 70 61 72 69 73 6f 6e 20 66 75 6e 63 20 2a 2f 0a  parison func */.
16df0 20 20 76 6f 69 64 20 2a 70 41 72 67 2c 20 20 20    void *pArg,   
16e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16e20 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 78 43   First arg to xC
16e30 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74  ompare() */.  Bt
16e40 43 75 72 73 6f 72 20 2a 2a 70 70 43 75 72 20 20  Cursor **ppCur  
16e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
16e70 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65  te new cursor he
16e80 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
16e90 63 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  c;.  BtCursor *p
16ea0 43 75 72 3b 0a 20 20 42 74 53 68 61 72 65 64 20  Cur;.  BtShared 
16eb0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a  *pBt = p->pBt;..
16ec0 20 20 2a 70 70 43 75 72 20 3d 20 30 3b 0a 20 20    *ppCur = 0;.  
16ed0 69 66 28 20 77 72 46 6c 61 67 20 29 7b 0a 20 20  if( wrFlag ){.  
16ee0 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f    if( pBt->readO
16ef0 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74  nly ){.      ret
16f00 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
16f10 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  NLY;.    }.    i
16f20 66 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b  f( checkReadLock
16f30 73 28 70 2c 20 69 54 61 62 6c 65 2c 20 30 29 20  s(p, iTable, 0) 
16f40 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
16f50 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20  SQLITE_LOCKED;. 
16f60 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
16f70 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29  pBt->pPage1==0 )
16f80 7b 0a 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 42  {.    rc = lockB
16f90 74 72 65 65 57 69 74 68 52 65 74 72 79 28 70 29  treeWithRetry(p)
16fa0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
16fb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16fc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
16fd0 7d 0a 20 20 7d 0a 20 20 70 43 75 72 20 3d 20 73  }.  }.  pCur = s
16fe0 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
16ff0 65 6f 66 28 2a 70 43 75 72 29 20 29 3b 0a 20 20  eof(*pCur) );.  
17000 69 66 28 20 70 43 75 72 3d 3d 30 20 29 7b 0a 20  if( pCur==0 ){. 
17010 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
17020 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 63  OMEM;.    goto c
17030 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63  reate_cursor_exc
17040 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 70 43  eption;.  }.  pC
17050 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28  ur->pgnoRoot = (
17060 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 69  Pgno)iTable;.  i
17070 66 28 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20  f( iTable==1 && 
17080 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
17090 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
170a0 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  r)==0 ){.    rc 
170b0 3d 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a  = SQLITE_EMPTY;.
170c0 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f      goto create_
170d0 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e  cursor_exception
170e0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67 65 74  ;.  }.  rc = get
170f0 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c  AndInitPage(pBt,
17100 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
17110 20 26 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 30   &pCur->pPage, 0
17120 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
17130 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
17140 74 6f 20 63 72 65 61 74 65 5f 63 75 72 73 6f 72  to create_cursor
17150 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a  _exception;.  }.
17160 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e  .  /* Now that n
17170 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63  o other errors c
17180 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68  an occur, finish
17190 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20   filling in the 
171a0 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61  BtCursor.  ** va
171b0 72 69 61 62 6c 65 73 2c 20 6c 69 6e 6b 20 74 68  riables, link th
171c0 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68  e cursor into th
171d0 65 20 42 74 53 68 61 72 65 64 20 6c 69 73 74 20  e BtShared list 
171e0 61 6e 64 20 73 65 74 20 2a 70 70 43 75 72 20 28  and set *ppCur (
171f0 74 68 65 0a 20 20 2a 2a 20 6f 75 74 70 75 74 20  the.  ** output 
17200 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
17210 20 66 75 6e 63 74 69 6f 6e 29 2e 0a 20 20 2a 2f   function)..  */
17220 0a 20 20 70 43 75 72 2d 3e 78 43 6f 6d 70 61 72  .  pCur->xCompar
17230 65 20 3d 20 78 43 6d 70 20 3f 20 78 43 6d 70 20  e = xCmp ? xCmp 
17240 3a 20 64 66 6c 74 43 6f 6d 70 61 72 65 3b 0a 20  : dfltCompare;. 
17250 20 70 43 75 72 2d 3e 70 41 72 67 20 3d 20 70 41   pCur->pArg = pA
17260 72 67 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 72  rg;.  pCur->pBtr
17270 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e  ee = p;.  pCur->
17280 77 72 46 6c 61 67 20 3d 20 77 72 46 6c 61 67 3b  wrFlag = wrFlag;
17290 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d  .  pCur->pNext =
172a0 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20   pBt->pCursor;. 
172b0 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74   if( pCur->pNext
172c0 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e   ){.    pCur->pN
172d0 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75  ext->pPrev = pCu
172e0 72 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43  r;.  }.  pBt->pC
172f0 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20  ursor = pCur;.  
17300 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
17310 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
17320 20 2a 70 70 43 75 72 20 3d 20 70 43 75 72 3b 0a   *ppCur = pCur;.
17330 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
17340 5f 4f 4b 3b 0a 63 72 65 61 74 65 5f 63 75 72 73  _OK;.create_curs
17350 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3a 0a 20 20  or_exception:.  
17360 69 66 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20  if( pCur ){.    
17370 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
17380 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20 20 73 71  ->pPage);.    sq
17390 6c 69 74 65 46 72 65 65 28 70 43 75 72 29 3b 0a  liteFree(pCur);.
173a0 20 20 7d 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65    }.  unlockBtre
173b0 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
173c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
173d0 23 69 66 20 30 20 20 2f 2a 20 4e 6f 74 20 55 73  #if 0  /* Not Us
173e0 65 64 20 2a 2f 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  ed */./*.** Chan
173f0 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
17400 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66  the comparison f
17410 75 6e 63 74 69 6f 6e 20 75 73 65 64 20 62 79 20  unction used by 
17420 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69  a cursor..*/.voi
17430 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  d sqlite3BtreeSe
17440 74 43 6f 6d 70 61 72 65 28 0a 20 20 42 74 43 75  tCompare(.  BtCu
17450 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
17460 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f  /* The cursor to
17470 20 77 68 6f 73 65 20 63 6f 6d 70 61 72 69 73 6f   whose compariso
17480 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 68  n function is ch
17490 61 6e 67 65 64 20 2a 2f 0a 20 20 69 6e 74 28 2a  anged */.  int(*
174a0 78 43 6d 70 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  xCmp)(void*,int,
174b0 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c  const void*,int,
174c0 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 20 2f 2a  const void*), /*
174d0 20 4e 65 77 20 63 6f 6d 70 61 72 69 73 6f 6e 20   New comparison 
174e0 66 75 6e 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  func */.  void *
174f0 70 41 72 67 20 20 20 20 20 20 20 20 20 20 2f 2a  pArg          /*
17500 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   First argument 
17510 74 6f 20 78 43 6d 70 28 29 20 2a 2f 0a 29 7b 0a  to xCmp() */.){.
17520 20 20 70 43 75 72 2d 3e 78 43 6f 6d 70 61 72 65    pCur->xCompare
17530 20 3d 20 78 43 6d 70 20 3f 20 78 43 6d 70 20 3a   = xCmp ? xCmp :
17540 20 64 66 6c 74 43 6f 6d 70 61 72 65 3b 0a 20 20   dfltCompare;.  
17550 70 43 75 72 2d 3e 70 41 72 67 20 3d 20 70 41 72  pCur->pArg = pAr
17560 67 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  g;.}.#endif../*.
17570 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f  ** Close a curso
17580 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63  r.  The read loc
17590 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
175a0 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73  e file is releas
175b0 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c  ed.** when the l
175c0 61 73 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c  ast cursor is cl
175d0 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  osed..*/.int sql
175e0 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75  ite3BtreeCloseCu
175f0 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70  rsor(BtCursor *p
17600 43 75 72 29 7b 0a 20 20 42 74 53 68 61 72 65 64  Cur){.  BtShared
17610 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
17620 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20 63 6c 65  tree->pBt;.  cle
17630 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  arCursorPosition
17640 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 70 43  (pCur);.  if( pC
17650 75 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20  ur->pPrev ){.   
17660 20 70 43 75 72 2d 3e 70 50 72 65 76 2d 3e 70 4e   pCur->pPrev->pN
17670 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  ext = pCur->pNex
17680 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
17690 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70  pBt->pCursor = p
176a0 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  Cur->pNext;.  }.
176b0 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78    if( pCur->pNex
176c0 74 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70  t ){.    pCur->p
176d0 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43  Next->pPrev = pC
176e0 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20  ur->pPrev;.  }. 
176f0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
17700 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 75 6e 6c  r->pPage);.  unl
17710 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
17720 28 70 42 74 29 3b 0a 20 20 73 71 6c 69 74 65 46  (pBt);.  sqliteF
17730 72 65 65 28 70 43 75 72 29 3b 0a 20 20 72 65 74  ree(pCur);.  ret
17740 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
17750 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 74  ../*.** Make a t
17760 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20  emporary cursor 
17770 62 79 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68  by filling in th
17780 65 20 66 69 65 6c 64 73 20 6f 66 20 70 54 65 6d  e fields of pTem
17790 70 43 75 72 2e 0a 2a 2a 20 54 68 65 20 74 65 6d  pCur..** The tem
177a0 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20 69 73  porary cursor is
177b0 20 6e 6f 74 20 6f 6e 20 74 68 65 20 63 75 72 73   not on the curs
177c0 6f 72 20 6c 69 73 74 20 66 6f 72 20 74 68 65 20  or list for the 
177d0 42 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  Btree..*/.static
177e0 20 76 6f 69 64 20 67 65 74 54 65 6d 70 43 75 72   void getTempCur
177f0 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43  sor(BtCursor *pC
17800 75 72 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 54  ur, BtCursor *pT
17810 65 6d 70 43 75 72 29 7b 0a 20 20 6d 65 6d 63 70  empCur){.  memcp
17820 79 28 70 54 65 6d 70 43 75 72 2c 20 70 43 75 72  y(pTempCur, pCur
17830 2c 20 73 69 7a 65 6f 66 28 2a 70 43 75 72 29 29  , sizeof(*pCur))
17840 3b 0a 20 20 70 54 65 6d 70 43 75 72 2d 3e 70 4e  ;.  pTempCur->pN
17850 65 78 74 20 3d 20 30 3b 0a 20 20 70 54 65 6d 70  ext = 0;.  pTemp
17860 43 75 72 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a  Cur->pPrev = 0;.
17870 20 20 69 66 28 20 70 54 65 6d 70 43 75 72 2d 3e    if( pTempCur->
17880 70 50 61 67 65 20 29 7b 0a 20 20 20 20 73 71 6c  pPage ){.    sql
17890 69 74 65 33 50 61 67 65 72 52 65 66 28 70 54 65  ite3PagerRef(pTe
178a0 6d 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 70 44  mpCur->pPage->pD
178b0 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  bPage);.  }.}../
178c0 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 74 65  *.** Delete a te
178d0 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20 73  mporary cursor s
178e0 75 63 68 20 61 73 20 77 61 73 20 6d 61 64 65 20  uch as was made 
178f0 62 79 20 74 68 65 20 43 72 65 61 74 65 54 65 6d  by the CreateTem
17900 70 6f 72 61 72 79 43 75 72 73 6f 72 28 29 0a 2a  poraryCursor().*
17910 2a 20 66 75 6e 63 74 69 6f 6e 20 61 62 6f 76 65  * function above
17920 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
17930 20 72 65 6c 65 61 73 65 54 65 6d 70 43 75 72 73   releaseTempCurs
17940 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  or(BtCursor *pCu
17950 72 29 7b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  r){.  if( pCur->
17960 70 50 61 67 65 20 29 7b 0a 20 20 20 20 73 71 6c  pPage ){.    sql
17970 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
17980 43 75 72 2d 3e 70 50 61 67 65 2d 3e 70 44 62 50  Cur->pPage->pDbP
17990 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  age);.  }.}../*.
179a0 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
179b0 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 66   BtCursor.info f
179c0 69 65 6c 64 20 6f 66 20 74 68 65 20 67 69 76 65  ield of the give
179d0 6e 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69  n cursor is vali
179e0 64 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 6e  d..** If it is n
179f0 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64  ot already valid
17a00 2c 20 63 61 6c 6c 20 70 61 72 73 65 43 65 6c 6c  , call parseCell
17a10 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e  () to fill it in
17a20 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72  ..**.** BtCursor
17a30 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65  .info is a cache
17a40 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74   of the informat
17a50 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65  ion in the curre
17a60 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e  nt cell..** Usin
17a70 67 20 74 68 69 73 20 63 61 63 68 65 20 72 65 64  g this cache red
17a80 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  uces the number 
17a90 6f 66 20 63 61 6c 6c 73 20 74 6f 20 70 61 72 73  of calls to pars
17aa0 65 43 65 6c 6c 28 29 2e 0a 2a 2f 0a 73 74 61 74  eCell()..*/.stat
17ab0 69 63 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49  ic void getCellI
17ac0 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43  nfo(BtCursor *pC
17ad0 75 72 29 7b 0a 20 20 69 66 28 20 70 43 75 72 2d  ur){.  if( pCur-
17ae0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
17af0 7b 0a 20 20 20 20 70 61 72 73 65 43 65 6c 6c 28  {.    parseCell(
17b00 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 70 43 75  pCur->pPage, pCu
17b10 72 2d 3e 69 64 78 2c 20 26 70 43 75 72 2d 3e 69  r->idx, &pCur->i
17b20 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23  nfo);.  }else{.#
17b30 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
17b40 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
17b50 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66  .    memset(&inf
17b60 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66  o, 0, sizeof(inf
17b70 6f 29 29 3b 0a 20 20 20 20 70 61 72 73 65 43 65  o));.    parseCe
17b80 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 2c 20  ll(pCur->pPage, 
17b90 70 43 75 72 2d 3e 69 64 78 2c 20 26 69 6e 66 6f  pCur->idx, &info
17ba0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d  );.    assert( m
17bb0 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43  emcmp(&info, &pC
17bc0 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66  ur->info, sizeof
17bd0 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 23 65  (info))==0 );.#e
17be0 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ndif.  }.}../*.*
17bf0 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20  * Set *pSize to 
17c00 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
17c10 62 75 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f  buffer needed to
17c20 20 68 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20   hold the value 
17c30 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f  of.** the key fo
17c40 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e  r the current en
17c50 74 72 79 2e 20 20 49 66 20 74 68 65 20 63 75 72  try.  If the cur
17c60 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74  sor is not point
17c70 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69  ing.** to a vali
17c80 64 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20  d entry, *pSize 
17c90 69 73 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a  is set to 0. .**
17ca0 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20  .** For a table 
17cb0 77 69 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20  with the INTKEY 
17cc0 66 6c 61 67 20 73 65 74 2c 20 74 68 69 73 20 72  flag set, this r
17cd0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
17ce0 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66  he key.** itself
17cf0 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72  , not the number
17d00 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
17d10 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   key..*/.int sql
17d20 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
17d30 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
17d40 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20   i64 *pSize){.  
17d50 69 6e 74 20 72 63 20 3d 20 72 65 73 74 6f 72 65  int rc = restore
17d60 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73  OrClearCursorPos
17d70 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
17d80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
17d90 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
17da0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
17db0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20  RSOR_INVALID || 
17dc0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
17dd0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
17de0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
17df0 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
17e00 49 44 20 29 7b 0a 20 20 20 20 20 20 2a 70 53 69  ID ){.      *pSi
17e10 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ze = 0;.    }els
17e20 65 7b 0a 20 20 20 20 20 20 67 65 74 43 65 6c 6c  e{.      getCell
17e30 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20  Info(pCur);.    
17e40 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d    *pSize = pCur-
17e50 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20  >info.nKey;.    
17e60 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
17e70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  c;.}../*.** Set 
17e80 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 6e 75  *pSize to the nu
17e90 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
17ea0 20 64 61 74 61 20 69 6e 20 74 68 65 20 65 6e 74   data in the ent
17eb0 72 79 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72  ry the.** cursor
17ec0 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
17ed0 73 20 74 6f 2e 20 20 41 6c 77 61 79 73 20 72 65  s to.  Always re
17ee0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
17ef0 2a 2a 20 46 61 69 6c 75 72 65 20 69 73 20 6e 6f  ** Failure is no
17f00 74 20 70 6f 73 73 69 62 6c 65 2e 20 20 49 66 20  t possible.  If 
17f10 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
17f20 74 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70  t currently.** p
17f30 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 20 65 6e  ointing to an en
17f40 74 72 79 20 28 77 68 69 63 68 20 63 61 6e 20 68  try (which can h
17f50 61 70 70 65 6e 2c 20 66 6f 72 20 65 78 61 6d 70  appen, for examp
17f60 6c 65 2c 20 69 66 0a 2a 2a 20 74 68 65 20 64 61  le, if.** the da
17f70 74 61 62 61 73 65 20 69 73 20 65 6d 70 74 79 29  tabase is empty)
17f80 20 74 68 65 6e 20 2a 70 53 69 7a 65 20 69 73 20   then *pSize is 
17f90 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 69 6e 74  set to 0..*/.int
17fa0 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74   sqlite3BtreeDat
17fb0 61 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a  aSize(BtCursor *
17fc0 70 43 75 72 2c 20 75 33 32 20 2a 70 53 69 7a 65  pCur, u32 *pSize
17fd0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 72 65  ){.  int rc = re
17fe0 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73  storeOrClearCurs
17ff0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
18000 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
18010 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
18020 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
18030 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
18040 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
18050 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
18060 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  );.    if( pCur-
18070 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
18080 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  INVALID ){.     
18090 20 2f 2a 20 4e 6f 74 20 70 6f 69 6e 74 69 6e 67   /* Not pointing
180a0 20 61 74 20 61 20 76 61 6c 69 64 20 65 6e 74 72   at a valid entr
180b0 79 20 2d 20 73 65 74 20 2a 70 53 69 7a 65 20 74  y - set *pSize t
180c0 6f 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2a 70  o 0. */.      *p
180d0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Size = 0;.    }e
180e0 6c 73 65 7b 0a 20 20 20 20 20 20 67 65 74 43 65  lse{.      getCe
180f0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
18100 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75      *pSize = pCu
18110 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20  r->info.nData;. 
18120 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
18130 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
18140 65 61 64 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f  ead payload info
18150 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  rmation from the
18160 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
18170 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 0a 2a  pCur cursor is.*
18180 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20  * pointing to.  
18190 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68  Begin reading th
181a0 65 20 70 61 79 6c 6f 61 64 20 61 74 20 22 6f 66  e payload at "of
181b0 66 73 65 74 22 20 61 6e 64 20 72 65 61 64 0a 2a  fset" and read.*
181c0 2a 20 61 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d  * a total of "am
181d0 74 22 20 62 79 74 65 73 2e 20 20 50 75 74 20 74  t" bytes.  Put t
181e0 68 65 20 72 65 73 75 6c 74 20 69 6e 20 7a 42 75  he result in zBu
181f0 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f..**.** This ro
18200 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 6d  utine does not m
18210 61 6b 65 20 61 20 64 69 73 74 69 6e 63 74 69 6f  ake a distinctio
18220 6e 20 62 65 74 77 65 65 6e 20 6b 65 79 20 61 6e  n between key an
18230 64 20 64 61 74 61 2e 0a 2a 2a 20 49 74 20 6a 75  d data..** It ju
18240 73 74 20 72 65 61 64 73 20 62 79 74 65 73 20 66  st reads bytes f
18250 72 6f 6d 20 74 68 65 20 70 61 79 6c 6f 61 64 20  rom the payload 
18260 61 72 65 61 2e 20 20 44 61 74 61 20 6d 69 67 68  area.  Data migh
18270 74 20 61 70 70 65 61 72 0a 2a 2a 20 6f 6e 20 74  t appear.** on t
18280 68 65 20 6d 61 69 6e 20 70 61 67 65 20 6f 72 20  he main page or 
18290 62 65 20 73 63 61 74 74 65 72 65 64 20 6f 75 74  be scattered out
182a0 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65   on multiple ove
182b0 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2f 0a  rflow pages..*/.
182c0 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 50 61  static int getPa
182d0 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f  yload(.  BtCurso
182e0 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a  r *pCur,      /*
182f0 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
18300 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61   to entry to rea
18310 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  d from */.  int 
18320 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20  offset,         
18330 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e   /* Begin readin
18340 67 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20  g this far into 
18350 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 69 6e 74  payload */.  int
18360 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20   amt,           
18370 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d    /* Read this m
18380 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75  any bytes */.  u
18390 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42  nsigned char *pB
183a0 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65  uf, /* Write the
183b0 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73   bytes into this
183c0 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e   buffer */ .  in
183d0 74 20 73 6b 69 70 4b 65 79 20 20 20 20 20 20 20  t skipKey       
183e0 20 20 20 2f 2a 20 6f 66 66 73 65 74 20 62 65 67     /* offset beg
183f0 69 6e 73 20 61 74 20 64 61 74 61 20 69 66 20 74  ins at data if t
18400 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 29  his is true */.)
18410 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
18420 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 50  r *aPayload;.  P
18430 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 20 20  gno nextPage;.  
18440 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67  int rc;.  MemPag
18450 65 20 2a 70 50 61 67 65 3b 0a 20 20 42 74 53 68  e *pPage;.  BtSh
18460 61 72 65 64 20 2a 70 42 74 3b 0a 20 20 69 6e 74  ared *pBt;.  int
18470 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 75 33 32   ovflSize;.  u32
18480 20 6e 4b 65 79 3b 0a 0a 20 20 61 73 73 65 72 74   nKey;..  assert
18490 28 20 70 43 75 72 21 3d 30 20 26 26 20 70 43 75  ( pCur!=0 && pCu
184a0 72 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a 20  r->pPage!=0 );. 
184b0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
184c0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
184d0 4c 49 44 20 29 3b 0a 20 20 70 42 74 20 3d 20 70  LID );.  pBt = p
184e0 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74  Cur->pBtree->pBt
184f0 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ;.  pPage = pCur
18500 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72  ->pPage;.  asser
18510 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20  t( pCur->idx>=0 
18520 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61  && pCur->idx<pPa
18530 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 67  ge->nCell );.  g
18540 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
18550 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70  ;.  aPayload = p
18560 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20  Cur->info.pCell 
18570 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65  + pCur->info.nHe
18580 61 64 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67  ader;.  if( pPag
18590 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
185a0 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65 6c   nKey = 0;.  }el
185b0 73 65 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 70  se{.    nKey = p
185c0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
185d0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66    }.  assert( of
185e0 66 73 65 74 3e 3d 30 20 29 3b 0a 20 20 69 66 28  fset>=0 );.  if(
185f0 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20 20   skipKey ){.    
18600 6f 66 66 73 65 74 20 2b 3d 20 6e 4b 65 79 3b 0a  offset += nKey;.
18610 20 20 7d 0a 20 20 69 66 28 20 6f 66 66 73 65 74    }.  if( offset
18620 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b 70 43 75 72  +amt > nKey+pCur
18630 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 20 29 7b 0a  ->info.nData ){.
18640 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18650 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  E_ERROR;.  }.  i
18660 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e  f( offset<pCur->
18670 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
18680 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a     int a = amt;.
18690 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65 74      if( a+offset
186a0 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  >pCur->info.nLoc
186b0 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20  al ){.      a = 
186c0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
186d0 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  l - offset;.    
186e0 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75  }.    memcpy(pBu
186f0 66 2c 20 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66  f, &aPayload[off
18700 73 65 74 5d 2c 20 61 29 3b 0a 20 20 20 20 69 66  set], a);.    if
18710 28 20 61 3d 3d 61 6d 74 20 29 7b 0a 20 20 20 20  ( a==amt ){.    
18720 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18730 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 66  OK;.    }.    of
18740 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42  fset = 0;.    pB
18750 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74  uf += a;.    amt
18760 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a   -= a;.  }else{.
18770 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43      offset -= pC
18780 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b  ur->info.nLocal;
18790 0a 20 20 7d 0a 20 20 6f 76 66 6c 53 69 7a 65 20  .  }.  ovflSize 
187a0 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
187b0 65 20 2d 20 34 3b 0a 20 20 69 66 28 20 61 6d 74  e - 4;.  if( amt
187c0 3e 30 20 29 7b 0a 20 20 20 20 6e 65 78 74 50 61  >0 ){.    nextPa
187d0 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
187e0 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e  Payload[pCur->in
187f0 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 20 20 20  fo.nLocal]);.   
18800 20 77 68 69 6c 65 28 20 61 6d 74 3e 30 20 26 26   while( amt>0 &&
18810 20 6e 65 78 74 50 61 67 65 20 29 7b 0a 20 20 20   nextPage ){.   
18820 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61     DbPage *pDbPa
18830 67 65 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  ge;.      rc = s
18840 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
18850 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74  Bt->pPager, next
18860 50 61 67 65 2c 20 26 70 44 62 50 61 67 65 29 3b  Page, &pDbPage);
18870 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30  .      if( rc!=0
18880 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
18890 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
188a0 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20       aPayload = 
188b0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
188c0 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ata(pDbPage);.  
188d0 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67      nextPage = g
188e0 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64  et4byte(aPayload
188f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66  );.      if( off
18900 73 65 74 3c 6f 76 66 6c 53 69 7a 65 20 29 7b 0a  set<ovflSize ){.
18910 20 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20          int a = 
18920 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  amt;.        if(
18930 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76   a + offset > ov
18940 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  flSize ){.      
18950 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65      a = ovflSize
18960 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20   - offset;.     
18970 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d     }.        mem
18980 63 70 79 28 70 42 75 66 2c 20 26 61 50 61 79 6c  cpy(pBuf, &aPayl
18990 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 61  oad[offset+4], a
189a0 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65  );.        offse
189b0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61  t = 0;.        a
189c0 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20  mt -= a;.       
189d0 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20   pBuf += a;.    
189e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
189f0 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53   offset -= ovflS
18a00 69 7a 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ize;.      }.   
18a10 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
18a20 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
18a30 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
18a40 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  amt>0 ){.    ret
18a50 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
18a60 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
18a70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
18a80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70  .}../*.** Read p
18a90 61 72 74 20 6f 66 20 74 68 65 20 6b 65 79 20 61  art of the key a
18aa0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63  ssociated with c
18ab0 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61  ursor pCur.  Exa
18ac0 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79  ctly.** "amt" by
18ad0 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e  tes will be tran
18ae0 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66  sfered into pBuf
18af0 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65  [].  The transfe
18b00 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22  r.** begins at "
18b10 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52  offset"..**.** R
18b20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
18b30 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
18b40 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
18b50 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
18b60 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72  wrong.  An error
18b70 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
18b80 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20  "offset+amt" is 
18b90 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74  larger than.** t
18ba0 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79  he available pay
18bb0 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  load..*/.int sql
18bc0 69 74 65 33 42 74 72 65 65 4b 65 79 28 42 74 43  ite3BtreeKey(BtC
18bd0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
18be0 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
18bf0 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20  , void *pBuf){. 
18c00 20 69 6e 74 20 72 63 20 3d 20 72 65 73 74 6f 72   int rc = restor
18c10 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f  eOrClearCursorPo
18c20 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
18c30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18c40 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
18c50 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
18c60 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
18c70 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
18c80 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 20  >pPage!=0 );.   
18c90 20 69 66 28 20 70 43 75 72 2d 3e 70 50 61 67 65   if( pCur->pPage
18ca0 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
18cb0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18cc0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
18cd0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
18ce0 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74  pCur->pPage->int
18cf0 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  Key==0 );.    as
18d00 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e  sert( pCur->idx>
18d10 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c  =0 && pCur->idx<
18d20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
18d30 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 67  ll );.    rc = g
18d40 65 74 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  etPayload(pCur, 
18d50 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e  offset, amt, (un
18d60 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75  signed char*)pBu
18d70 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  f, 0);.  }.  ret
18d80 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
18d90 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68   Read part of th
18da0 65 20 64 61 74 61 20 61 73 73 6f 63 69 61 74 65  e data associate
18db0 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43  d with cursor pC
18dc0 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20  ur.  Exactly.** 
18dd0 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c  "amt" bytes will
18de0 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69   be transfered i
18df0 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65  nto pBuf[].  The
18e00 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67   transfer.** beg
18e10 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e  ins at "offset".
18e20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
18e30 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
18e40 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
18e50 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
18e60 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20  goes.** wrong.  
18e70 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  An error is retu
18e80 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b  rned if "offset+
18e90 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74  amt" is larger t
18ea0 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c  han.** the avail
18eb0 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f  able payload..*/
18ec0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
18ed0 65 44 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a  eData(BtCursor *
18ee0 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74  pCur, u32 offset
18ef0 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20  , u32 amt, void 
18f00 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63  *pBuf){.  int rc
18f10 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61   = restoreOrClea
18f20 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
18f30 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
18f40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18f50 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
18f60 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
18f70 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65  ALID );.    asse
18f80 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 21  rt( pCur->pPage!
18f90 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
18fa0 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26  ( pCur->idx>=0 &
18fb0 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 43 75 72  & pCur->idx<pCur
18fc0 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ->pPage->nCell )
18fd0 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 50 61  ;.    rc = getPa
18fe0 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
18ff0 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 31  et, amt, pBuf, 1
19000 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
19010 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
19020 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
19030 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
19040 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e  tion from the en
19050 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  try that the .**
19060 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20   pCur cursor is 
19070 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68  pointing to.  Th
19080 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20  e pointer is to 
19090 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
190a0 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20 73  .** the key if s
190b0 6b 69 70 4b 65 79 3d 3d 30 20 61 6e 64 20 69 74  kipKey==0 and it
190c0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 62   points to the b
190d0 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61  eginning of data
190e0 20 69 66 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d   if.** skipKey==
190f0 31 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  1.  The number o
19100 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c  f bytes of avail
19110 61 62 6c 65 20 6b 65 79 2f 64 61 74 61 20 69 73  able key/data is
19120 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
19130 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d   *pAmt.  If *pAm
19140 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76  t==0, then the v
19150 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 77 69  alue returned wi
19160 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 20 76  ll not be.** a v
19170 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  alid pointer..**
19180 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
19190 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
191a0 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d  ion.  It is comm
191b0 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72  on for the entir
191c0 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74  e key.** and dat
191d0 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20  a to fit on the 
191e0 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66  local page and f
191f0 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e  or there to be n
19200 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61  o overflow.** pa
19210 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20  ges.  When that 
19220 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74  is so, this rout
19230 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64 20  ine can be used 
19240 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a  to access the.**
19250 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77 69   key and data wi
19260 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63  thout making a c
19270 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79  opy.  If the key
19280 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69   and/or data spi
19290 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72  lls.** onto over
192a0 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e  flow pages, then
192b0 20 67 65 74 50 61 79 6c 6f 61 64 28 29 20 6d 75   getPayload() mu
192c0 73 74 20 62 65 20 75 73 65 64 20 74 6f 20 72 65  st be used to re
192d0 61 73 73 65 6d 62 6c 79 0a 2a 2a 20 74 68 65 20  assembly.** the 
192e0 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70  key/data and cop
192f0 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61  y it into a prea
19300 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e  llocated buffer.
19310 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74  .**.** The point
19320 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  er returned by t
19330 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b  his routine look
19340 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20  s directly into 
19350 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61  the cached.** pa
19360 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
19370 73 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69  se.  The data mi
19380 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f  ght change or mo
19390 76 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  ve the next time
193a0 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f  .** any btree ro
193b0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
193c0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
193d0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
193e0 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20  fetchPayload(.  
193f0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
19400 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70       /* Cursor p
19410 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79  ointing to entry
19420 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
19430 0a 20 20 69 6e 74 20 2a 70 41 6d 74 2c 20 20 20  .  int *pAmt,   
19440 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
19450 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
19460 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68  vailable bytes h
19470 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6b 69  ere */.  int ski
19480 70 4b 65 79 20 20 20 20 20 20 20 20 20 20 2f 2a  pKey          /*
19490 20 72 65 61 64 20 62 65 67 69 6e 6e 69 6e 67 20   read beginning 
194a0 61 74 20 64 61 74 61 20 69 66 20 74 68 69 73 20  at data if this 
194b0 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  is true */.){.  
194c0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
194d0 50 61 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50 61  Payload;.  MemPa
194e0 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 75 33 32  ge *pPage;.  u32
194f0 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4c 6f   nKey;.  int nLo
19500 63 61 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  cal;..  assert( 
19510 70 43 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d  pCur!=0 && pCur-
19520 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61  >pPage!=0 );.  a
19530 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
19540 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
19550 44 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70  D );.  pPage = p
19560 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73  Cur->pPage;.  as
19570 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e  sert( pCur->idx>
19580 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c  =0 && pCur->idx<
19590 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
195a0 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
195b0 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20  ur);.  aPayload 
195c0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65  = pCur->info.pCe
195d0 6c 6c 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 2b  ll;.  aPayload +
195e0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65  = pCur->info.nHe
195f0 61 64 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67  ader;.  if( pPag
19600 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
19610 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65 6c   nKey = 0;.  }el
19620 73 65 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 70  se{.    nKey = p
19630 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
19640 20 20 7d 0a 20 20 69 66 28 20 73 6b 69 70 4b 65    }.  if( skipKe
19650 79 20 29 7b 0a 20 20 20 20 61 50 61 79 6c 6f 61  y ){.    aPayloa
19660 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 6e  d += nKey;.    n
19670 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e  Local = pCur->in
19680 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65 79  fo.nLocal - nKey
19690 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
196a0 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e  Local = pCur->in
196b0 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 69  fo.nLocal;.    i
196c0 66 28 20 6e 4c 6f 63 61 6c 3e 6e 4b 65 79 20 29  f( nLocal>nKey )
196d0 7b 0a 20 20 20 20 20 20 6e 4c 6f 63 61 6c 20 3d  {.      nLocal =
196e0 20 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d   nKey;.    }.  }
196f0 0a 20 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63 61  .  *pAmt = nLoca
19700 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 50 61 79  l;.  return aPay
19710 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  load;.}.../*.** 
19720 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68  For the entry th
19730 61 74 20 63 75 72 73 6f 72 20 70 43 75 72 20 69  at cursor pCur i
19740 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75  s point to, retu
19750 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79  rn as.** many by
19760 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f  tes of the key o
19770 72 20 64 61 74 61 20 61 73 20 61 72 65 20 61 76  r data as are av
19780 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c  ailable on the l
19790 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70  ocal.** b-tree p
197a0 61 67 65 2e 20 20 57 72 69 74 65 20 74 68 65 20  age.  Write the 
197b0 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61  number of availa
197c0 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a  ble bytes into *
197d0 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  pAmt..**.** The 
197e0 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
197f0 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20   is ephemeral.  
19800 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79  The key/data may
19810 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64   move.** or be d
19820 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20  estroyed on the 
19830 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79  next call to any
19840 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2e 0a   Btree routine..
19850 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74  **.** These rout
19860 69 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f 20  ines is used to 
19870 67 65 74 20 71 75 69 63 6b 20 61 63 63 65 73 73  get quick access
19880 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61   to key and data
19890 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f  .** in the commo
198a0 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20  n case where no 
198b0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
198c0 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73  re used..*/.cons
198d0 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42  t void *sqlite3B
198e0 74 72 65 65 4b 65 79 46 65 74 63 68 28 42 74 43  treeKeyFetch(BtC
198f0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
19900 20 2a 70 41 6d 74 29 7b 0a 20 20 69 66 28 20 70   *pAmt){.  if( p
19910 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
19920 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
19930 20 72 65 74 75 72 6e 20 28 63 6f 6e 73 74 20 76   return (const v
19940 6f 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61  oid*)fetchPayloa
19950 64 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 30 29  d(pCur, pAmt, 0)
19960 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
19970 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ;.}.const void *
19980 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61  sqlite3BtreeData
19990 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a  Fetch(BtCursor *
199a0 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29  pCur, int *pAmt)
199b0 7b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  {.  if( pCur->eS
199c0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
199d0 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ID ){.    return
199e0 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65   (const void*)fe
199f0 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  tchPayload(pCur,
19a00 20 70 41 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a 20   pAmt, 1);.  }. 
19a10 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f   return 0;.}.../
19a20 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
19a30 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e  rsor down to a n
19a40 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20  ew child page.  
19a50 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75  The newPgno argu
19a60 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70  ment is the.** p
19a70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
19a80 65 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20  e child page to 
19a90 6d 6f 76 65 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74  move to..*/.stat
19aa0 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69  ic int moveToChi
19ab0 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ld(BtCursor *pCu
19ac0 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b  r, u32 newPgno){
19ad0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
19ae0 50 61 67 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a  Page *pNewPage;.
19af0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 50    MemPage *pOldP
19b00 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20  age;.  BtShared 
19b10 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
19b20 72 65 65 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73  ree->pBt;..  ass
19b30 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
19b40 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
19b50 29 3b 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64  );.  rc = getAnd
19b60 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65  InitPage(pBt, ne
19b70 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67 65  wPgno, &pNewPage
19b80 2c 20 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a  , pCur->pPage);.
19b90 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
19ba0 6e 20 72 63 3b 0a 20 20 70 4e 65 77 50 61 67 65  n rc;.  pNewPage
19bb0 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d 20 70 43  ->idxParent = pC
19bc0 75 72 2d 3e 69 64 78 3b 0a 20 20 70 4f 6c 64 50  ur->idx;.  pOldP
19bd0 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
19be0 65 3b 0a 20 20 70 4f 6c 64 50 61 67 65 2d 3e 69  e;.  pOldPage->i
19bf0 64 78 53 68 69 66 74 20 3d 20 30 3b 0a 20 20 72  dxShift = 0;.  r
19c00 65 6c 65 61 73 65 50 61 67 65 28 70 4f 6c 64 50  eleasePage(pOldP
19c10 61 67 65 29 3b 0a 20 20 70 43 75 72 2d 3e 70 50  age);.  pCur->pP
19c20 61 67 65 20 3d 20 70 4e 65 77 50 61 67 65 3b 0a  age = pNewPage;.
19c30 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 30 3b    pCur->idx = 0;
19c40 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
19c50 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  ize = 0;.  if( p
19c60 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31  NewPage->nCell<1
19c70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
19c80 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
19c90 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
19ca0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
19cb0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
19cc0 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
19cd0 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  the virtual root
19ce0 20 6f 66 20 69 74 73 20 74 61 62 6c 65 2e 0a 2a   of its table..*
19cf0 2a 0a 2a 2a 20 54 68 65 20 76 69 72 74 75 61 6c  *.** The virtual
19d00 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 74 68   root page is th
19d10 65 20 72 6f 6f 74 20 70 61 67 65 20 66 6f 72 20  e root page for 
19d20 6d 6f 73 74 20 74 61 62 6c 65 73 2e 20 20 42 75  most tables.  Bu
19d30 74 0a 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62  t.** for the tab
19d40 6c 65 20 72 6f 6f 74 65 64 20 6f 6e 20 70 61 67  le rooted on pag
19d50 65 20 31 2c 20 73 6f 6d 65 74 69 6d 65 20 74 68  e 1, sometime th
19d60 65 20 72 65 61 6c 20 72 6f 6f 74 20 70 61 67 65  e real root page
19d70 0a 2a 2a 20 69 73 20 65 6d 70 74 79 20 65 78 63  .** is empty exc
19d80 65 70 74 20 66 6f 72 20 74 68 65 20 72 69 67 68  ept for the righ
19d90 74 2d 70 6f 69 6e 74 65 72 2e 20 20 49 6e 20 73  t-pointer.  In s
19da0 75 63 68 20 63 61 73 65 73 20 74 68 65 0a 2a 2a  uch cases the.**
19db0 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
19dc0 67 65 20 69 73 20 74 68 65 20 70 61 67 65 20 74  ge is the page t
19dd0 68 61 74 20 74 68 65 20 72 69 67 68 74 2d 70 6f  hat the right-po
19de0 69 6e 74 65 72 20 6f 66 20 70 61 67 65 0a 2a 2a  inter of page.**
19df0 20 31 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74   1 is pointing t
19e00 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
19e10 20 69 73 52 6f 6f 74 50 61 67 65 28 4d 65 6d 50   isRootPage(MemP
19e20 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 4d  age *pPage){.  M
19e30 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 20  emPage *pParent 
19e40 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  = pPage->pParent
19e50 3b 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 3d  ;.  if( pParent=
19e60 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
19e70 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e 70 67   if( pParent->pg
19e80 6e 6f 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b  no>1 ) return 0;
19e90 0a 20 20 69 66 28 20 67 65 74 32 62 79 74 65 28  .  if( get2byte(
19ea0 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
19eb0 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
19ec0 65 74 2b 33 5d 29 3d 3d 30 20 29 20 72 65 74 75  et+3])==0 ) retu
19ed0 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30  rn 1;.  return 0
19ee0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
19ef0 74 68 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f  the cursor up to
19f00 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
19f10 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64  ..**.** pCur->id
19f20 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  x is set to the 
19f30 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20  cell index that 
19f40 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69  contains the poi
19f50 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70  nter.** to the p
19f60 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e  age we are comin
19f70 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61  g from.  If we a
19f80 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74  re coming from t
19f90 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74  he.** right-most
19fa0 20 63 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e   child page then
19fb0 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65   pCur->idx is se
19fc0 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68  t to one more th
19fd0 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73  an.** the larges
19fe0 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f  t cell index..*/
19ff0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 6f 76  .static void mov
1a000 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73  eToParent(BtCurs
1a010 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d  or *pCur){.  Mem
1a020 50 61 67 65 20 2a 70 50 61 72 65 6e 74 3b 0a 20  Page *pParent;. 
1a030 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
1a040 0a 20 20 69 6e 74 20 69 64 78 50 61 72 65 6e 74  .  int idxParent
1a050 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  ;..  assert( pCu
1a060 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1a070 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70 50 61  R_VALID );.  pPa
1a080 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
1a090 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1a0a0 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
1a0b0 28 20 21 69 73 52 6f 6f 74 50 61 67 65 28 70 50  ( !isRootPage(pP
1a0c0 61 67 65 29 20 29 3b 0a 20 20 70 50 61 72 65 6e  age) );.  pParen
1a0d0 74 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65  t = pPage->pPare
1a0e0 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  nt;.  assert( pP
1a0f0 61 72 65 6e 74 21 3d 30 20 29 3b 0a 20 20 69 64  arent!=0 );.  id
1a100 78 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d  xParent = pPage-
1a110 3e 69 64 78 50 61 72 65 6e 74 3b 0a 20 20 73 71  >idxParent;.  sq
1a120 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50  lite3PagerRef(pP
1a130 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b  arent->pDbPage);
1a140 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
1a150 50 61 67 65 29 3b 0a 20 20 70 43 75 72 2d 3e 70  Page);.  pCur->p
1a160 50 61 67 65 20 3d 20 70 50 61 72 65 6e 74 3b 0a  Page = pParent;.
1a170 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
1a180 7a 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  ze = 0;.  assert
1a190 28 20 70 50 61 72 65 6e 74 2d 3e 69 64 78 53 68  ( pParent->idxSh
1a1a0 69 66 74 3d 3d 30 20 29 3b 0a 20 20 70 43 75 72  ift==0 );.  pCur
1a1b0 2d 3e 69 64 78 20 3d 20 69 64 78 50 61 72 65 6e  ->idx = idxParen
1a1c0 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  t;.}../*.** Move
1a1d0 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
1a1e0 68 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2f 0a  he root page.*/.
1a1f0 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
1a200 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a  oRoot(BtCursor *
1a210 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65  pCur){.  MemPage
1a220 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72   *pRoot;.  int r
1a230 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1a240 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1a250 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70   pCur->pBtree->p
1a260 42 74 3b 0a 0a 20 20 69 66 28 20 70 43 75 72 2d  Bt;..  if( pCur-
1a270 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1a280 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20  REQUIRESEEK ){. 
1a290 20 20 20 63 6c 65 61 72 43 75 72 73 6f 72 50 6f     clearCursorPo
1a2a0 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
1a2b0 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72  }.  pRoot = pCur
1a2c0 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66 28 20 70  ->pPage;.  if( p
1a2d0 52 6f 6f 74 20 26 26 20 70 52 6f 6f 74 2d 3e 70  Root && pRoot->p
1a2e0 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52  gno==pCur->pgnoR
1a2f0 6f 6f 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  oot ){.    asser
1a300 74 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74  t( pRoot->isInit
1a310 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
1a320 20 69 66 28 20 0a 20 20 20 20 20 20 53 51 4c 49   if( .      SQLI
1a330 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 67 65 74  TE_OK!=(rc = get
1a340 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c  AndInitPage(pBt,
1a350 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
1a360 20 26 70 52 6f 6f 74 2c 20 30 29 29 0a 20 20 20   &pRoot, 0)).   
1a370 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
1a380 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
1a390 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72  INVALID;.      r
1a3a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1a3b0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1a3c0 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20  pCur->pPage);.  
1a3d0 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20    pCur->pPage = 
1a3e0 70 52 6f 6f 74 3b 0a 20 20 7d 0a 20 20 70 43 75  pRoot;.  }.  pCu
1a3f0 72 2d 3e 69 64 78 20 3d 20 30 3b 0a 20 20 70 43  r->idx = 0;.  pC
1a400 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
1a410 20 30 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d   0;.  if( pRoot-
1a420 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 21 70 52  >nCell==0 && !pR
1a430 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  oot->leaf ){.   
1a440 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20   Pgno subpage;. 
1a450 20 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74     assert( pRoot
1a460 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20 20  ->pgno==1 );.   
1a470 20 73 75 62 70 61 67 65 20 3d 20 67 65 74 34 62   subpage = get4b
1a480 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74  yte(&pRoot->aDat
1a490 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73  a[pRoot->hdrOffs
1a4a0 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73 65  et+8]);.    asse
1a4b0 72 74 28 20 73 75 62 70 61 67 65 3e 30 20 29 3b  rt( subpage>0 );
1a4c0 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
1a4d0 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  e = CURSOR_VALID
1a4e0 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
1a4f0 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62  oChild(pCur, sub
1a500 70 61 67 65 29 3b 0a 20 20 7d 0a 20 20 70 43 75  page);.  }.  pCu
1a510 72 2d 3e 65 53 74 61 74 65 20 3d 20 28 28 70 43  r->eState = ((pC
1a520 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
1a530 3e 30 29 3f 43 55 52 53 4f 52 5f 56 41 4c 49 44  >0)?CURSOR_VALID
1a540 3a 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 29  :CURSOR_INVALID)
1a550 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1a560 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
1a570 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
1a580 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65  the left-most le
1a590 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  af entry beneath
1a5a0 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f   the.** entry to
1a5b0 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72   which it is cur
1a5c0 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e  rently pointing.
1a5d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d  .**.** The left-
1a5e0 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68 65  most leaf is the
1a5f0 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d   one with the sm
1a600 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65  allest key - the
1a610 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63   first.** in asc
1a620 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f  ending order..*/
1a630 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
1a640 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72  ToLeftmost(BtCur
1a650 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67  sor *pCur){.  Pg
1a660 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  no pgno;.  int r
1a670 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  c;.  MemPage *pP
1a680 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
1a690 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1a6a0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
1a6b0 77 68 69 6c 65 28 20 21 28 70 50 61 67 65 20 3d  while( !(pPage =
1a6c0 20 70 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c   pCur->pPage)->l
1a6d0 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72  eaf ){.    asser
1a6e0 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20  t( pCur->idx>=0 
1a6f0 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61  && pCur->idx<pPa
1a700 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
1a710 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
1a720 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
1a730 20 70 43 75 72 2d 3e 69 64 78 29 29 3b 0a 20 20   pCur->idx));.  
1a740 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
1a750 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
1a760 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
1a770 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65  urn rc;.  }.  re
1a780 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1a790 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
1a7a0 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
1a7b0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
1a7c0 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61  leaf entry benea
1a7d0 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74  th the.** page t
1a7e0 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75  o which it is cu
1a7f0 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
1a800 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69  .  Notice the di
1a810 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77  fference.** betw
1a820 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  een moveToLeftmo
1a830 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52  st() and moveToR
1a840 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76  ightmost().  mov
1a850 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a  eToLeftmost().**
1a860 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d   finds the left-
1a870 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61  most entry benea
1a880 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77  th the *entry* w
1a890 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67  hereas moveToRig
1a8a0 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64  htmost().** find
1a8b0 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
1a8c0 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
1a8d0 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a  he *page*..**.**
1a8e0 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
1a8f0 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65  entry is the one
1a900 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 73   with the larges
1a910 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74  t key - the last
1a920 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e  .** key in ascen
1a930 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ding order..*/.s
1a940 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
1a950 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73  Rightmost(BtCurs
1a960 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e  or *pCur){.  Pgn
1a970 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  o pgno;.  int rc
1a980 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
1a990 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ge;..  assert( p
1a9a0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1a9b0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77  SOR_VALID );.  w
1a9c0 68 69 6c 65 28 20 21 28 70 50 61 67 65 20 3d 20  hile( !(pPage = 
1a9d0 70 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65  pCur->pPage)->le
1a9e0 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d  af ){.    pgno =
1a9f0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
1aa00 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
1aa10 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
1aa20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 70 50    pCur->idx = pP
1aa30 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20  age->nCell;.    
1aa40 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
1aa50 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  (pCur, pgno);.  
1aa60 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1aa70 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72  n rc;.  }.  pCur
1aa80 2d 3e 69 64 78 20 3d 20 70 50 61 67 65 2d 3e 6e  ->idx = pPage->n
1aa90 43 65 6c 6c 20 2d 20 31 3b 0a 20 20 70 43 75 72  Cell - 1;.  pCur
1aaa0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
1aab0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1aac0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  E_OK;.}../* Move
1aad0 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
1aae0 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
1aaf0 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  n the table.  Re
1ab00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
1ab10 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53  * on success.  S
1ab20 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66  et *pRes to 0 if
1ab30 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75   the cursor actu
1ab40 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73  ally points to s
1ab50 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73  omething.** or s
1ab60 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66  et *pRes to 1 if
1ab70 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
1ab80 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
1ab90 74 65 33 42 74 72 65 65 46 69 72 73 74 28 42 74  te3BtreeFirst(Bt
1aba0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
1abb0 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
1abc0 72 63 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54  rc;.  rc = moveT
1abd0 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
1abe0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1abf0 63 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  c;.  if( pCur->e
1ac00 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
1ac10 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 61 73 73  VALID ){.    ass
1ac20 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
1ac30 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
1ac40 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
1ac50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1ac60 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  K;.  }.  assert(
1ac70 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43   pCur->pPage->nC
1ac80 65 6c 6c 3e 30 20 29 3b 0a 20 20 2a 70 52 65 73  ell>0 );.  *pRes
1ac90 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6d 6f 76   = 0;.  rc = mov
1aca0 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
1acb0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1acc0 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
1acd0 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73  ursor to the las
1ace0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
1acf0 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  able.  Return SQ
1ad00 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
1ad10 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65  ccess.  Set *pRe
1ad20 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75  s to 0 if the cu
1ad30 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f  rsor actually po
1ad40 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e  ints to somethin
1ad50 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65  g.** or set *pRe
1ad60 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61  s to 1 if the ta
1ad70 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
1ad80 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1ad90 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a  eLast(BtCursor *
1ada0 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
1adb0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63  {.  int rc;.  rc
1adc0 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
1add0 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ur);.  if( rc ) 
1ade0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28  return rc;.  if(
1adf0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
1ae00 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
1ae10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
1ae20 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  r->pPage->nCell=
1ae30 3d 30 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20  =0 );.    *pRes 
1ae40 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
1ae50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1ae60 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
1ae70 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1ae80 4c 49 44 20 29 3b 0a 20 20 2a 70 52 65 73 20 3d  LID );.  *pRes =
1ae90 20 30 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   0;.  rc = moveT
1aea0 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29  oRightmost(pCur)
1aeb0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1aec0 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
1aed0 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20  rsor so that it 
1aee0 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74  points to an ent
1aef0 72 79 20 6e 65 61 72 20 70 4b 65 79 2f 6e 4b 65  ry near pKey/nKe
1af00 79 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  y..** Return a s
1af10 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a  uccess code..**.
1af20 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61  ** For INTKEY ta
1af30 62 6c 65 73 2c 20 6f 6e 6c 79 20 74 68 65 20 6e  bles, only the n
1af40 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20 69 73  Key parameter is
1af50 20 75 73 65 64 2e 20 20 70 4b 65 79 20 69 73 0a   used.  pKey is.
1af60 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20 46 6f 72  ** ignored.  For
1af70 20 6f 74 68 65 72 20 74 61 62 6c 65 73 2c 20 6e   other tables, n
1af80 4b 65 79 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Key is the numbe
1af90 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61  r of bytes of da
1afa0 74 61 0a 2a 2a 20 69 6e 20 70 4b 65 79 2e 20 20  ta.** in pKey.  
1afb0 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66  The comparison f
1afc0 75 6e 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65  unction specifie
1afd0 64 20 77 68 65 6e 20 74 68 65 20 63 75 72 73 6f  d when the curso
1afe0 72 20 77 61 73 0a 2a 2a 20 63 72 65 61 74 65 64  r was.** created
1aff0 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70   is used to comp
1b000 61 72 65 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20  are keys..**.** 
1b010 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63  If an exact matc
1b020 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20  h is not found, 
1b030 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
1b040 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66  is always.** lef
1b050 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20  t pointing at a 
1b060 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20  leaf page which 
1b070 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65  would hold the e
1b080 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65  ntry if it.** we
1b090 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65  re present.  The
1b0a0 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f   cursor might po
1b0b0 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  int to an entry 
1b0c0 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65  that comes.** be
1b0d0 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74 68  fore or after th
1b0e0 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  e key..**.** The
1b0f0 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61   result of compa
1b100 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74  ring the key wit
1b110 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77  h the entry to w
1b120 68 69 63 68 20 74 68 65 0a 2a 2a 20 63 75 72 73  hich the.** curs
1b130 6f 72 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  or is written to
1b140 20 2a 70 52 65 73 20 69 66 20 70 52 65 73 21 3d   *pRes if pRes!=
1b150 4e 55 4c 4c 2e 20 20 54 68 65 20 6d 65 61 6e 69  NULL.  The meani
1b160 6e 67 20 6f 66 0a 2a 2a 20 74 68 69 73 20 76 61  ng of.** this va
1b170 6c 75 65 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  lue is as follow
1b180 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  s:.**.**     *pR
1b190 65 73 3c 30 20 20 20 20 20 20 54 68 65 20 63 75  es<0      The cu
1b1a0 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
1b1b0 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
1b1c0 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
1b1d0 20 20 20 20 20 20 20 20 20 20 20 69 73 20 73 6d             is sm
1b1e0 61 6c 6c 65 72 20 74 68 61 6e 20 70 4b 65 79 20  aller than pKey 
1b1f0 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  or if the table 
1b200 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20  is empty.**     
1b210 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 64               and
1b220 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 74   the cursor is t
1b230 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f  herefore left po
1b240 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a  int to nothing..
1b250 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d  **.**     *pRes=
1b260 3d 30 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  =0     The curso
1b270 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
1b280 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
1b290 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
1b2a0 20 20 20 20 20 20 20 20 65 78 61 63 74 6c 79 20          exactly 
1b2b0 6d 61 74 63 68 65 73 20 70 4b 65 79 2e 0a 2a 2a  matches pKey..**
1b2c0 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20  .**     *pRes>0 
1b2d0 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
1b2e0 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
1b2f0 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
1b300 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
1b310 20 20 20 20 20 20 69 73 20 6c 61 72 67 65 72 20        is larger 
1b320 74 68 61 6e 20 70 4b 65 79 2e 0a 2a 2f 0a 69 6e  than pKey..*/.in
1b330 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  t sqlite3BtreeMo
1b340 76 65 74 6f 28 0a 20 20 42 74 43 75 72 73 6f 72  veto(.  BtCursor
1b350 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 2f   *pCur,        /
1b360 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20  * The cursor to 
1b370 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 63 6f  be moved */.  co
1b380 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
1b390 20 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20       /* The key 
1b3a0 63 6f 6e 74 65 6e 74 20 66 6f 72 20 69 6e 64 69  content for indi
1b3b0 63 65 73 2e 20 20 4e 6f 74 20 75 73 65 64 20 62  ces.  Not used b
1b3c0 79 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 69 36  y tables */.  i6
1b3d0 34 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20  4 nKey,         
1b3e0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1b3f0 70 4b 65 79 2e 20 20 4f 72 20 74 68 65 20 6b 65  pKey.  Or the ke
1b400 79 20 66 6f 72 20 74 61 62 6c 65 73 20 2a 2f 0a  y for tables */.
1b410 20 20 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c    int biasRight,
1b420 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
1b430 72 75 65 2c 20 62 69 61 73 20 74 68 65 20 73 65  rue, bias the se
1b440 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67 68  arch to the high
1b450 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   end */.  int *p
1b460 52 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20  Res             
1b470 20 2f 2a 20 53 65 61 72 63 68 20 72 65 73 75 6c   /* Search resul
1b480 74 20 66 6c 61 67 20 2a 2f 0a 29 7b 0a 20 20 69  t flag */.){.  i
1b490 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 6d 6f  nt rc;.  rc = mo
1b4a0 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
1b4b0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1b4c0 6e 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  n rc;.  assert( 
1b4d0 70 43 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20  pCur->pPage );. 
1b4e0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
1b4f0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
1b500 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
1b510 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
1b520 49 44 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  ID ){.    *pRes 
1b530 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74  = -1;.    assert
1b540 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  ( pCur->pPage->n
1b550 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72  Cell==0 );.    r
1b560 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1b570 0a 20 20 7d 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a  .  }.  for(;;){.
1b580 20 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72      int lwr, upr
1b590 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50  ;.    Pgno chldP
1b5a0 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  g;.    MemPage *
1b5b0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
1b5c0 61 67 65 3b 0a 20 20 20 20 69 6e 74 20 63 20 3d  age;.    int c =
1b5d0 20 2d 31 3b 20 20 2f 2a 20 70 52 65 73 20 72 65   -1;  /* pRes re
1b5e0 74 75 72 6e 20 69 66 20 74 61 62 6c 65 20 69 73  turn if table is
1b5f0 20 65 6d 70 74 79 20 6d 75 73 74 20 62 65 20 2d   empty must be -
1b600 31 20 2a 2f 0a 20 20 20 20 6c 77 72 20 3d 20 30  1 */.    lwr = 0
1b610 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67  ;.    upr = pPag
1b620 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20  e->nCell-1;.    
1b630 69 66 28 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b  if( !pPage->intK
1b640 65 79 20 26 26 20 70 4b 65 79 3d 3d 30 20 29 7b  ey && pKey==0 ){
1b650 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1b660 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1b670 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  T;.    }.    if(
1b680 20 62 69 61 73 52 69 67 68 74 20 29 7b 0a 20 20   biasRight ){.  
1b690 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20      pCur->idx = 
1b6a0 75 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  upr;.    }else{.
1b6b0 20 20 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20        pCur->idx 
1b6c0 3d 20 28 75 70 72 2b 6c 77 72 29 2f 32 3b 0a 20  = (upr+lwr)/2;. 
1b6d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6c 77 72     }.    if( lwr
1b6e0 3c 3d 75 70 72 20 29 20 66 6f 72 28 3b 3b 29 7b  <=upr ) for(;;){
1b6f0 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65  .      void *pCe
1b700 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 69 36 34  llKey;.      i64
1b710 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20   nCellKey;.     
1b720 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
1b730 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  e = 0;.      if(
1b740 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
1b750 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70 43  {.        u8 *pC
1b760 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 43 65  ell;.        pCe
1b770 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
1b780 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 20  age, pCur->idx) 
1b790 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  + pPage->childPt
1b7a0 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  rSize;.        i
1b7b0 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74  f( pPage->hasDat
1b7c0 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  a ){.          u
1b7d0 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20  32 dummy;.      
1b7e0 20 20 20 20 70 43 65 6c 6c 20 2b 3d 20 67 65 74      pCell += get
1b7f0 56 61 72 69 6e 74 33 32 28 70 43 65 6c 6c 2c 20  Varint32(pCell, 
1b800 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20  &dummy);.       
1b810 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56 61   }.        getVa
1b820 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34  rint(pCell, (u64
1b830 20 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20   *)&nCellKey);. 
1b840 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c         if( nCell
1b850 4b 65 79 3c 6e 4b 65 79 20 29 7b 0a 20 20 20 20  Key<nKey ){.    
1b860 20 20 20 20 20 20 63 20 3d 20 2d 31 3b 0a 20 20        c = -1;.  
1b870 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1b880 6e 43 65 6c 6c 4b 65 79 3e 6e 4b 65 79 20 29 7b  nCellKey>nKey ){
1b890 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 2b  .          c = +
1b8a0 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
1b8b0 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  {.          c = 
1b8c0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
1b8d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b8e0 20 20 69 6e 74 20 61 76 61 69 6c 61 62 6c 65 3b    int available;
1b8f0 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65  .        pCellKe
1b900 79 20 3d 20 28 76 6f 69 64 20 2a 29 66 65 74 63  y = (void *)fetc
1b910 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 26  hPayload(pCur, &
1b920 61 76 61 69 6c 61 62 6c 65 2c 20 30 29 3b 0a 20  available, 0);. 
1b930 20 20 20 20 20 20 20 6e 43 65 6c 6c 4b 65 79 20         nCellKey 
1b940 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  = pCur->info.nKe
1b950 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  y;.        if( a
1b960 76 61 69 6c 61 62 6c 65 3e 3d 6e 43 65 6c 6c 4b  vailable>=nCellK
1b970 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
1b980 63 20 3d 20 70 43 75 72 2d 3e 78 43 6f 6d 70 61  c = pCur->xCompa
1b990 72 65 28 70 43 75 72 2d 3e 70 41 72 67 2c 20 6e  re(pCur->pArg, n
1b9a0 43 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b 65  CellKey, pCellKe
1b9b0 79 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a  y, nKey, pKey);.
1b9c0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1b9d0 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65           pCellKe
1b9e0 79 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  y = sqliteMalloc
1b9f0 52 61 77 28 20 6e 43 65 6c 6c 4b 65 79 20 29 3b  Raw( nCellKey );
1ba00 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
1ba10 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 20 72 65 74  CellKey==0 ) ret
1ba20 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
1ba30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1ba40 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
1ba50 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b  (pCur, 0, nCellK
1ba60 65 79 2c 20 28 76 6f 69 64 20 2a 29 70 43 65 6c  ey, (void *)pCel
1ba70 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  lKey);.         
1ba80 20 63 20 3d 20 70 43 75 72 2d 3e 78 43 6f 6d 70   c = pCur->xComp
1ba90 61 72 65 28 70 43 75 72 2d 3e 70 41 72 67 2c 20  are(pCur->pArg, 
1baa0 6e 43 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b  nCellKey, pCellK
1bab0 65 79 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 29 3b  ey, nKey, pKey);
1bac0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1bad0 65 46 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b  eFree(pCellKey);
1bae0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1baf0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1bb00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1bb10 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20  .      if( c==0 
1bb20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1bb30 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 26  Page->leafData &
1bb40 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  & !pPage->leaf )
1bb50 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20  {.          lwr 
1bb60 3d 20 70 43 75 72 2d 3e 69 64 78 3b 0a 20 20 20  = pCur->idx;.   
1bb70 20 20 20 20 20 20 20 75 70 72 20 3d 20 6c 77 72         upr = lwr
1bb80 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   - 1;.          
1bb90 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
1bba0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1bbb0 69 66 28 20 70 52 65 73 20 29 20 2a 70 52 65 73  if( pRes ) *pRes
1bbc0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1bbd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1bbe0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1bbf0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3c    }.      if( c<
1bc00 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 77 72  0 ){.        lwr
1bc10 20 3d 20 70 43 75 72 2d 3e 69 64 78 2b 31 3b 0a   = pCur->idx+1;.
1bc20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1bc30 20 20 20 20 20 75 70 72 20 3d 20 70 43 75 72 2d       upr = pCur-
1bc40 3e 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  >idx-1;.      }.
1bc50 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70        if( lwr>up
1bc60 72 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  r ){.        bre
1bc70 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1bc80 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 28 6c    pCur->idx = (l
1bc90 77 72 2b 75 70 72 29 2f 32 3b 0a 20 20 20 20 7d  wr+upr)/2;.    }
1bca0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72  .    assert( lwr
1bcb0 3d 3d 75 70 72 2b 31 20 29 3b 0a 20 20 20 20 61  ==upr+1 );.    a
1bcc0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
1bcd0 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20  Init );.    if( 
1bce0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
1bcf0 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 30 3b       chldPg = 0;
1bd00 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  .    }else if( l
1bd10 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  wr>=pPage->nCell
1bd20 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67   ){.      chldPg
1bd30 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
1bd40 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
1bd50 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
1bd60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1bd70 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79   chldPg = get4by
1bd80 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  te(findCell(pPag
1bd90 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a  e, lwr));.    }.
1bda0 20 20 20 20 69 66 28 20 63 68 6c 64 50 67 3d 3d      if( chldPg==
1bdb0 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
1bdc0 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20  t( pCur->idx>=0 
1bdd0 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 43 75  && pCur->idx<pCu
1bde0 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  r->pPage->nCell 
1bdf0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 65  );.      if( pRe
1be00 73 20 29 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20  s ) *pRes = c;. 
1be10 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1be20 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
1be30 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 6c 77 72   pCur->idx = lwr
1be40 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f  ;.    pCur->info
1be50 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
1be60 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
1be70 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a  (pCur, chldPg);.
1be80 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1be90 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1bea0 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 4e 4f     }.  }.  /* NO
1beb0 54 20 52 45 41 43 48 45 44 20 2a 2f 0a 7d 0a 0a  T REACHED */.}..
1bec0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
1bed0 45 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  E if the cursor 
1bee0 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20  is not pointing 
1bef0 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74  at an entry of t
1bf00 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
1bf10 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74  TRUE will be ret
1bf20 75 72 6e 65 64 20 61 66 74 65 72 20 61 20 63 61  urned after a ca
1bf30 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
1bf40 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a  eeNext() moves.*
1bf50 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20  * past the last 
1bf60 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
1bf70 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72  le or sqlite3Btr
1bf80 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70  eePrev() moves p
1bf90 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  ast.** the first
1bfa0 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73   entry.  TRUE is
1bfb0 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69   also returned i
1bfc0 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
1bfd0 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
1bfe0 69 74 65 33 42 74 72 65 65 45 6f 66 28 42 74 43  ite3BtreeEof(BtC
1bff0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1c000 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66  /* TODO: What if
1c010 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 69   the cursor is i
1c020 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  n CURSOR_REQUIRE
1c030 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62  SEEK but all tab
1c040 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20  le entries.  ** 
1c050 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65  have been delete
1c060 64 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c  d? This API will
1c070 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20   need to change 
1c080 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  to return an err
1c090 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20  or code.  ** as 
1c0a0 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c  well as the bool
1c0b0 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65  ean result value
1c0c0 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ..  */.  return 
1c0d0 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70  (CURSOR_VALID!=p
1c0e0 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a  Cur->eState);.}.
1c0f0 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  ./*.** Advance t
1c100 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
1c110 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74   next entry in t
1c120 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
1c130 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74  .** successful t
1c140 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e  hen set *pRes=0.
1c150 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a    If the cursor.
1c160 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70  ** was already p
1c170 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c  ointing to the l
1c180 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
1c190 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
1c1a0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
1c1b0 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65   was called, the
1c1c0 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a  n set *pRes=1..*
1c1d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1c1e0 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20  eeNext(BtCursor 
1c1f0 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
1c200 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
1c210 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
1c220 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1c230 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
1c240 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f  .  rc = restoreO
1c250 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69  rClearCursorPosi
1c260 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
1c270 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1c280 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
1c290 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 0a 20 20  ;.  }.#endif .  
1c2a0 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20  assert( pRes!=0 
1c2b0 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  );.  pPage = pCu
1c2c0 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66 28 20  r->pPage;.  if( 
1c2d0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d  CURSOR_INVALID==
1c2e0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
1c2f0 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
1c300 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1c310 5f 4f 4b 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66  _OK;.  }.#ifndef
1c320 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
1c330 52 45 44 5f 43 41 43 48 45 0a 20 20 69 66 28 20  RED_CACHE.  if( 
1c340 70 43 75 72 2d 3e 73 6b 69 70 3e 30 20 29 7b 0a  pCur->skip>0 ){.
1c350 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d      pCur->skip =
1c360 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   0;.    *pRes = 
1c370 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
1c380 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
1c390 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 23  Cur->skip = 0;.#
1c3a0 65 6e 64 69 66 20 0a 0a 20 20 61 73 73 65 72 74  endif ..  assert
1c3b0 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
1c3c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1c3d0 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43  r->idx<pPage->nC
1c3e0 65 6c 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e  ell );..  pCur->
1c3f0 69 64 78 2b 2b 3b 0a 20 20 70 43 75 72 2d 3e 69  idx++;.  pCur->i
1c400 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
1c410 20 69 66 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d   if( pCur->idx>=
1c420 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
1c430 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
1c440 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
1c450 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
1c460 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 26 70  Cur, get4byte(&p
1c470 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
1c480 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
1c490 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
1c4a0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1c4b0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65     rc = moveToLe
1c4c0 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
1c4d0 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
1c4e0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1c4f0 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20      }.    do{.  
1c500 20 20 20 20 69 66 28 20 69 73 52 6f 6f 74 50 61      if( isRootPa
1c510 67 65 28 70 50 61 67 65 29 20 29 7b 0a 20 20 20  ge(pPage) ){.   
1c520 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
1c530 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53          pCur->eS
1c540 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
1c550 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72  VALID;.        r
1c560 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c570 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
1c580 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72  oveToParent(pCur
1c590 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d  );.      pPage =
1c5a0 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
1c5b0 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e    }while( pCur->
1c5c0 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  idx>=pPage->nCel
1c5d0 6c 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d  l );.    *pRes =
1c5e0 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   0;.    if( pPag
1c5f0 65 2d 3e 6c 65 61 66 44 61 74 61 20 29 7b 0a 20  e->leafData ){. 
1c600 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1c610 33 42 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c  3BtreeNext(pCur,
1c620 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73   pRes);.    }els
1c630 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
1c640 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1c650 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1c660 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20  }.  *pRes = 0;. 
1c670 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
1c680 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1c690 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
1c6a0 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  rc = moveToLeftm
1c6b0 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 72 65 74  ost(pCur);.  ret
1c6c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1c6d0 20 53 74 65 70 20 74 68 65 20 63 75 72 73 6f 72   Step the cursor
1c6e0 20 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20   to the back to 
1c6f0 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74  the previous ent
1c700 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
1c710 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65  se.  If.** succe
1c720 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a  ssful then set *
1c730 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20  pRes=0.  If the 
1c740 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c  cursor.** was al
1c750 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74  ready pointing t
1c760 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  o the first entr
1c770 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
1c780 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73  e before.** this
1c790 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
1c7a0 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70  led, then set *p
1c7b0 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71  Res=1..*/.int sq
1c7c0 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
1c7d0 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  us(BtCursor *pCu
1c7e0 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
1c7f0 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e 6f 20   int rc;.  Pgno 
1c800 70 67 6e 6f 3b 0a 20 20 4d 65 6d 50 61 67 65 20  pgno;.  MemPage 
1c810 2a 70 50 61 67 65 3b 0a 0a 23 69 66 6e 64 65 66  *pPage;..#ifndef
1c820 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
1c830 52 45 44 5f 43 41 43 48 45 0a 20 20 72 63 20 3d  RED_CACHE.  rc =
1c840 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43   restoreOrClearC
1c850 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
1c860 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ur);.  if( rc!=S
1c870 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c880 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23  return rc;.  }.#
1c890 65 6e 64 69 66 0a 20 20 69 66 28 20 43 55 52 53  endif.  if( CURS
1c8a0 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
1c8b0 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
1c8c0 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72  *pRes = 1;.    r
1c8d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c8e0 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
1c8f0 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
1c900 43 41 43 48 45 0a 20 20 69 66 28 20 70 43 75 72  CACHE.  if( pCur
1c910 2d 3e 73 6b 69 70 3c 30 20 29 7b 0a 20 20 20 20  ->skip<0 ){.    
1c920 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a  pCur->skip = 0;.
1c930 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
1c940 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1c950 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  _OK;.  }.  pCur-
1c960 3e 73 6b 69 70 20 3d 20 30 3b 0a 23 65 6e 64 69  >skip = 0;.#endi
1c970 66 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  f..  pPage = pCu
1c980 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65  r->pPage;.  asse
1c990 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
1c9a0 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
1c9b0 43 75 72 2d 3e 69 64 78 3e 3d 30 20 29 3b 0a 20  Cur->idx>=0 );. 
1c9c0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
1c9d0 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20  f ){.    pgno = 
1c9e0 67 65 74 34 62 79 74 65 28 20 66 69 6e 64 43 65  get4byte( findCe
1c9f0 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  ll(pPage, pCur->
1ca00 69 64 78 29 20 29 3b 0a 20 20 20 20 72 63 20 3d  idx) );.    rc =
1ca10 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
1ca20 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66  r, pgno);.    if
1ca30 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1ca40 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
1ca50 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29  oRightmost(pCur)
1ca60 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  ;.  }else{.    w
1ca70 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 64 78 3d  hile( pCur->idx=
1ca80 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
1ca90 69 73 52 6f 6f 74 50 61 67 65 28 70 50 61 67 65  isRootPage(pPage
1caa0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  ) ){.        pCu
1cab0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
1cac0 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
1cad0 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
1cae0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
1caf0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
1cb00 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72  .      moveToPar
1cb10 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ent(pCur);.     
1cb20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70   pPage = pCur->p
1cb30 50 61 67 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Page;.    }.    
1cb40 70 43 75 72 2d 3e 69 64 78 2d 2d 3b 0a 20 20 20  pCur->idx--;.   
1cb50 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
1cb60 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  e = 0;.    if( p
1cb70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 26  Page->leafData &
1cb80 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  & !pPage->leaf )
1cb90 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
1cba0 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
1cbb0 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  s(pCur, pRes);. 
1cbc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1cbd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1cbe0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 52 65      }.  }.  *pRe
1cbf0 73 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  s = 0;.  return 
1cc00 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  rc;.}../*.** All
1cc10 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
1cc20 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
1cc30 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  se file..**.** T
1cc40 68 65 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d  he new page is m
1cc50 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20  arked as dirty. 
1cc60 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (In other words
1cc70 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  , sqlite3PagerWr
1cc80 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72  ite().** has alr
1cc90 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
1cca0 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
1ccb0 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61 67 65  .)  The new page
1ccc0 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65   has also.** bee
1ccd0 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64  n referenced and
1cce0 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75   the calling rou
1ccf0 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69  tine is responsi
1cd00 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a  ble for calling.
1cd10 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ** sqlite3PagerU
1cd20 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65  nref() on the ne
1cd30 77 20 70 61 67 65 20 77 68 65 6e 20 69 74 20 69  w page when it i
1cd40 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  s done..**.** SQ
1cd50 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1cd60 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ned on success. 
1cd70 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72   Any other retur
1cd80 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65  n value indicate
1cd90 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20  s.** an error.  
1cda0 2a 70 70 50 61 67 65 20 61 6e 64 20 2a 70 50 67  *ppPage and *pPg
1cdb0 6e 6f 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  no are undefined
1cdc0 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
1cdd0 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f   an error..** Do
1cde0 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73 71 6c 69   not invoke sqli
1cdf0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20  te3PagerUnref() 
1ce00 6f 6e 20 2a 70 70 50 61 67 65 20 69 66 20 61 6e  on *ppPage if an
1ce10 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
1ce20 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
1ce30 20 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65   "nearby" parame
1ce40 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68  ter is not 0, th
1ce50 65 6e 20 61 20 28 66 65 65 62 6c 65 29 20 65 66  en a (feeble) ef
1ce60 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20  fort is made to 
1ce70 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67  .** locate a pag
1ce80 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70  e close to the p
1ce90 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72  age number "near
1cea0 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62  by".  This can b
1ceb0 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20  e used in an.** 
1cec0 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20  attempt to keep 
1ced0 72 65 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c  related pages cl
1cee0 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65  ose to each othe
1cef0 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  r in the databas
1cf00 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68  e file,.** which
1cf10 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b   in turn can mak
1cf20 65 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73  e database acces
1cf30 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  s faster..**.** 
1cf40 49 66 20 74 68 65 20 22 65 78 61 63 74 22 20 70  If the "exact" p
1cf50 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
1cf60 30 2c 20 61 6e 64 20 74 68 65 20 70 61 67 65 2d  0, and the page-
1cf70 6e 75 6d 62 65 72 20 6e 65 61 72 62 79 20 65 78  number nearby ex
1cf80 69 73 74 73 20 0a 2a 2a 20 61 6e 79 77 68 65 72  ists .** anywher
1cf90 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e on the free-li
1cfa0 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67  st, then it is g
1cfb0 75 61 72 65 6e 74 65 65 64 20 74 6f 20 62 65 20  uarenteed to be 
1cfc0 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a  returned. This.*
1cfd0 2a 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62  * is only used b
1cfe0 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  y auto-vacuum da
1cff0 74 61 62 61 73 65 73 20 77 68 65 6e 20 61 6c 6c  tabases when all
1d000 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 74 61  ocating a new ta
1d010 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
1d020 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  nt allocateBtree
1d030 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
1d040 20 2a 70 42 74 2c 20 0a 20 20 4d 65 6d 50 61 67   *pBt, .  MemPag
1d050 65 20 2a 2a 70 70 50 61 67 65 2c 20 0a 20 20 50  e **ppPage, .  P
1d060 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a 20 20 50  gno *pPgno, .  P
1d070 67 6e 6f 20 6e 65 61 72 62 79 2c 0a 20 20 75 38  gno nearby,.  u8
1d080 20 65 78 61 63 74 0a 29 7b 0a 20 20 4d 65 6d 50   exact.){.  MemP
1d090 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69  age *pPage1;.  i
1d0a0 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 3b 20  nt rc;.  int n; 
1d0b0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1d0c0 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
1d0d0 65 65 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  eelist */.  int 
1d0e0 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  k;     /* Number
1d0f0 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68   of leaves on th
1d100 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66  e trunk of the f
1d110 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d  reelist */.  Mem
1d120 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30  Page *pTrunk = 0
1d130 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72  ;.  MemPage *pPr
1d140 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 0a 20 20  evTrunk = 0;..  
1d150 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50  pPage1 = pBt->pP
1d160 61 67 65 31 3b 0a 20 20 6e 20 3d 20 67 65 74 34  age1;.  n = get4
1d170 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
1d180 61 74 61 5b 33 36 5d 29 3b 0a 20 20 69 66 28 20  ata[36]);.  if( 
1d190 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  n>0 ){.    /* Th
1d1a0 65 72 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e  ere are pages on
1d1b0 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
1d1c0 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f  Reuse one of tho
1d1d0 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20  se pages. */.   
1d1e0 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20   Pgno iTrunk;.  
1d1f0 20 20 75 38 20 73 65 61 72 63 68 4c 69 73 74 20    u8 searchList 
1d200 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66  = 0; /* If the f
1d210 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65  ree-list must be
1d220 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e   searched for 'n
1d230 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20  earby' */.    . 
1d240 20 20 20 2f 2a 20 49 66 20 74 68 65 20 27 65 78     /* If the 'ex
1d250 61 63 74 27 20 70 61 72 61 6d 65 74 65 72 20 77  act' parameter w
1d260 61 73 20 74 72 75 65 20 61 6e 64 20 61 20 71 75  as true and a qu
1d270 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74  ery of the point
1d280 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68  er-map.    ** sh
1d290 6f 77 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ows that the pag
1d2a0 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f  e 'nearby' is so
1d2b0 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66  mewhere on the f
1d2c0 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20  ree-list, then. 
1d2d0 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65     ** the entire
1d2e0 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65  -list will be se
1d2f0 61 72 63 68 65 64 20 66 6f 72 20 74 68 61 74 20  arched for that 
1d300 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  page..    */.#if
1d310 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1d320 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
1d330 69 66 28 20 65 78 61 63 74 20 29 7b 0a 20 20 20  if( exact ){.   
1d340 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
1d350 20 20 20 61 73 73 65 72 74 28 20 6e 65 61 72 62     assert( nearb
1d360 79 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  y>0 );.      ass
1d370 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
1d380 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 72 63  cuum );.      rc
1d390 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
1d3a0 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70 65  , nearby, &eType
1d3b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
1d3c0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1d3d0 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
1d3e0 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45  =PTRMAP_FREEPAGE
1d3f0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 61 72   ){.        sear
1d400 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20  chList = 1;.    
1d410 20 20 7d 0a 20 20 20 20 20 20 2a 70 50 67 6e 6f    }.      *pPgno
1d420 20 3d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 7d   = nearby;.    }
1d430 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
1d440 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72  Decrement the fr
1d450 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79  ee-list count by
1d460 20 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74   1. Set iTrunk t
1d470 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
1d480 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20  he.    ** first 
1d490 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  free-list trunk 
1d4a0 70 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b  page. iPrevTrunk
1d4b0 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e   is initially 1.
1d4c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
1d4d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1d4e0 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  te(pPage1->pDbPa
1d4f0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
1d500 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1d510 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
1d520 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d  1->aData[36], n-
1d530 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  1);..    /* The 
1d540 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69 73  code within this
1d550 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c   loop is run onl
1d560 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27 73  y once if the 's
1d570 65 61 72 63 68 4c 69 73 74 27 20 76 61 72 69 61  earchList' varia
1d580 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f  ble.    ** is no
1d590 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69 73  t true. Otherwis
1d5a0 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65 20  e, it runs once 
1d5b0 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d 70  for each trunk-p
1d5c0 61 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  age on the.    *
1d5d0 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74 69  * free-list unti
1d5e0 6c 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72  l the page 'near
1d5f0 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 2e 0a  by' is located..
1d600 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a      */.    do {.
1d610 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b        pPrevTrunk
1d620 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = pTrunk;.     
1d630 20 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20   if( pPrevTrunk 
1d640 29 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e  ){.        iTrun
1d650 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  k = get4byte(&pP
1d660 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  revTrunk->aData[
1d670 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  0]);.      }else
1d680 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b  {.        iTrunk
1d690 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
1d6a0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b  ge1->aData[32]);
1d6b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
1d6c0 63 20 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c  c = getPage(pBt,
1d6d0 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b   iTrunk, &pTrunk
1d6e0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
1d6f0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54  rc ){.        pT
1d700 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
1d710 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
1d720 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
1d730 7d 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74  }..      k = get
1d740 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
1d750 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20  Data[4]);.      
1d760 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61  if( k==0 && !sea
1d770 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  rchList ){.     
1d780 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20     /* The trunk 
1d790 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e  has no leaves an
1d7a0 64 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f  d the list is no
1d7b0 74 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64  t being searched
1d7c0 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f  . .        ** So
1d7d0 20 65 78 74 72 61 63 74 20 74 68 65 20 74 72 75   extract the tru
1d7e0 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20 61  nk page itself a
1d7f0 6e 64 20 75 73 65 20 69 74 20 61 73 20 74 68 65  nd use it as the
1d800 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20   newly .        
1d810 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  ** allocated pag
1d820 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  e */.        ass
1d830 65 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d  ert( pPrevTrunk=
1d840 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  =0 );.        rc
1d850 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1d860 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
1d870 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
1d880 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
1d890 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
1d8a0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
1d8b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50     }.        *pP
1d8c0 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20  gno = iTrunk;.  
1d8d0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
1d8e0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
1d8f0 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
1d900 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
1d910 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b  *ppPage = pTrunk
1d920 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  ;.        pTrunk
1d930 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52   = 0;.        TR
1d940 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
1d950 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72  %d trunk - %d fr
1d960 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22  ee pages left\n"
1d970 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b  , *pPgno, n-1));
1d980 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1d990 20 6b 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   k>pBt->usableSi
1d9a0 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20  ze/4 - 8 ){.    
1d9b0 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20      /* Value of 
1d9c0 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67  k is out of rang
1d9d0 65 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72  e.  Database cor
1d9e0 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ruption */.     
1d9f0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
1da00 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1da10 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
1da20 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66  locate_page;.#if
1da30 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1da40 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
1da50 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72    }else if( sear
1da60 63 68 4c 69 73 74 20 26 26 20 6e 65 61 72 62 79  chList && nearby
1da70 3d 3d 69 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  ==iTrunk ){.    
1da80 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20      /* The list 
1da90 69 73 20 62 65 69 6e 67 20 73 65 61 72 63 68 65  is being searche
1daa0 64 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b  d and this trunk
1dab0 20 70 61 67 65 20 69 73 20 74 68 65 20 70 61 67   page is the pag
1dac0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  e.        ** to 
1dad0 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64  allocate, regard
1dae0 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
1daf0 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20  it has leaves.. 
1db00 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1db10 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
1db20 3d 3d 69 54 72 75 6e 6b 20 29 3b 0a 20 20 20 20  ==iTrunk );.    
1db30 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54      *ppPage = pT
1db40 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73 65  runk;.        se
1db50 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20  archList = 0;.  
1db60 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1db70 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
1db80 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
1db90 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
1dba0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
1dbb0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
1dbc0 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
1dbd0 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b       if( k==0 ){
1dbe0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
1dbf0 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
1dc00 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
1dc10 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
1dc20 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  32], &pTrunk->aD
1dc30 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
1dc40 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1dc50 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
1dc60 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
1dc70 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[0], &pTrunk->
1dc80 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
1dc90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1dca0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1dcb0 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20     /* The trunk 
1dcc0 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64  page is required
1dcd0 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62   by the caller b
1dce0 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a  ut it contains .
1dcf0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69            ** poi
1dd00 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69  nters to free-li
1dd10 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66  st leaves. The f
1dd20 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65  irst leaf become
1dd30 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20  s a trunk.      
1dd40 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74      ** page in t
1dd50 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20  his case..      
1dd60 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
1dd70 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72   MemPage *pNewTr
1dd80 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50  unk;.          P
1dd90 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20  gno iNewTrunk = 
1dda0 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
1ddb0 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20  ->aData[8]);.   
1ddc0 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 50         rc = getP
1ddd0 61 67 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75  age(pBt, iNewTru
1dde0 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20  nk, &pNewTrunk, 
1ddf0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  0);.          if
1de00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1de10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  ){.            g
1de20 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
1de30 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
1de40 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   }.          rc 
1de50 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1de60 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70  ite(pNewTrunk->p
1de70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1de80 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1de90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1dea0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1deb0 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  pNewTrunk);.    
1dec0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1ded0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
1dee0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1def0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e        memcpy(&pN
1df00 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  ewTrunk->aData[0
1df10 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
1df20 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
1df30 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 4e      put4byte(&pN
1df40 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  ewTrunk->aData[4
1df50 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20  ], k-1);.       
1df60 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54     memcpy(&pNewT
1df70 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20  runk->aData[8], 
1df80 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31  &pTrunk->aData[1
1df90 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20  2], (k-1)*4);.  
1dfa0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
1dfb0 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a  age(pNewTrunk);.
1dfc0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
1dfd0 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20  PrevTrunk ){.   
1dfe0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
1dff0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1e000 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29  [32], iNewTrunk)
1e010 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
1e020 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
1e030 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1e040 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b  Write(pPrevTrunk
1e050 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1e060 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
1e070 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1e080 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
1e090 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
1e0a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1e0b0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 72 65    put4byte(&pPre
1e0c0 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
1e0d0 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  , iNewTrunk);.  
1e0e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e0f0 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75    }.        pTru
1e100 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
1e110 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
1e120 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20  : %d trunk - %d 
1e130 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c  free pages left\
1e140 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29  n", *pPgno, n-1)
1e150 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
1e160 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
1e170 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65 61 66  * Extract a leaf
1e180 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20   from the trunk 
1e190 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63  */.        int c
1e1a0 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20  losest;.        
1e1b0 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20  Pgno iPage;.    
1e1c0 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
1e1d0 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e  r *aData = pTrun
1e1e0 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20  k->aData;.      
1e1f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1e200 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
1e210 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
1e220 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
1e230 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1e240 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
1e250 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e260 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b   if( nearby>0 ){
1e270 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
1e280 2c 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20  , dist;.        
1e290 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20    closest = 0;. 
1e2a0 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20           dist = 
1e2b0 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
1e2c0 38 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20  8]) - nearby;.  
1e2d0 20 20 20 20 20 20 20 20 69 66 28 20 64 69 73 74          if( dist
1e2e0 3c 30 20 29 20 64 69 73 74 20 3d 20 2d 64 69 73  <0 ) dist = -dis
1e2f0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  t;.          for
1e300 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b  (i=1; i<k; i++){
1e310 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
1e320 20 64 32 20 3d 20 67 65 74 34 62 79 74 65 28 26   d2 = get4byte(&
1e330 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20  aData[8+i*4]) - 
1e340 6e 65 61 72 62 79 3b 0a 20 20 20 20 20 20 20 20  nearby;.        
1e350 20 20 20 20 69 66 28 20 64 32 3c 30 20 29 20 64      if( d2<0 ) d
1e360 32 20 3d 20 2d 64 32 3b 0a 20 20 20 20 20 20 20  2 = -d2;.       
1e370 20 20 20 20 20 69 66 28 20 64 32 3c 64 69 73 74       if( d2<dist
1e380 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1e390 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20    closest = i;. 
1e3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73               dis
1e3b0 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20  t = d2;.        
1e3c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1e3d0 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
1e3e0 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65  .          close
1e3f0 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
1e400 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67 65  }..        iPage
1e410 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61   = get4byte(&aDa
1e420 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29  ta[8+closest*4])
1e430 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73  ;.        if( !s
1e440 65 61 72 63 68 4c 69 73 74 20 7c 7c 20 69 50 61  earchList || iPa
1e450 67 65 3d 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20  ge==nearby ){.  
1e460 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
1e470 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
1e480 20 20 69 66 28 20 2a 70 50 67 6e 6f 3e 73 71 6c    if( *pPgno>sql
1e490 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
1e4a0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20  nt(pBt->pPager) 
1e4b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
1e4c0 2a 20 46 72 65 65 20 70 61 67 65 20 6f 66 66 20  * Free page off 
1e4d0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
1e4e0 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ile */.         
1e4f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1e500 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1e510 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1e520 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
1e530 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65  OCATE: %d was le
1e540 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74  af %d of %d on t
1e550 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20  runk %d".       
1e560 20 20 20 20 20 20 20 20 20 20 22 3a 20 25 64 20            ": %d 
1e570 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65 73 5c  more free pages\
1e580 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1e590 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f       *pPgno, clo
1e5a0 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e  sest+1, k, pTrun
1e5b0 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a  k->pgno, n-1));.
1e5c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 6c            if( cl
1e5d0 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20  osest<k-1 ){.   
1e5e0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
1e5f0 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74  &aData[8+closest
1e600 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a  *4], &aData[4+k*
1e610 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  4], 4);.        
1e620 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75    }.          pu
1e630 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d  t4byte(&aData[4]
1e640 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  , k-1);.        
1e650 20 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70    rc = getPage(p
1e660 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61  Bt, *pPgno, ppPa
1e670 67 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ge, 1);.        
1e680 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1e690 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1e6a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1e6b0 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61  agerWrite((*ppPa
1e6c0 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge)->pDbPage);. 
1e6d0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
1e6e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1e6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1e700 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
1e710 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
1e720 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
1e730 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
1e740 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
1e750 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1e760 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65  releasePage(pPre
1e770 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70  vTrunk);.      p
1e780 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  PrevTrunk = 0;. 
1e790 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63     }while( searc
1e7a0 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65  hList );.  }else
1e7b0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61  {.    /* There a
1e7c0 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74  re no pages on t
1e7d0 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20  he freelist, so 
1e7e0 63 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67  create a new pag
1e7f0 65 20 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  e at the.    ** 
1e800 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
1e810 2a 2f 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20  */.    *pPgno = 
1e820 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
1e830 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
1e840 72 29 20 2b 20 31 3b 0a 0a 23 69 66 6e 64 65 66  r) + 1;..#ifndef
1e850 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1e860 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
1e870 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
1e880 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  && PTRMAP_ISPAGE
1e890 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 20 29 7b  (pBt, *pPgno) ){
1e8a0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50  .      /* If *pP
1e8b0 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20  gno refers to a 
1e8c0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
1e8d0 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e  , allocate two n
1e8e0 65 77 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a  ew pages.      *
1e8f0 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
1e900 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64  the file instead
1e910 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72   of one. The fir
1e920 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  st allocated pag
1e930 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d  e.      ** becom
1e940 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72  es a new pointer
1e950 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65 20 73  -map page, the s
1e960 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79  econd is used by
1e970 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20   the caller..   
1e980 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 52 41 43     */.      TRAC
1e990 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
1e9a0 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c   from end of fil
1e9b0 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  e (pointer-map p
1e9c0 61 67 65 29 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29  age)\n", *pPgno)
1e9d0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1e9e0 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47   *pPgno!=PENDING
1e9f0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1ea00 29 3b 0a 20 20 20 20 20 20 28 2a 70 50 67 6e 6f  );.      (*pPgno
1ea10 29 2b 2b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  )++;.    }.#endi
1ea20 66 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a  f..    assert( *
1ea30 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42  pPgno!=PENDING_B
1ea40 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
1ea50 0a 20 20 20 20 72 63 20 3d 20 67 65 74 50 61 67  .    rc = getPag
1ea60 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70  e(pBt, *pPgno, p
1ea70 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69  pPage, 0);.    i
1ea80 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1ea90 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  c;.    rc = sqli
1eaa0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a  te3PagerWrite((*
1eab0 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
1eac0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1ead0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1eae0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
1eaf0 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
1eb00 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
1eb10 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20  TE: %d from end 
1eb20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67  of file\n", *pPg
1eb30 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  no));.  }..  ass
1eb40 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e  ert( *pPgno!=PEN
1eb50 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1eb60 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f  Bt) );..end_allo
1eb70 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c  cate_page:.  rel
1eb80 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29  easePage(pTrunk)
1eb90 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
1eba0 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 72  pPrevTrunk);.  r
1ebb0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1ebc0 2a 2a 20 41 64 64 20 61 20 70 61 67 65 20 6f 66  ** Add a page of
1ebd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1ebe0 6c 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  le to the freeli
1ebf0 73 74 2e 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65  st..**.** sqlite
1ec00 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 69 73  3PagerUnref() is
1ec10 20 4e 4f 54 20 63 61 6c 6c 65 64 20 66 6f 72 20   NOT called for 
1ec20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  pPage..*/.static
1ec30 20 69 6e 74 20 66 72 65 65 50 61 67 65 28 4d 65   int freePage(Me
1ec40 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
1ec50 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1ec60 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 4d   pPage->pBt;.  M
1ec70 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d  emPage *pPage1 =
1ec80 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
1ec90 69 6e 74 20 72 63 2c 20 6e 2c 20 6b 3b 0a 0a 20  int rc, n, k;.. 
1eca0 20 2f 2a 20 50 72 65 70 61 72 65 20 74 68 65 20   /* Prepare the 
1ecb0 70 61 67 65 20 66 6f 72 20 66 72 65 65 69 6e 67  page for freeing
1ecc0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
1ecd0 61 67 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20  age->pgno>1 );. 
1ece0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
1ecf0 20 30 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67   0;.  releasePag
1ed00 65 28 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  e(pPage->pParent
1ed10 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 50 61 72  );.  pPage->pPar
1ed20 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49  ent = 0;..  /* I
1ed30 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65  ncrement the fre
1ed40 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20  e page count on 
1ed50 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d  pPage1 */.  rc =
1ed60 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1ed70 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  te(pPage1->pDbPa
1ed80 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
1ed90 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6e 20 3d  return rc;.  n =
1eda0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
1edb0 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
1edc0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
1edd0 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2b  1->aData[36], n+
1ede0 31 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  1);..#ifdef SQLI
1edf0 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
1ee00 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 53 51 4c  .  /* If the SQL
1ee10 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  ITE_SECURE_DELET
1ee20 45 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  E compile-time o
1ee30 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ption is enabled
1ee40 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6c 77 61  , then.  ** alwa
1ee50 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69  ys fully overwri
1ee60 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72  te deleted infor
1ee70 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f  mation with zero
1ee80 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  s..  */.  rc = s
1ee90 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1eea0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
1eeb0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
1eec0 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 73 65 74  urn rc;.  memset
1eed0 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30  (pPage->aData, 0
1eee0 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61  , pPage->pBt->pa
1eef0 67 65 53 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a  geSize);.#endif.
1ef00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1ef10 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1ef20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
1ef30 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
1ef40 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65  to-vacuum, write
1ef50 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
1ef60 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a   pointer-map.  *
1ef70 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  * to indicate th
1ef80 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66  at the page is f
1ef90 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ree..  */.  if( 
1efa0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
1efb0 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d  ){.    rc = ptrm
1efc0 61 70 50 75 74 28 70 42 74 2c 20 70 50 61 67 65  apPut(pBt, pPage
1efd0 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 46  ->pgno, PTRMAP_F
1efe0 52 45 45 50 41 47 45 2c 20 30 29 3b 0a 20 20 20  REEPAGE, 0);.   
1eff0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1f000 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   rc;.  }.#endif.
1f010 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20  .  if( n==0 ){. 
1f020 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
1f030 65 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67  e first free pag
1f040 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  e */.    rc = sq
1f050 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1f060 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
1f070 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
1f080 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6d 65 6d  turn rc;.    mem
1f090 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61  set(pPage->aData
1f0a0 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20 70 75 74  , 0, 8);.    put
1f0b0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
1f0c0 44 61 74 61 5b 33 32 5d 2c 20 70 50 61 67 65 2d  Data[32], pPage-
1f0d0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 54 52 41 43  >pgno);.    TRAC
1f0e0 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25  E(("FREE-PAGE: %
1f0f0 64 20 66 69 72 73 74 5c 6e 22 2c 20 70 50 61 67  d first\n", pPag
1f100 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c  e->pgno));.  }el
1f110 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 74 68 65 72  se{.    /* Other
1f120 20 66 72 65 65 20 70 61 67 65 73 20 61 6c 72 65   free pages alre
1f130 61 64 79 20 65 78 69 73 74 2e 20 20 52 65 74 72  ady exist.  Retr
1f140 69 76 65 20 74 68 65 20 66 69 72 73 74 20 74 72  ive the first tr
1f150 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 2a 2a 20  unk page.    ** 
1f160 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  of the freelist 
1f170 61 6e 64 20 66 69 6e 64 20 6f 75 74 20 68 6f 77  and find out how
1f180 20 6d 61 6e 79 20 6c 65 61 76 65 73 20 69 74 20   many leaves it 
1f190 68 61 73 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50  has. */.    MemP
1f1a0 61 67 65 20 2a 70 54 72 75 6e 6b 3b 0a 20 20 20  age *pTrunk;.   
1f1b0 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70 42   rc = getPage(pB
1f1c0 74 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61  t, get4byte(&pPa
1f1d0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 2c  ge1->aData[32]),
1f1e0 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20   &pTrunk, 0);.  
1f1f0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1f200 6e 20 72 63 3b 0a 20 20 20 20 6b 20 3d 20 67 65  n rc;.    k = ge
1f210 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
1f220 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 69  aData[4]);.    i
1f230 66 28 20 6b 3e 3d 70 42 74 2d 3e 75 73 61 62 6c  f( k>=pBt->usabl
1f240 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20  eSize/4 - 8 ){. 
1f250 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e       /* The trun
1f260 6b 20 69 73 20 66 75 6c 6c 2e 20 20 54 75 72 6e  k is full.  Turn
1f270 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   the page being 
1f280 66 72 65 65 64 20 69 6e 74 6f 20 61 20 6e 65 77  freed into a new
1f290 0a 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 6b 20  .      ** trunk 
1f2a0 70 61 67 65 20 77 69 74 68 20 6e 6f 20 6c 65 61  page with no lea
1f2b0 76 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63  ves. */.      rc
1f2c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1f2d0 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
1f2e0 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
1f2f0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1f300 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
1f310 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 70 54 72  Page->aData, pTr
1f320 75 6e 6b 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  unk->pgno);.    
1f330 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
1f340 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b  e->aData[4], 0);
1f350 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
1f360 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
1f370 32 5d 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  2], pPage->pgno)
1f380 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  ;.      TRACE(("
1f390 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65  FREE-PAGE: %d ne
1f3a0 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70  w trunk page rep
1f3b0 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 0a 20 20  lacing %d\n",.  
1f3c0 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
1f3d0 65 2d 3e 70 67 6e 6f 2c 20 70 54 72 75 6e 6b 2d  e->pgno, pTrunk-
1f3e0 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c  >pgno));.    }el
1f3f0 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 64  se{.      /* Add
1f400 20 74 68 65 20 6e 65 77 6c 79 20 66 72 65 65 64   the newly freed
1f410 20 70 61 67 65 20 61 73 20 61 20 6c 65 61 66 20   page as a leaf 
1f420 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  on the current t
1f430 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63  runk */.      rc
1f440 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1f450 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
1f460 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
1f470 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
1f480 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
1f490 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
1f4a0 5d 2c 20 6b 2b 31 29 3b 0a 20 20 20 20 20 20 70  ], k+1);.      p
1f4b0 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
1f4c0 3e 61 44 61 74 61 5b 38 2b 6b 2a 34 5d 2c 20 70  >aData[8+k*4], p
1f4d0 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 23 69 66  Page->pgno);.#if
1f4e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55  ndef SQLITE_SECU
1f4f0 52 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20  RE_DELETE.      
1f500 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
1f510 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
1f520 72 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  r, pPage->pgno);
1f530 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 54 52  .#endif.      TR
1f540 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
1f550 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e   %d leaf on trun
1f560 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61  k page %d\n",pPa
1f570 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d  ge->pgno,pTrunk-
1f580 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20  >pgno));.    }. 
1f590 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1f5a0 54 72 75 6e 6b 29 3b 0a 20 20 7d 0a 20 20 72 65  Trunk);.  }.  re
1f5b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1f5c0 2a 20 46 72 65 65 20 61 6e 79 20 6f 76 65 72 66  * Free any overf
1f5d0 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69  low pages associ
1f5e0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69  ated with the gi
1f5f0 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61  ven Cell..*/.sta
1f600 74 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65 6c  tic int clearCel
1f610 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
1f620 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
1f630 2a 70 43 65 6c 6c 29 7b 0a 20 20 42 74 53 68 61  *pCell){.  BtSha
1f640 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
1f650 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66  ->pBt;.  CellInf
1f660 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f  o info;.  Pgno o
1f670 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  vflPgno;.  int r
1f680 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a  c;.  int nOvfl;.
1f690 20 20 69 6e 74 20 6f 76 66 6c 50 61 67 65 53 69    int ovflPageSi
1f6a0 7a 65 3b 0a 0a 20 20 70 61 72 73 65 43 65 6c 6c  ze;..  parseCell
1f6b0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
1f6c0 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20  , &info);.  if( 
1f6d0 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d  info.iOverflow==
1f6e0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1f6f0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e  SQLITE_OK;  /* N
1f700 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
1f710 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74  . Return without
1f720 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
1f730 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e  */.  }.  ovflPgn
1f740 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43  o = get4byte(&pC
1f750 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
1f760 6f 77 5d 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65  ow]);.  ovflPage
1f770 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
1f780 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f  leSize - 4;.  nO
1f790 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61 79  vfl = (info.nPay
1f7a0 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63  load - info.nLoc
1f7b0 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a  al + ovflPageSiz
1f7c0 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53  e - 1)/ovflPageS
1f7d0 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  ize;.  assert( o
1f7e0 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f  vflPgno==0 || nO
1f7f0 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65  vfl>0 );.  while
1f800 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20  ( nOvfl-- ){.   
1f810 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 3b   MemPage *pOvfl;
1f820 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e  .    if( ovflPgn
1f830 6f 3d 3d 30 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f  o==0 || ovflPgno
1f840 3e 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67  >sqlite3PagerPag
1f850 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
1f860 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  er) ){.      ret
1f870 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1f880 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
1f890 20 20 20 72 63 20 3d 20 67 65 74 50 61 67 65 28     rc = getPage(
1f8a0 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26  pBt, ovflPgno, &
1f8b0 70 4f 76 66 6c 2c 20 30 29 3b 0a 20 20 20 20 69  pOvfl, 0);.    i
1f8c0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1f8d0 63 3b 0a 20 20 20 20 69 66 28 20 6e 4f 76 66 6c  c;.    if( nOvfl
1f8e0 20 29 7b 0a 20 20 20 20 20 20 6f 76 66 6c 50 67   ){.      ovflPg
1f8f0 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 4f  no = get4byte(pO
1f900 76 66 6c 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  vfl->aData);.   
1f910 20 7d 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65   }.    rc = free
1f920 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20  Page(pOvfl);.   
1f930 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1f940 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67  ef(pOvfl->pDbPag
1f950 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
1f960 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1f970 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f980 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  OK;.}../*.** Cre
1f990 61 74 65 20 74 68 65 20 62 79 74 65 20 73 65 71  ate the byte seq
1f9a0 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72 65  uence used to re
1f9b0 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f  present a cell o
1f9c0 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a 20  n page pPage.** 
1f9d0 61 6e 64 20 77 72 69 74 65 20 74 68 61 74 20 62  and write that b
1f9e0 79 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e 74  yte sequence int
1f9f0 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72  o pCell[].  Over
1fa00 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a 2a  flow pages are.*
1fa10 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  * allocated and 
1fa20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65 63  filled in as nec
1fa30 65 73 73 61 72 79 2e 20 20 54 68 65 20 63 61 6c  essary.  The cal
1fa40 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a 2a  ling procedure.*
1fa50 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  * is responsible
1fa60 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65   for making sure
1fa70 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
1fa80 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
1fa90 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c  ated.** for pCel
1faa0 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  l[]..**.** Note 
1fab0 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73 20  that pCell does 
1fac0 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e 65  not necessary ne
1fad0 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  ed to point to t
1fae0 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a  he pPage->aData.
1faf0 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c 20  ** area.  pCell 
1fb00 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 73  might point to s
1fb10 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74  ome temporary st
1fb20 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c 6c  orage.  The cell
1fb30 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73   will.** be cons
1fb40 74 72 75 63 74 65 64 20 69 6e 20 74 68 69 73 20  tructed in this 
1fb50 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20 74  temporary area t
1fb60 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  hen copied into 
1fb70 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20  pPage->aData.** 
1fb80 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  later..*/.static
1fb90 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28   int fillInCell(
1fba0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1fbb0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1fbc0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68    /* The page th
1fbd0 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
1fbe0 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  cell */.  unsign
1fbf0 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20  ed char *pCell, 
1fc00 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
1fc10 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65  lete text of the
1fc20 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74   cell */.  const
1fc30 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34   void *pKey, i64
1fc40 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65   nKey,    /* The
1fc50 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20   key */.  const 
1fc60 76 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e 74 20  void *pData,int 
1fc70 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54 68 65 20  nData,   /* The 
1fc80 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  data */.  int *p
1fc90 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  nSize           
1fca0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
1fcb0 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65  e cell size here
1fcc0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61   */.){.  int nPa
1fcd0 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75  yload;.  const u
1fce0 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e  8 *pSrc;.  int n
1fcf0 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e  Src, n, rc;.  in
1fd00 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d  t spaceLeft;.  M
1fd10 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20  emPage *pOvfl = 
1fd20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  0;.  MemPage *pT
1fd30 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20  oRelease = 0;.  
1fd40 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
1fd50 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65  Prior;.  unsigne
1fd60 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64  d char *pPayload
1fd70 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
1fd80 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
1fd90 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20    Pgno pgnoOvfl 
1fda0 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64  = 0;.  int nHead
1fdb0 65 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  er;.  CellInfo i
1fdc0 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20  nfo;..  /* Fill 
1fdd0 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a  in the header. *
1fde0 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 30 3b  /.  nHeader = 0;
1fdf0 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
1fe00 65 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64  eaf ){.    nHead
1fe10 65 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69  er += 4;.  }.  i
1fe20 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74  f( pPage->hasDat
1fe30 61 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72  a ){.    nHeader
1fe40 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70   += putVarint(&p
1fe50 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e  Cell[nHeader], n
1fe60 44 61 74 61 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Data);.  }else{.
1fe70 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20      nData = 0;. 
1fe80 20 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d 20   }.  nHeader += 
1fe90 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  putVarint(&pCell
1fea0 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36 34  [nHeader], *(u64
1feb0 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 70 61 72 73  *)&nKey);.  pars
1fec0 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
1fed0 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
1fee0 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48   assert( info.nH
1fef0 65 61 64 65 72 3d 3d 6e 48 65 61 64 65 72 20 29  eader==nHeader )
1ff00 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f  ;.  assert( info
1ff10 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20  .nKey==nKey );. 
1ff20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44   assert( info.nD
1ff30 61 74 61 3d 3d 6e 44 61 74 61 20 29 3b 0a 20 20  ata==nData );.  
1ff40 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68  .  /* Fill in th
1ff50 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e  e payload */.  n
1ff60 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61 3b  Payload = nData;
1ff70 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
1ff80 74 4b 65 79 20 29 7b 0a 20 20 20 20 70 53 72 63  tKey ){.    pSrc
1ff90 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 6e 53   = pData;.    nS
1ffa0 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20  rc = nData;.    
1ffb0 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c  nData = 0;.  }el
1ffc0 73 65 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64  se{.    nPayload
1ffd0 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 70 53   += nKey;.    pS
1ffe0 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e  rc = pKey;.    n
1fff0 53 72 63 20 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a  Src = nKey;.  }.
20000 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66 6f    *pnSize = info
20010 2e 6e 53 69 7a 65 3b 0a 20 20 73 70 61 63 65 4c  .nSize;.  spaceL
20020 65 66 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61  eft = info.nLoca
20030 6c 3b 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20  l;.  pPayload = 
20040 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b  &pCell[nHeader];
20050 0a 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65  .  pPrior = &pCe
20060 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
20070 77 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20 6e 50  w];..  while( nP
20080 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20  ayload>0 ){.    
20090 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30  if( spaceLeft==0
200a0 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
200b0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
200c0 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67  UM.      Pgno pg
200d0 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f  noPtrmap = pgnoO
200e0 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77  vfl; /* Overflow
200f0 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61   page pointer-ma
20100 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a  p entry page */.
20110 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20  #endif.      rc 
20120 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
20130 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c  age(pBt, &pOvfl,
20140 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f   &pgnoOvfl, pgno
20150 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64 65  Ovfl, 0);.#ifnde
20160 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
20170 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f  TOVACUUM.      /
20180 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
20190 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d  e supports auto-
201a0 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68 65 20  vacuum, and the 
201b0 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65 71  second or subseq
201c0 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76  uent.      ** ov
201d0 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 62  erflow page is b
201e0 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20  eing allocated, 
201f0 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20  add an entry to 
20200 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
20210 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 61        ** for tha
20220 74 20 70 61 67 65 20 6e 6f 77 2e 20 54 68 65 20  t page now. The 
20230 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69  entry for the fi
20240 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  rst overflow pag
20250 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20  e will be.      
20260 2a 2a 20 61 64 64 65 64 20 6c 61 74 65 72 2c 20  ** added later, 
20270 62 79 20 74 68 65 20 69 6e 73 65 72 74 43 65 6c  by the insertCel
20280 6c 28 29 20 72 6f 75 74 69 6e 65 2e 0a 20 20 20  l() routine..   
20290 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
202a0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
202b0 26 26 20 70 67 6e 6f 50 74 72 6d 61 70 21 3d 30  && pgnoPtrmap!=0
202c0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
202d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
202e0 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
202f0 20 70 67 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d 41   pgnoOvfl, PTRMA
20300 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 70 67 6e  P_OVERFLOW2, pgn
20310 6f 50 74 72 6d 61 70 29 3b 0a 20 20 20 20 20 20  oPtrmap);.      
20320 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
20330 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
20340 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
20350 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20  Release);.      
20360 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
20370 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62     }.      put4b
20380 79 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f  yte(pPrior, pgno
20390 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c  Ovfl);.      rel
203a0 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
203b0 61 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52  ase);.      pToR
203c0 65 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a  elease = pOvfl;.
203d0 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70        pPrior = p
203e0 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Ovfl->aData;.   
203f0 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69     put4byte(pPri
20400 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  or, 0);.      pP
20410 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d  ayload = &pOvfl-
20420 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20  >aData[4];.     
20430 20 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74   spaceLeft = pBt
20440 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
20450 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20  ;.    }.    n = 
20460 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66  nPayload;.    if
20470 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20  ( n>spaceLeft ) 
20480 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 20  n = spaceLeft;. 
20490 20 20 20 69 66 28 20 6e 3e 6e 53 72 63 20 29 20     if( n>nSrc ) 
204a0 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 61 73  n = nSrc;.    as
204b0 73 65 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20  sert( pSrc );.  
204c0 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61    memcpy(pPayloa
204d0 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20  d, pSrc, n);.   
204e0 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a   nPayload -= n;.
204f0 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20      pPayload += 
20500 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e  n;.    pSrc += n
20510 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b  ;.    nSrc -= n;
20520 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d  .    spaceLeft -
20530 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 72  = n;.    if( nSr
20540 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53  c==0 ){.      nS
20550 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20  rc = nData;.    
20560 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a    pSrc = pData;.
20570 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65      }.  }.  rele
20580 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61  asePage(pToRelea
20590 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  se);.  return SQ
205a0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
205b0 2a 20 43 68 61 6e 67 65 20 74 68 65 20 4d 65 6d  * Change the Mem
205c0 50 61 67 65 2e 70 50 61 72 65 6e 74 20 70 6f 69  Page.pParent poi
205d0 6e 74 65 72 20 6f 6e 20 74 68 65 20 70 61 67 65  nter on the page
205e0 20 77 68 6f 73 65 20 6e 75 6d 62 65 72 20 69 73   whose number is
205f0 0a 2a 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65  .** given in the
20600 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
20610 20 73 6f 20 74 68 61 74 20 4d 65 6d 50 61 67 65   so that MemPage
20620 2e 70 50 61 72 65 6e 74 20 68 6f 6c 64 73 20 74  .pParent holds t
20630 68 65 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e  he.** pointer in
20640 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   the third argum
20650 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
20660 6e 74 20 72 65 70 61 72 65 6e 74 50 61 67 65 28  nt reparentPage(
20670 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
20680 67 6e 6f 20 70 67 6e 6f 2c 20 4d 65 6d 50 61 67  gno pgno, MemPag
20690 65 20 2a 70 4e 65 77 50 61 72 65 6e 74 2c 20 69  e *pNewParent, i
206a0 6e 74 20 69 64 78 29 7b 0a 20 20 4d 65 6d 50 61  nt idx){.  MemPa
206b0 67 65 20 2a 70 54 68 69 73 3b 0a 20 20 44 62 50  ge *pThis;.  DbP
206c0 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20  age *pDbPage;.. 
206d0 20 61 73 73 65 72 74 28 20 70 4e 65 77 50 61 72   assert( pNewPar
206e0 65 6e 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ent!=0 );.  if( 
206f0 70 67 6e 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e  pgno==0 ) return
20700 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
20710 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
20720 72 21 3d 30 20 29 3b 0a 20 20 70 44 62 50 61 67  r!=0 );.  pDbPag
20730 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  e = sqlite3Pager
20740 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67  Lookup(pBt->pPag
20750 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  er, pgno);.  if(
20760 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20   pDbPage ){.    
20770 70 54 68 69 73 20 3d 20 28 4d 65 6d 50 61 67 65  pThis = (MemPage
20780 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
20790 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29  etExtra(pDbPage)
207a0 3b 0a 20 20 20 20 69 66 28 20 70 54 68 69 73 2d  ;.    if( pThis-
207b0 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 20  >isInit ){.     
207c0 20 61 73 73 65 72 74 28 20 70 54 68 69 73 2d 3e   assert( pThis->
207d0 61 44 61 74 61 3d 3d 28 73 71 6c 69 74 65 33 50  aData==(sqlite3P
207e0 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
207f0 61 67 65 29 29 20 29 3b 0a 20 20 20 20 20 20 69  age)) );.      i
20800 66 28 20 70 54 68 69 73 2d 3e 70 50 61 72 65 6e  f( pThis->pParen
20810 74 21 3d 70 4e 65 77 50 61 72 65 6e 74 20 29 7b  t!=pNewParent ){
20820 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 68  .        if( pTh
20830 69 73 2d 3e 70 50 61 72 65 6e 74 20 29 20 73 71  is->pParent ) sq
20840 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
20850 70 54 68 69 73 2d 3e 70 50 61 72 65 6e 74 2d 3e  pThis->pParent->
20860 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
20870 20 20 70 54 68 69 73 2d 3e 70 50 61 72 65 6e 74    pThis->pParent
20880 20 3d 20 70 4e 65 77 50 61 72 65 6e 74 3b 0a 20   = pNewParent;. 
20890 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
208a0 67 65 72 52 65 66 28 70 4e 65 77 50 61 72 65 6e  gerRef(pNewParen
208b0 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  t->pDbPage);.   
208c0 20 20 20 7d 0a 20 20 20 20 20 20 70 54 68 69 73     }.      pThis
208d0 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d 20 69 64  ->idxParent = id
208e0 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  x;.    }.    sql
208f0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
20900 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 23 69  DbPage);.  }..#i
20910 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
20920 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69  T_AUTOVACUUM.  i
20930 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
20940 75 6d 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  um ){.    return
20950 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
20960 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  pgno, PTRMAP_BTR
20970 45 45 2c 20 70 4e 65 77 50 61 72 65 6e 74 2d 3e  EE, pNewParent->
20980 70 67 6e 6f 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  pgno);.  }.#endi
20990 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
209a0 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a  E_OK;.}..../*.**
209b0 20 43 68 61 6e 67 65 20 74 68 65 20 70 50 61 72   Change the pPar
209c0 65 6e 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 61  ent pointer of a
209d0 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70  ll children of p
209e0 50 61 67 65 20 74 6f 20 70 6f 69 6e 74 20 62 61  Page to point ba
209f0 63 6b 0a 2a 2a 20 74 6f 20 70 50 61 67 65 2e 0a  ck.** to pPage..
20a00 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77  **.** In other w
20a10 6f 72 64 73 2c 20 66 6f 72 20 65 76 65 72 79 20  ords, for every 
20a20 63 68 69 6c 64 20 6f 66 20 70 50 61 67 65 2c 20  child of pPage, 
20a30 69 6e 76 6f 6b 65 20 72 65 70 61 72 65 6e 74 50  invoke reparentP
20a40 61 67 65 28 29 0a 2a 2a 20 74 6f 20 6d 61 6b 65  age().** to make
20a50 20 73 75 72 65 20 74 68 61 74 20 65 61 63 68 20   sure that each 
20a60 63 68 69 6c 64 20 6b 6e 6f 77 73 20 74 68 61 74  child knows that
20a70 20 70 50 61 67 65 20 69 73 20 69 74 73 20 70 61   pPage is its pa
20a80 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rent..**.** This
20a90 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61   routine gets ca
20aa0 6c 6c 65 64 20 61 66 74 65 72 20 79 6f 75 20 6d  lled after you m
20ab0 65 6d 63 70 79 28 29 20 6f 6e 65 20 70 61 67 65  emcpy() one page
20ac0 20 69 6e 74 6f 0a 2a 2a 20 61 6e 6f 74 68 65 72   into.** another
20ad0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
20ae0 72 65 70 61 72 65 6e 74 43 68 69 6c 64 50 61 67  reparentChildPag
20af0 65 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  es(MemPage *pPag
20b00 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 42  e){.  int i;.  B
20b10 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
20b20 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74  Page->pBt;.  int
20b30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
20b40 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c  ..  if( pPage->l
20b50 65 61 66 20 29 20 72 65 74 75 72 6e 20 53 51 4c  eaf ) return SQL
20b60 49 54 45 5f 4f 4b 3b 0a 0a 20 20 66 6f 72 28 69  ITE_OK;..  for(i
20b70 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65  =0; i<pPage->nCe
20b80 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
20b90 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65   *pCell = findCe
20ba0 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20  ll(pPage, i);.  
20bb0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
20bc0 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  af ){.      rc =
20bd0 20 72 65 70 61 72 65 6e 74 50 61 67 65 28 70 42   reparentPage(pB
20be0 74 2c 20 67 65 74 34 62 79 74 65 28 70 43 65 6c  t, get4byte(pCel
20bf0 6c 29 2c 20 70 50 61 67 65 2c 20 69 29 3b 0a 20  l), pPage, i);. 
20c00 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
20c10 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
20c20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rc;.    }.  }.  
20c30 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
20c40 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 70   ){.    rc = rep
20c50 61 72 65 6e 74 50 61 67 65 28 70 42 74 2c 20 67  arentPage(pBt, g
20c60 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
20c70 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
20c80 4f 66 66 73 65 74 2b 38 5d 29 2c 20 0a 20 20 20  Offset+8]), .   
20c90 20 20 20 20 70 50 61 67 65 2c 20 69 29 3b 0a 20      pPage, i);. 
20ca0 20 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69     pPage->idxShi
20cb0 66 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ft = 0;.  }.  re
20cc0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
20cd0 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74  * Remove the i-t
20ce0 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67  h cell from pPag
20cf0 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
20d00 20 65 66 66 65 63 74 73 20 70 50 61 67 65 20 6f   effects pPage o
20d10 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c  nly..** The cell
20d20 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20   content is not 
20d30 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63  freed or dealloc
20d40 61 74 65 64 2e 20 20 49 74 20 69 73 20 61 73 73  ated.  It is ass
20d50 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65  umed that.** the
20d60 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61   cell content ha
20d70 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f  s been copied so
20d80 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54  meplace else.  T
20d90 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74  his routine just
20da0 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20  .** removes the 
20db0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
20dc0 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65   cell from pPage
20dd0 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73  ..**.** "sz" mus
20de0 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20  t be the number 
20df0 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
20e00 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cell..*/.static 
20e10 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65  void dropCell(Me
20e20 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
20e30 74 20 69 64 78 2c 20 69 6e 74 20 73 7a 29 7b 0a  t idx, int sz){.
20e40 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
20e50 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
20e60 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20  r */.  int pc;  
20e70 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
20e80 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   to cell content
20e90 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64   of cell being d
20ea0 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a  eleted */.  u8 *
20eb0 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70  data;       /* p
20ec0 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20  Page->aData */. 
20ed0 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20   u8 *ptr;       
20ee0 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65   /* Used to move
20ef0 20 62 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69   bytes around wi
20f00 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a  thin data[] */..
20f10 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30    assert( idx>=0
20f20 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e   && idx<pPage->n
20f30 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
20f40 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70  ( sz==cellSize(p
20f50 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a 20 20  Page, idx) );.  
20f60 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
20f70 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
20f80 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
20f90 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67  );.  data = pPag
20fa0 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20  e->aData;.  ptr 
20fb0 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63  = &data[pPage->c
20fc0 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 64  ellOffset + 2*id
20fd0 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62  x];.  pc = get2b
20fe0 79 74 65 28 70 74 72 29 3b 0a 20 20 61 73 73 65  yte(ptr);.  asse
20ff0 72 74 28 20 70 63 3e 31 30 20 26 26 20 70 63 2b  rt( pc>10 && pc+
21000 73 7a 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e  sz<=pPage->pBt->
21010 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
21020 66 72 65 65 53 70 61 63 65 28 70 50 61 67 65 2c  freeSpace(pPage,
21030 20 70 63 2c 20 73 7a 29 3b 0a 20 20 66 6f 72 28   pc, sz);.  for(
21040 69 3d 69 64 78 2b 31 3b 20 69 3c 70 50 61 67 65  i=idx+1; i<pPage
21050 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 2c 20 70 74  ->nCell; i++, pt
21060 72 2b 3d 32 29 7b 0a 20 20 20 20 70 74 72 5b 30  r+=2){.    ptr[0
21070 5d 20 3d 20 70 74 72 5b 32 5d 3b 0a 20 20 20 20  ] = ptr[2];.    
21080 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 33 5d 3b  ptr[1] = ptr[3];
21090 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43  .  }.  pPage->nC
210a0 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74 32 62 79 74  ell--;.  put2byt
210b0 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 68  e(&data[pPage->h
210c0 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20 70 50 61  drOffset+3], pPa
210d0 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 50  ge->nCell);.  pP
210e0 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b  age->nFree += 2;
210f0 0a 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69  .  pPage->idxShi
21100 66 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ft = 1;.}../*.**
21110 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65   Insert a new ce
21120 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20 63  ll on pPage at c
21130 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20 20  ell index "i".  
21140 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20  pCell points to 
21150 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f  the.** content o
21160 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a  f the cell..**.*
21170 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  * If the cell co
21180 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f  ntent will fit o
21190 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e  n the page, then
211a0 20 70 75 74 20 69 74 20 74 68 65 72 65 2e 20 20   put it there.  
211b0 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  If it.** will no
211c0 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65  t fit, then make
211d0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63   a copy of the c
211e0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f  ell content into
211f0 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65   pTemp if.** pTe
21200 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20  mp is not null. 
21210 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 70   Regardless of p
21220 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61  Temp, allocate a
21230 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e   new entry.** in
21240 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 5d 20   pPage->aOvfl[] 
21250 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e  and make it poin
21260 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  t to the cell co
21270 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a  ntent (either.**
21280 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74 68 65   in pTemp or the
21290 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29   original pCell)
212a0 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72 64   and also record
212b0 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20   its index. .** 
212c0 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77  Allocating a new
212d0 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65 2d   entry in pPage-
212e0 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73  >aCell[] implies
212f0 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d   that .** pPage-
21300 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 69 6e  >nOverflow is in
21310 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a  cremented..**.**
21320 20 49 66 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e   If nSkip is non
21330 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 64 6f 20 6e  -zero, then do n
21340 6f 74 20 63 6f 70 79 20 74 68 65 20 66 69 72 73  ot copy the firs
21350 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f 66  t nSkip bytes of
21360 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68   the.** cell. Th
21370 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 76  e caller will ov
21380 65 72 77 72 69 74 65 20 74 68 65 6d 20 61 66 74  erwrite them aft
21390 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
213a0 20 72 65 74 75 72 6e 73 2e 20 49 66 0a 2a 2a 20   returns. If.** 
213b0 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  nSkip is non-zer
213c0 6f 2c 20 74 68 65 6e 20 70 43 65 6c 6c 20 6d 61  o, then pCell ma
213d0 79 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61  y not point to a
213e0 6e 20 69 6e 76 61 6c 69 64 20 6d 65 6d 6f 72 79  n invalid memory
213f0 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20 28 62   location .** (b
21400 75 74 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 20 69  ut pCell+nSkip i
21410 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 29 2e  s always valid).
21420 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
21430 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d  nsertCell(.  Mem
21440 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f  Page *pPage,   /
21450 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68 69 63  * Page into whic
21460 68 20 77 65 20 61 72 65 20 63 6f 70 79 69 6e 67  h we are copying
21470 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20   */.  int i,    
21480 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63          /* New c
21490 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20  ell becomes the 
214a0 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74 68 65  i-th cell of the
214b0 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70   page */.  u8 *p
214c0 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20  Cell,        /* 
214d0 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e  Content of the n
214e0 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74  ew cell */.  int
214f0 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20 20 2f   sz,           /
21500 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 65  * Bytes of conte
21510 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20  nt in pCell */. 
21520 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20 20 20   u8 *pTemp,     
21530 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61     /* Temp stora
21540 67 65 20 73 70 61 63 65 20 66 6f 72 20 70 43 65  ge space for pCe
21550 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f  ll, if needed */
21560 0a 20 20 75 38 20 6e 53 6b 69 70 20 20 20 20 20  .  u8 nSkip     
21570 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 77       /* Do not w
21580 72 69 74 65 20 74 68 65 20 66 69 72 73 74 20 6e  rite the first n
21590 53 6b 69 70 20 62 79 74 65 73 20 6f 66 20 74 68  Skip bytes of th
215a0 65 20 63 65 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69  e cell */.){.  i
215b0 6e 74 20 69 64 78 3b 20 20 20 20 20 20 20 20 20  nt idx;         
215c0 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69   /* Where to wri
215d0 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74  te new cell cont
215e0 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  ent in data[] */
215f0 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20  .  int j;       
21600 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
21610 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74 6f  nter */.  int to
21620 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  p;          /* F
21630 69 72 73 74 20 62 79 74 65 20 6f 66 20 63 6f 6e  irst byte of con
21640 74 65 6e 74 20 66 6f 72 20 61 6e 79 20 63 65 6c  tent for any cel
21650 6c 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  l in data[] */. 
21660 20 69 6e 74 20 65 6e 64 3b 20 20 20 20 20 20 20   int end;       
21670 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
21680 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 63   past the last c
21690 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64  ell pointer in d
216a0 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69  ata[] */.  int i
216b0 6e 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ns;          /* 
216c0 49 6e 64 65 78 20 69 6e 20 64 61 74 61 5b 5d 20  Index in data[] 
216d0 77 68 65 72 65 20 6e 65 77 20 63 65 6c 6c 20 70  where new cell p
216e0 6f 69 6e 74 65 72 20 69 73 20 69 6e 73 65 72 74  ointer is insert
216f0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b  ed */.  int hdr;
21700 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
21710 73 65 74 20 69 6e 74 6f 20 64 61 74 61 5b 5d 20  set into data[] 
21720 6f 66 20 74 68 65 20 70 61 67 65 20 68 65 61 64  of the page head
21730 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  er */.  int cell
21740 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20 41 64 64  Offset;   /* Add
21750 72 65 73 73 20 6f 66 20 66 69 72 73 74 20 63 65  ress of first ce
21760 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61  ll pointer in da
21770 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 64 61  ta[] */.  u8 *da
21780 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ta;         /* T
21790 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
217a0 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a  e whole page */.
217b0 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20    u8 *ptr;      
217c0 20 20 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20      /* Used for 
217d0 6d 6f 76 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  moving informati
217e0 6f 6e 20 61 72 6f 75 6e 64 20 69 6e 20 64 61 74  on around in dat
217f0 61 5b 5d 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  a[] */..  assert
21800 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61  ( i>=0 && i<=pPa
21810 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d  ge->nCell+pPage-
21820 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20  >nOverflow );.  
21830 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c  assert( sz==cell
21840 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70  SizePtr(pPage, p
21850 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65 72  Cell) );.  asser
21860 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
21870 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
21880 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
21890 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  if( pPage->nOver
218a0 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61  flow || sz+2>pPa
218b0 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  ge->nFree ){.   
218c0 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20   if( pTemp ){.  
218d0 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70      memcpy(pTemp
218e0 2b 6e 53 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e 53  +nSkip, pCell+nS
218f0 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a  kip, sz-nSkip);.
21900 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54        pCell = pT
21910 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a  emp;.    }.    j
21920 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66   = pPage->nOverf
21930 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72  low++;.    asser
21940 74 28 20 6a 3c 73 69 7a 65 6f 66 28 70 50 61 67  t( j<sizeof(pPag
21950 65 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a 65 6f 66  e->aOvfl)/sizeof
21960 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d  (pPage->aOvfl[0]
21970 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) );.    pPage->
21980 61 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d  aOvfl[j].pCell =
21990 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67   pCell;.    pPag
219a0 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20  e->aOvfl[j].idx 
219b0 3d 20 69 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = i;.    pPage->
219c0 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  nFree = 0;.  }el
219d0 73 65 7b 0a 20 20 20 20 64 61 74 61 20 3d 20 70  se{.    data = p
219e0 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Page->aData;.   
219f0 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
21a00 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 74 6f 70  rOffset;.    top
21a10 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
21a20 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 63  a[hdr+5]);.    c
21a30 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67  ellOffset = pPag
21a40 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20  e->cellOffset;. 
21a50 20 20 20 65 6e 64 20 3d 20 63 65 6c 6c 4f 66 66     end = cellOff
21a60 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e  set + 2*pPage->n
21a70 43 65 6c 6c 20 2b 20 32 3b 0a 20 20 20 20 69 6e  Cell + 2;.    in
21a80 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  s = cellOffset +
21a90 20 32 2a 69 3b 0a 20 20 20 20 69 66 28 20 65 6e   2*i;.    if( en
21aa0 64 20 3e 20 74 6f 70 20 2d 20 73 7a 20 29 7b 0a  d > top - sz ){.
21ab0 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 64        int rc = d
21ac0 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50  efragmentPage(pP
21ad0 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
21ae0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
21af0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
21b00 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28   top = get2byte(
21b10 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
21b20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 6e 64       assert( end
21b30 20 2b 20 73 7a 20 3c 3d 20 74 6f 70 20 29 3b 0a   + sz <= top );.
21b40 20 20 20 20 7d 0a 20 20 20 20 69 64 78 20 3d 20      }.    idx = 
21b50 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50  allocateSpace(pP
21b60 61 67 65 2c 20 73 7a 29 3b 0a 20 20 20 20 61 73  age, sz);.    as
21b70 73 65 72 74 28 20 69 64 78 3e 30 20 29 3b 0a 20  sert( idx>0 );. 
21b80 20 20 20 61 73 73 65 72 74 28 20 65 6e 64 20 3c     assert( end <
21b90 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
21ba0 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 20 20  [hdr+5]) );.    
21bb0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a  pPage->nCell++;.
21bc0 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65      pPage->nFree
21bd0 20 2d 3d 20 32 3b 0a 20 20 20 20 6d 65 6d 63 70   -= 2;.    memcp
21be0 79 28 26 64 61 74 61 5b 69 64 78 2b 6e 53 6b 69  y(&data[idx+nSki
21bf0 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c  p], pCell+nSkip,
21c00 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20   sz-nSkip);.    
21c10 66 6f 72 28 6a 3d 65 6e 64 2d 32 2c 20 70 74 72  for(j=end-2, ptr
21c20 3d 26 64 61 74 61 5b 6a 5d 3b 20 6a 3e 69 6e 73  =&data[j]; j>ins
21c30 3b 20 6a 2d 3d 32 2c 20 70 74 72 2d 3d 32 29 7b  ; j-=2, ptr-=2){
21c40 0a 20 20 20 20 20 20 70 74 72 5b 30 5d 20 3d 20  .      ptr[0] = 
21c50 70 74 72 5b 2d 32 5d 3b 0a 20 20 20 20 20 20 70  ptr[-2];.      p
21c60 74 72 5b 31 5d 20 3d 20 70 74 72 5b 2d 31 5d 3b  tr[1] = ptr[-1];
21c70 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 32 62  .    }.    put2b
21c80 79 74 65 28 26 64 61 74 61 5b 69 6e 73 5d 2c 20  yte(&data[ins], 
21c90 69 64 78 29 3b 0a 20 20 20 20 70 75 74 32 62 79  idx);.    put2by
21ca0 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c  te(&data[hdr+3],
21cb0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a   pPage->nCell);.
21cc0 20 20 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68      pPage->idxSh
21cd0 69 66 74 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  ift = 1;.#ifndef
21ce0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
21cf0 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
21d00 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f  pPage->pBt->auto
21d10 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
21d20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61 79 20  /* The cell may 
21d30 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74 65  contain a pointe
21d40 72 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  r to an overflow
21d50 20 70 61 67 65 2e 20 49 66 20 73 6f 2c 20 77 72   page. If so, wr
21d60 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ite.      ** the
21d70 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f   entry for the o
21d80 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 74  verflow page int
21d90 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  o the pointer ma
21da0 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  p..      */.    
21db0 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
21dc0 0a 20 20 20 20 20 20 70 61 72 73 65 43 65 6c 6c  .      parseCell
21dd0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
21de0 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , &info);.      
21df0 61 73 73 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44  assert( (info.nD
21e00 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b  ata+(pPage->intK
21e10 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29  ey?0:info.nKey))
21e20 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20  ==info.nPayload 
21e30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 6e  );.      if( (in
21e40 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d  fo.nData+(pPage-
21e50 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e  >intKey?0:info.n
21e60 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  Key))>info.nLoca
21e70 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e  l ){.        Pgn
21e80 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 67 65 74  o pgnoOvfl = get
21e90 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
21ea0 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20  o.iOverflow]);. 
21eb0 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20         int rc = 
21ec0 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d  ptrmapPut(pPage-
21ed0 3e 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  >pBt, pgnoOvfl, 
21ee0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
21ef0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
21f00 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
21f10 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
21f20 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
21f30 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
21f40 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
21f50 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  _OK;.}../*.** Ad
21f60 64 20 61 20 6c 69 73 74 20 6f 66 20 63 65 6c 6c  d a list of cell
21f70 73 20 74 6f 20 61 20 70 61 67 65 2e 20 20 54 68  s to a page.  Th
21f80 65 20 70 61 67 65 20 73 68 6f 75 6c 64 20 62 65  e page should be
21f90 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79   initially empty
21fa0 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20 61  ..** The cells a
21fb0 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  re guaranteed to
21fc0 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65   fit on the page
21fd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
21fe0 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 0a 20   assemblePage(. 
21ff0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
22000 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
22010 6f 20 62 65 20 61 73 73 65 6d 62 6c 69 65 64 20  o be assemblied 
22020 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20  */.  int nCell, 
22030 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75         /* The nu
22040 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f  mber of cells to
22050 20 61 64 64 20 74 6f 20 74 68 69 73 20 70 61 67   add to this pag
22060 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
22070 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ll,      /* Poin
22080 74 65 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f 64  ters to cell bod
22090 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 53  ies */.  int *aS
220a0 69 7a 65 20 20 20 20 20 20 20 20 2f 2a 20 53 69  ize        /* Si
220b0 7a 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 73  zes of the cells
220c0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20   */.){.  int i; 
220d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
220e0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
220f0 69 6e 74 20 74 6f 74 61 6c 53 69 7a 65 3b 20 20  int totalSize;  
22100 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
22110 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a  of all cells */.
22120 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20    int hdr;      
22130 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
22140 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
22150 20 69 6e 74 20 63 65 6c 6c 70 74 72 3b 20 20 20   int cellptr;   
22160 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
22170 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74   next cell point
22180 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  er */.  int cell
22190 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20 41 64 64  body;     /* Add
221a0 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c  ress of next cel
221b0 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a  l body */.  u8 *
221c0 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a  data;         /*
221d0 20 44 61 74 61 20 66 6f 72 20 74 68 65 20 70 61   Data for the pa
221e0 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ge */..  assert(
221f0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
22200 77 3d 3d 30 20 29 3b 0a 20 20 74 6f 74 61 6c 53  w==0 );.  totalS
22210 69 7a 65 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  ize = 0;.  for(i
22220 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
22230 29 7b 0a 20 20 20 20 74 6f 74 61 6c 53 69 7a 65  ){.    totalSize
22240 20 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20   += aSize[i];.  
22250 7d 0a 20 20 61 73 73 65 72 74 28 20 74 6f 74 61  }.  assert( tota
22260 6c 53 69 7a 65 2b 32 2a 6e 43 65 6c 6c 3c 3d 70  lSize+2*nCell<=p
22270 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 3b 0a 20  Page->nFree );. 
22280 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
22290 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 63 65  nCell==0 );.  ce
222a0 6c 6c 70 74 72 20 3d 20 70 50 61 67 65 2d 3e 63  llptr = pPage->c
222b0 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 64 61 74  ellOffset;.  dat
222c0 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
222d0 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
222e0 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 70 75  >hdrOffset;.  pu
222f0 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
22300 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20 69  +3], nCell);.  i
22310 66 28 20 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  f( nCell ){.    
22320 63 65 6c 6c 62 6f 64 79 20 3d 20 61 6c 6c 6f 63  cellbody = alloc
22330 61 74 65 53 70 61 63 65 28 70 50 61 67 65 2c 20  ateSpace(pPage, 
22340 74 6f 74 61 6c 53 69 7a 65 29 3b 0a 20 20 20 20  totalSize);.    
22350 61 73 73 65 72 74 28 20 63 65 6c 6c 62 6f 64 79  assert( cellbody
22360 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >0 );.    assert
22370 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3e  ( pPage->nFree >
22380 3d 20 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  = 2*nCell );.   
22390 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d   pPage->nFree -=
223a0 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 20 20 66 6f   2*nCell;.    fo
223b0 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
223c0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 75 74 32  i++){.      put2
223d0 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 70  byte(&data[cellp
223e0 74 72 5d 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a  tr], cellbody);.
223f0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61        memcpy(&da
22400 74 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c 20 61 70  ta[cellbody], ap
22410 43 65 6c 6c 5b 69 5d 2c 20 61 53 69 7a 65 5b 69  Cell[i], aSize[i
22420 5d 29 3b 0a 20 20 20 20 20 20 63 65 6c 6c 70 74  ]);.      cellpt
22430 72 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 63 65  r += 2;.      ce
22440 6c 6c 62 6f 64 79 20 2b 3d 20 61 53 69 7a 65 5b  llbody += aSize[
22450 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  i];.    }.    as
22460 73 65 72 74 28 20 63 65 6c 6c 62 6f 64 79 3d 3d  sert( cellbody==
22470 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
22480 6c 65 53 69 7a 65 20 29 3b 0a 20 20 7d 0a 20 20  leSize );.  }.  
22490 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 6e  pPage->nCell = n
224a0 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Cell;.}../*.** T
224b0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72  he following par
224c0 61 6d 65 74 65 72 73 20 64 65 74 65 72 6d 69 6e  ameters determin
224d0 65 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63  e how many adjac
224e0 65 6e 74 20 70 61 67 65 73 20 67 65 74 20 69 6e  ent pages get in
224f0 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62  volved.** in a b
22500 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69  alancing operati
22510 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65 20 6e  on.  NN is the n
22520 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f  umber of neighbo
22530 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64  rs on either sid
22540 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65  e.** of the page
22550 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74   that participat
22560 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69  e in the balanci
22570 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e  ng operation.  N
22580 42 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61  B is the.** tota
22590 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
225a0 73 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61  s that participa
225b0 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  te, including th
225c0 65 20 74 61 72 67 65 74 20 70 61 67 65 20 61 6e  e target page an
225d0 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72  d.** NN neighbor
225e0 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
225f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69  ..**.** The mini
22600 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20  mum value of NN 
22610 69 73 20 31 20 28 6f 66 20 63 6f 75 72 73 65 29  is 1 (of course)
22620 2e 20 20 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e  .  Increasing NN
22630 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20   above 1.** (to 
22640 32 20 6f 72 20 33 29 20 67 69 76 65 73 20 61 20  2 or 3) gives a 
22650 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76 65 6d 65  modest improveme
22660 6e 74 20 69 6e 20 53 45 4c 45 43 54 20 61 6e 64  nt in SELECT and
22670 20 44 45 4c 45 54 45 20 70 65 72 66 6f 72 6d 61   DELETE performa
22680 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e  nce.** in exchan
22690 67 65 20 66 6f 72 20 61 20 6c 61 72 67 65 72 20  ge for a larger 
226a0 64 65 67 72 61 64 61 74 69 6f 6e 20 69 6e 20 49  degradation in I
226b0 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45  NSERT and UPDATE
226c0 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a   performance..**
226d0 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e   The value of NN
226e0 20 61 70 70 65 61 72 73 20 74 6f 20 67 69 76 65   appears to give
226f0 20 74 68 65 20 62 65 73 74 20 72 65 73 75 6c 74   the best result
22700 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64  s overall..*/.#d
22710 65 66 69 6e 65 20 4e 4e 20 31 20 20 20 20 20 20  efine NN 1      
22720 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
22730 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e   of neighbors on
22740 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20   either side of 
22750 70 50 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65  pPage */.#define
22760 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20   NB (NN*2+1)    
22770 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67 65 73    /* Total pages
22780 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65   involved in the
22790 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 2f 2a 20   balance */../* 
227a0 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
227b0 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
227c0 62 61 6c 61 6e 63 65 28 4d 65 6d 50 61 67 65 2a  balance(MemPage*
227d0 2c 20 69 6e 74 29 3b 0a 0a 23 69 66 6e 64 65 66  , int);..#ifndef
227e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49   SQLITE_OMIT_QUI
227f0 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20  CKBALANCE./*.** 
22800 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20  This version of 
22810 62 61 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c 65  balance() handle
22820 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65  s the common spe
22830 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 0a  cial case where.
22840 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69  ** a new entry i
22850 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64  s being inserted
22860 20 6f 6e 20 74 68 65 20 65 78 74 72 65 6d 65 20   on the extreme 
22870 72 69 67 68 74 2d 65 6e 64 20 6f 66 20 74 68 65  right-end of the
22880 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74 68  .** tree, in oth
22890 65 72 20 77 6f 72 64 73 2c 20 77 68 65 6e 20 74  er words, when t
228a0 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77 69 6c  he new entry wil
228b0 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6c 61 72  l become the lar
228c0 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e  gest.** entry in
228d0 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a   the tree..**.**
228e0 20 49 6e 73 74 65 61 64 20 6f 66 20 74 72 79 69   Instead of tryi
228f0 6e 67 20 62 61 6c 61 6e 63 65 20 74 68 65 20 33  ng balance the 3
22900 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66   right-most leaf
22910 20 70 61 67 65 73 2c 20 6a 75 73 74 20 61 64 64   pages, just add
22920 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67 65 20 74  .** a new page t
22930 6f 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  o the right-hand
22940 20 73 69 64 65 20 61 6e 64 20 70 75 74 20 74 68   side and put th
22950 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79 20  e one new entry 
22960 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 2e  in.** that page.
22970 20 20 54 68 69 73 20 6c 65 61 76 65 73 20 74 68    This leaves th
22980 65 20 72 69 67 68 74 20 73 69 64 65 20 6f 66 20  e right side of 
22990 74 68 65 20 74 72 65 65 20 73 6f 6d 65 77 68 61  the tree somewha
229a0 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e  t.** unbalanced.
229b0 20 20 42 75 74 20 6f 64 64 73 20 61 72 65 20 74    But odds are t
229c0 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 69  hat we will be i
229d0 6e 73 65 72 74 69 6e 67 20 6e 65 77 20 65 6e 74  nserting new ent
229e0 72 69 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65  ries.** at the e
229f0 6e 64 20 73 6f 6f 6e 20 61 66 74 65 72 77 61 72  nd soon afterwar
22a00 64 73 20 73 6f 20 74 68 65 20 6e 65 61 72 6c 79  ds so the nearly
22a10 20 65 6d 70 74 79 20 70 61 67 65 20 77 69 6c 6c   empty page will
22a20 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c   quickly.** fill
22a30 20 75 70 2e 20 20 4f 6e 20 61 76 65 72 61 67 65   up.  On average
22a40 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73  ..**.** pPage is
22a50 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 77   the leaf page w
22a60 68 69 63 68 20 69 73 20 74 68 65 20 72 69 67 68  hich is the righ
22a70 74 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e 20 74  t-most page in t
22a80 68 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72  he tree..** pPar
22a90 65 6e 74 20 69 73 20 69 74 73 20 70 61 72 65 6e  ent is its paren
22aa0 74 2e 20 20 70 50 61 67 65 20 6d 75 73 74 20 68  t.  pPage must h
22ab0 61 76 65 20 61 20 73 69 6e 67 6c 65 20 6f 76 65  ave a single ove
22ac0 72 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77  rflow entry.** w
22ad0 68 69 63 68 20 69 73 20 61 6c 73 6f 20 74 68 65  hich is also the
22ae0 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
22af0 79 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a  y on the page..*
22b00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
22b10 61 6e 63 65 5f 71 75 69 63 6b 28 4d 65 6d 50 61  ance_quick(MemPa
22b20 67 65 20 2a 70 50 61 67 65 2c 20 4d 65 6d 50 61  ge *pPage, MemPa
22b30 67 65 20 2a 70 50 61 72 65 6e 74 29 7b 0a 20 20  ge *pParent){.  
22b40 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67  int rc;.  MemPag
22b50 65 20 2a 70 4e 65 77 3b 0a 20 20 50 67 6e 6f 20  e *pNew;.  Pgno 
22b60 70 67 6e 6f 4e 65 77 3b 0a 20 20 75 38 20 2a 70  pgnoNew;.  u8 *p
22b70 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 73 7a 43 65  Cell;.  int szCe
22b80 6c 6c 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  ll;.  CellInfo i
22b90 6e 66 6f 3b 0a 20 20 42 74 53 68 61 72 65 64 20  nfo;.  BtShared 
22ba0 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
22bb0 74 3b 0a 20 20 69 6e 74 20 70 61 72 65 6e 74 49  t;.  int parentI
22bc0 64 78 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 43  dx = pParent->nC
22bd0 65 6c 6c 3b 20 20 20 2f 2a 20 70 50 61 72 65 6e  ell;   /* pParen
22be0 74 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65  t new divider ce
22bf0 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  ll index */.  in
22c00 74 20 70 61 72 65 6e 74 53 69 7a 65 3b 20 20 20  t parentSize;   
22c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 65 77 20 64  /* Size of new d
22c30 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20  ivider cell */. 
22c40 20 75 38 20 70 61 72 65 6e 74 43 65 6c 6c 5b 36   u8 parentCell[6
22c50 34 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  4];             
22c60 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20     /* Space for 
22c70 74 68 65 20 6e 65 77 20 64 69 76 69 64 65 72 20  the new divider 
22c80 63 65 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c  cell */..  /* Al
22c90 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
22ca0 65 2e 20 49 6e 73 65 72 74 20 74 68 65 20 6f 76  e. Insert the ov
22cb0 65 72 66 6c 6f 77 20 63 65 6c 6c 20 66 72 6f 6d  erflow cell from
22cc0 20 70 50 61 67 65 0a 20 20 2a 2a 20 69 6e 74 6f   pPage.  ** into
22cd0 20 69 74 2e 20 54 68 65 6e 20 72 65 6d 6f 76 65   it. Then remove
22ce0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65   the overflow ce
22cf0 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 20  ll from pPage.. 
22d00 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63   */.  rc = alloc
22d10 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
22d20 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65  , &pNew, &pgnoNe
22d30 77 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  w, 0, 0);.  if( 
22d40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
22d50 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
22d60 20 20 7d 0a 20 20 70 43 65 6c 6c 20 3d 20 70 50    }.  pCell = pP
22d70 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43  age->aOvfl[0].pC
22d80 65 6c 6c 3b 0a 20 20 73 7a 43 65 6c 6c 20 3d 20  ell;.  szCell = 
22d90 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
22da0 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 7a 65 72  e, pCell);.  zer
22db0 6f 50 61 67 65 28 70 4e 65 77 2c 20 70 50 61 67  oPage(pNew, pPag
22dc0 65 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20  e->aData[0]);.  
22dd0 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65  assemblePage(pNe
22de0 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73  w, 1, &pCell, &s
22df0 7a 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d  zCell);.  pPage-
22e00 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
22e10 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 70 61  .  /* Set the pa
22e20 72 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 6c  rent of the newl
22e30 79 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  y allocated page
22e40 20 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0a   to pParent. */.
22e50 20 20 70 4e 65 77 2d 3e 70 50 61 72 65 6e 74 20    pNew->pParent 
22e60 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20 73 71 6c  = pParent;.  sql
22e70 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61  ite3PagerRef(pPa
22e80 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a  rent->pDbPage);.
22e90 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 63  .  /* pPage is c
22ea0 75 72 72 65 6e 74 6c 79 20 74 68 65 20 72 69 67  urrently the rig
22eb0 68 74 2d 63 68 69 6c 64 20 6f 66 20 70 50 61 72  ht-child of pPar
22ec0 65 6e 74 2e 20 43 68 61 6e 67 65 20 74 68 69 73  ent. Change this
22ed0 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 74 68  .  ** so that th
22ee0 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 69 73  e right-child is
22ef0 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 61 6c   the new page al
22f00 6c 6f 63 61 74 65 64 20 61 62 6f 76 65 20 61 6e  located above an
22f10 64 0a 20 20 2a 2a 20 70 50 61 67 65 20 69 73 20  d.  ** pPage is 
22f20 74 68 65 20 6e 65 78 74 2d 74 6f 2d 72 69 67 68  the next-to-righ
22f30 74 20 63 68 69 6c 64 2e 20 0a 20 20 2a 2f 0a 20  t child. .  */. 
22f40 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
22f50 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 70 61 72  nCell>0 );.  par
22f60 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
22f70 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
22f80 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29   pPage->nCell-1)
22f90 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 72 63 20 3d  , &info);.  rc =
22fa0 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 72   fillInCell(pPar
22fb0 65 6e 74 2c 20 70 61 72 65 6e 74 43 65 6c 6c 2c  ent, parentCell,
22fc0 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30   0, info.nKey, 0
22fd0 2c 20 30 2c 20 26 70 61 72 65 6e 74 53 69 7a 65  , 0, &parentSize
22fe0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
22ff0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
23000 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
23010 73 73 65 72 74 28 20 70 61 72 65 6e 74 53 69 7a  ssert( parentSiz
23020 65 3c 36 34 20 29 3b 0a 20 20 72 63 20 3d 20 69  e<64 );.  rc = i
23030 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e  nsertCell(pParen
23040 74 2c 20 70 61 72 65 6e 74 49 64 78 2c 20 70 61  t, parentIdx, pa
23050 72 65 6e 74 43 65 6c 6c 2c 20 70 61 72 65 6e 74  rentCell, parent
23060 53 69 7a 65 2c 20 30 2c 20 34 29 3b 0a 20 20 69  Size, 0, 4);.  i
23070 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
23080 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
23090 63 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62 79 74  c;.  }.  put4byt
230a0 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65  e(findOverflowCe
230b0 6c 6c 28 70 50 61 72 65 6e 74 2c 70 61 72 65 6e  ll(pParent,paren
230c0 74 49 64 78 29 2c 20 70 50 61 67 65 2d 3e 70 67  tIdx), pPage->pg
230d0 6e 6f 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  no);.  put4byte(
230e0 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
230f0 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
23100 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b  et+8], pgnoNew);
23110 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
23120 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
23130 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
23140 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
23150 64 61 74 61 62 61 73 65 2c 20 75 70 64 61 74 65  database, update
23160 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
23170 0a 20 20 2a 2a 20 77 69 74 68 20 65 6e 74 72 69  .  ** with entri
23180 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20 70  es for the new p
23190 61 67 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69  age, and any poi
231a0 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 20 0a 20  nter from the . 
231b0 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20   ** cell on the 
231c0 70 61 67 65 20 74 6f 20 61 6e 20 6f 76 65 72 66  page to an overf
231d0 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20  low page..  */. 
231e0 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
231f0 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  cuum ){.    rc =
23200 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
23210 70 67 6e 6f 4e 65 77 2c 20 50 54 52 4d 41 50 5f  pgnoNew, PTRMAP_
23220 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e  BTREE, pParent->
23230 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72  pgno);.    if( r
23240 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
23250 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
23260 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
23270 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 4e  ptrmapPutOvfl(pN
23280 65 77 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ew, 0);.    if( 
23290 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
232a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
232b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
232c0 69 66 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65  if..  /* Release
232d0 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74   the reference t
232e0 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 61  o the new page a
232f0 6e 64 20 62 61 6c 61 6e 63 65 20 74 68 65 20 70  nd balance the p
23300 61 72 65 6e 74 20 70 61 67 65 2c 0a 20 20 2a 2a  arent page,.  **
23310 20 69 6e 20 63 61 73 65 20 74 68 65 20 64 69 76   in case the div
23320 69 64 65 72 20 63 65 6c 6c 20 69 6e 73 65 72 74  ider cell insert
23330 65 64 20 63 61 75 73 65 64 20 69 74 20 74 6f 20  ed caused it to 
23340 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 2e  become overfull.
23350 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65 50  .  */.  releaseP
23360 61 67 65 28 70 4e 65 77 29 3b 0a 20 20 72 65 74  age(pNew);.  ret
23370 75 72 6e 20 62 61 6c 61 6e 63 65 28 70 50 61 72  urn balance(pPar
23380 65 6e 74 2c 20 30 29 3b 0a 7d 0a 23 65 6e 64 69  ent, 0);.}.#endi
23390 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
233a0 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 20 2a 2f  _QUICKBALANCE */
233b0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 49 53 41 55  ../*.** The ISAU
233c0 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 20 69  TOVACUUM macro i
233d0 73 20 75 73 65 64 20 77 69 74 68 69 6e 20 62 61  s used within ba
233e0 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20  lance_nonroot() 
233f0 74 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20  to determine.** 
23400 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
23410 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61  supports auto-va
23420 63 75 75 6d 20 6f 72 20 6e 6f 74 2e 20 42 65 63  cuum or not. Bec
23430 61 75 73 65 20 69 74 20 69 73 20 75 73 65 64 0a  ause it is used.
23440 2a 2a 20 77 69 74 68 69 6e 20 61 6e 20 65 78 70  ** within an exp
23450 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20  ression that is 
23460 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 61  an argument to a
23470 6e 6f 74 68 65 72 20 6d 61 63 72 6f 20 0a 2a 2a  nother macro .**
23480 20 28 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61   (sqliteMallocRa
23490 77 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  w), it is not po
234a0 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 63 6f  ssible to use co
234b0 6e 64 69 74 69 6f 6e 61 6c 20 63 6f 6d 70 69 6c  nditional compil
234c0 61 74 69 6f 6e 2e 0a 2a 2a 20 53 6f 2c 20 74 68  ation..** So, th
234d0 69 73 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69  is macro is defi
234e0 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a  ned instead..*/.
234f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
23500 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 23  MIT_AUTOVACUUM.#
23510 64 65 66 69 6e 65 20 49 53 41 55 54 4f 56 41 43  define ISAUTOVAC
23520 55 55 4d 20 28 70 42 74 2d 3e 61 75 74 6f 56 61  UUM (pBt->autoVa
23530 63 75 75 6d 29 0a 23 65 6c 73 65 0a 23 64 65 66  cuum).#else.#def
23540 69 6e 65 20 49 53 41 55 54 4f 56 41 43 55 55 4d  ine ISAUTOVACUUM
23550 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
23560 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
23570 64 69 73 74 72 69 62 75 74 65 73 20 43 65 6c 6c  distributes Cell
23580 73 20 6f 6e 20 70 50 61 67 65 20 61 6e 64 20 75  s on pPage and u
23590 70 20 74 6f 20 4e 4e 2a 32 20 73 69 62 6c 69 6e  p to NN*2 siblin
235a0 67 73 0a 2a 2a 20 6f 66 20 70 50 61 67 65 20 73  gs.** of pPage s
235b0 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73  o that all pages
235c0 20 68 61 76 65 20 61 62 6f 75 74 20 74 68 65 20   have about the 
235d0 73 61 6d 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66  same amount of f
235e0 72 65 65 20 73 70 61 63 65 2e 0a 2a 2a 20 55 73  ree space..** Us
235f0 75 61 6c 6c 79 20 4e 4e 20 73 69 62 6c 69 6e 67  ually NN sibling
23600 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
23610 20 6f 66 20 70 50 61 67 65 20 69 73 20 75 73 65   of pPage is use
23620 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69  d in the balanci
23630 6e 67 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 6d 6f  ng,.** though mo
23640 72 65 20 73 69 62 6c 69 6e 67 73 20 6d 69 67 68  re siblings migh
23650 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 20  t come from one 
23660 73 69 64 65 20 69 66 20 70 50 61 67 65 20 69 73  side if pPage is
23670 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 6f 72   the first.** or
23680 20 6c 61 73 74 20 63 68 69 6c 64 20 6f 66 20 69   last child of i
23690 74 73 20 70 61 72 65 6e 74 2e 20 20 49 66 20 70  ts parent.  If p
236a0 50 61 67 65 20 68 61 73 20 66 65 77 65 72 20 74  Page has fewer t
236b0 68 61 6e 20 32 2a 4e 4e 20 73 69 62 6c 69 6e 67  han 2*NN sibling
236c0 73 0a 2a 2a 20 28 73 6f 6d 65 74 68 69 6e 67 20  s.** (something 
236d0 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68  which can only h
236e0 61 70 70 65 6e 20 69 66 20 70 50 61 67 65 20 69  appen if pPage i
236f0 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  s the root page 
23700 6f 72 20 61 20 0a 2a 2a 20 63 68 69 6c 64 20 6f  or a .** child o
23710 66 20 72 6f 6f 74 29 20 74 68 65 6e 20 61 6c 6c  f root) then all
23720 20 61 76 61 69 6c 61 62 6c 65 20 73 69 62 6c 69   available sibli
23730 6e 67 73 20 70 61 72 74 69 63 69 70 61 74 65 20  ngs participate 
23740 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  in the balancing
23750 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62  ..**.** The numb
23760 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f  er of siblings o
23770 66 20 70 50 61 67 65 20 6d 69 67 68 74 20 62 65  f pPage might be
23780 20 69 6e 63 72 65 61 73 65 64 20 6f 72 20 64 65   increased or de
23790 63 72 65 61 73 65 64 20 62 79 20 6f 6e 65 20 6f  creased by one o
237a0 72 0a 2a 2a 20 74 77 6f 20 69 6e 20 61 6e 20 65  r.** two in an e
237b0 66 66 6f 72 74 20 74 6f 20 6b 65 65 70 20 70 61  ffort to keep pa
237c0 67 65 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 20  ges nearly full 
237d0 62 75 74 20 6e 6f 74 20 6f 76 65 72 20 66 75 6c  but not over ful
237e0 6c 2e 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65  l. The root page
237f0 0a 2a 2a 20 69 73 20 73 70 65 63 69 61 6c 20 61  .** is special a
23800 6e 64 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f  nd is allowed to
23810 20 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79   be nearly empty
23820 2e 20 49 66 20 70 50 61 67 65 20 69 73 20 0a 2a  . If pPage is .*
23830 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2c  * the root page,
23840 20 74 68 65 6e 20 74 68 65 20 64 65 70 74 68 20   then the depth 
23850 6f 66 20 74 68 65 20 74 72 65 65 20 6d 69 67 68  of the tree migh
23860 74 20 62 65 20 69 6e 63 72 65 61 73 65 64 0a 2a  t be increased.*
23870 2a 20 6f 72 20 64 65 63 72 65 61 73 65 64 20 62  * or decreased b
23880 79 20 6f 6e 65 2c 20 61 73 20 6e 65 63 65 73 73  y one, as necess
23890 61 72 79 2c 20 74 6f 20 6b 65 65 70 20 74 68 65  ary, to keep the
238a0 20 72 6f 6f 74 20 70 61 67 65 20 66 72 6f 6d 20   root page from 
238b0 62 65 69 6e 67 0a 2a 2a 20 6f 76 65 72 66 75 6c  being.** overful
238c0 6c 20 6f 72 20 63 6f 6d 70 6c 65 74 65 6c 79 20  l or completely 
238d0 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  empty..**.** Not
238e0 65 20 74 68 61 74 20 77 68 65 6e 20 74 68 69 73  e that when this
238f0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
23900 65 64 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65 20  ed, some of the 
23910 43 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 0a 2a  Cells on pPage.*
23920 2a 20 6d 69 67 68 74 20 6e 6f 74 20 61 63 74 75  * might not actu
23930 61 6c 6c 79 20 62 65 20 73 74 6f 72 65 64 20 69  ally be stored i
23940 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  n pPage->aData[]
23950 2e 20 20 54 68 69 73 20 63 61 6e 20 68 61 70 70  .  This can happ
23960 65 6e 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67  en.** if the pag
23970 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20 20  e is overfull.  
23980 50 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 62 20  Part of the job 
23990 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
239a0 69 73 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 73 75  is to.** make su
239b0 72 65 20 61 6c 6c 20 43 65 6c 6c 73 20 66 6f 72  re all Cells for
239c0 20 70 50 61 67 65 20 6f 6e 63 65 20 61 67 61 69   pPage once agai
239d0 6e 20 66 69 74 20 69 6e 20 70 50 61 67 65 2d 3e  n fit in pPage->
239e0 61 44 61 74 61 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 49  aData[]..**.** I
239f0 6e 20 74 68 65 20 63 6f 75 72 73 65 20 6f 66 20  n the course of 
23a00 62 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 73 69  balancing the si
23a10 62 6c 69 6e 67 73 20 6f 66 20 70 50 61 67 65 2c  blings of pPage,
23a20 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 70   the parent of p
23a30 50 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 62 65  Page.** might be
23a40 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72  come overfull or
23a50 20 75 6e 64 65 72 66 75 6c 6c 2e 20 20 49 66 20   underfull.  If 
23a60 74 68 61 74 20 68 61 70 70 65 6e 73 2c 20 74 68  that happens, th
23a70 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
23a80 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 72 65 63  ** is called rec
23a90 75 72 73 69 76 65 6c 79 20 6f 6e 20 74 68 65 20  ursively on the 
23aa0 70 61 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  parent..**.** If
23ab0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61   this routine fa
23ac0 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73  ils for any reas
23ad0 6f 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61  on, it might lea
23ae0 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  ve the database.
23af0 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65  ** in a corrupte
23b00 64 20 73 74 61 74 65 2e 20 20 53 6f 20 69 66 20  d state.  So if 
23b10 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69  this routine fai
23b20 6c 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ls, the database
23b30 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f   should.** be ro
23b40 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74  lled back..*/.st
23b50 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
23b60 5f 6e 6f 6e 72 6f 6f 74 28 4d 65 6d 50 61 67 65  _nonroot(MemPage
23b70 20 2a 70 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50   *pPage){.  MemP
23b80 61 67 65 20 2a 70 50 61 72 65 6e 74 3b 20 20 20  age *pParent;   
23b90 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
23ba0 70 61 72 65 6e 74 20 6f 66 20 70 50 61 67 65 20  parent of pPage 
23bb0 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
23bc0 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
23bd0 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c       /* The whol
23be0 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
23bf0 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 30 3b 20 20  int nCell = 0;  
23c00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23c10 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
23c20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20  in apCell[] */. 
23c30 20 69 6e 74 20 6e 4d 61 78 43 65 6c 6c 73 20 3d   int nMaxCells =
23c40 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
23c50 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20   Allocated size 
23c60 6f 66 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c  of apCell, szCel
23c70 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69  l, aFrom. */.  i
23c80 6e 74 20 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20  nt nOld;        
23c90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
23ca0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
23cb0 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69  n apOld[] */.  i
23cc0 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20 20 20 20  nt nNew;        
23cd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
23ce0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
23cf0 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69  n apNew[] */.  i
23d00 6e 74 20 6e 44 69 76 3b 20 20 20 20 20 20 20 20  nt nDiv;        
23d10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
23d20 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69  umber of cells i
23d30 6e 20 61 70 44 69 76 5b 5d 20 2a 2f 0a 20 20 69  n apDiv[] */.  i
23d40 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20 20 20 20 20  nt i, j, k;     
23d50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
23d60 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
23d70 20 20 69 6e 74 20 69 64 78 3b 20 20 20 20 20 20    int idx;      
23d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23d90 2a 20 49 6e 64 65 78 20 6f 66 20 70 50 61 67 65  * Index of pPage
23da0 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65   in pParent->aCe
23db0 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 78  ll[] */.  int nx
23dc0 44 69 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  Div;            
23dd0 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 64         /* Next d
23de0 69 76 69 64 65 72 20 73 6c 6f 74 20 69 6e 20 70  ivider slot in p
23df0 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20  Parent->aCell[] 
23e00 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
23e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20    /* The return 
23e30 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6c 65  code */.  int le
23e40 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20 20 20  afCorrection;   
23e50 20 20 20 20 20 20 20 2f 2a 20 34 20 69 66 20 70         /* 4 if p
23e60 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20  Page is a leaf. 
23e70 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20 20 69   0 if not */.  i
23e80 6e 74 20 6c 65 61 66 44 61 74 61 3b 20 20 20 20  nt leafData;    
23e90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
23ea0 72 75 65 20 69 66 20 70 50 61 67 65 20 69 73 20  rue if pPage is 
23eb0 61 20 6c 65 61 66 20 6f 66 20 61 20 4c 45 41 46  a leaf of a LEAF
23ec0 44 41 54 41 20 74 72 65 65 20 2a 2f 0a 20 20 69  DATA tree */.  i
23ed0 6e 74 20 75 73 61 62 6c 65 53 70 61 63 65 3b 20  nt usableSpace; 
23ee0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
23ef0 79 74 65 73 20 69 6e 20 70 50 61 67 65 20 62 65  ytes in pPage be
23f00 79 6f 6e 64 20 74 68 65 20 68 65 61 64 65 72 20  yond the header 
23f10 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 46 6c 61  */.  int pageFla
23f20 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
23f30 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70 50    /* Value of pP
23f40 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 2a 2f  age->aData[0] */
23f50 0a 20 20 69 6e 74 20 73 75 62 74 6f 74 61 6c 3b  .  int subtotal;
23f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f70 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66 20 62  /* Subtotal of b
23f80 79 74 65 73 20 69 6e 20 63 65 6c 6c 73 20 6f 6e  ytes in cells on
23f90 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20 69   one page */.  i
23fa0 6e 74 20 69 53 70 61 63 65 20 3d 20 30 3b 20 20  nt iSpace = 0;  
23fb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
23fc0 69 72 73 74 20 75 6e 75 73 65 64 20 62 79 74 65  irst unused byte
23fd0 20 6f 66 20 61 53 70 61 63 65 5b 5d 20 2a 2f 0a   of aSpace[] */.
23fe0 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f 6c 64    MemPage *apOld
23ff0 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 2f  [NB];          /
24000 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74  * pPage and up t
24010 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67 73 20 2a  o two siblings *
24020 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 6c 64  /.  Pgno pgnoOld
24030 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 20  [NB];           
24040 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 73   /* Page numbers
24050 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69   for each page i
24060 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 4d  n apOld[] */.  M
24070 65 6d 50 61 67 65 20 2a 61 70 43 6f 70 79 5b 4e  emPage *apCopy[N
24080 42 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50  B];         /* P
24090 72 69 76 61 74 65 20 63 6f 70 69 65 73 20 6f 66  rivate copies of
240a0 20 61 70 4f 6c 64 5b 5d 20 70 61 67 65 73 20 2a   apOld[] pages *
240b0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4e  /.  MemPage *apN
240c0 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20  ew[NB+2];       
240d0 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70   /* pPage and up
240e0 20 74 6f 20 4e 42 20 73 69 62 6c 69 6e 67 73 20   to NB siblings 
240f0 61 66 74 65 72 20 62 61 6c 61 6e 63 69 6e 67 20  after balancing 
24100 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65  */.  Pgno pgnoNe
24110 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20  w[NB+2];        
24120 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
24130 73 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  s for each page 
24140 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20  in apNew[] */.  
24150 75 38 20 2a 61 70 44 69 76 5b 4e 42 5d 3b 20 20  u8 *apDiv[NB];  
24160 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24170 44 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e  Divider cells in
24180 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e   pParent */.  in
24190 74 20 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20  t cntNew[NB+2]; 
241a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
241b0 64 65 78 20 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f  dex in aCell[] o
241c0 66 20 63 65 6c 6c 20 61 66 74 65 72 20 69 2d 74  f cell after i-t
241d0 68 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  h page */.  int 
241e0 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20  szNew[NB+2];    
241f0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62           /* Comb
24200 69 6e 65 64 20 73 69 7a 65 20 6f 66 20 63 65 6c  ined size of cel
24210 6c 73 20 70 6c 61 63 65 20 6f 6e 20 69 2d 74 68  ls place on i-th
24220 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a   page */.  u8 **
24230 61 70 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20  apCell = 0;     
24240 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63          /* All c
24250 65 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c 61 6e  ells begin balan
24260 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 73 7a  ced */.  int *sz
24270 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
24280 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73        /* Local s
24290 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73  ize of all cells
242a0 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a   in apCell[] */.
242b0 20 20 75 38 20 2a 61 43 6f 70 79 5b 4e 42 5d 3b    u8 *aCopy[NB];
242c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
242d0 2a 20 53 70 61 63 65 20 66 6f 72 20 68 6f 6c 64  * Space for hold
242e0 69 6e 67 20 64 61 74 61 20 6f 66 20 61 70 43 6f  ing data of apCo
242f0 70 79 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53  py[] */.  u8 *aS
24300 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
24310 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
24320 74 6f 20 68 6f 6c 64 20 63 6f 70 69 65 73 20 6f  to hold copies o
24330 66 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73  f dividers cells
24340 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
24350 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
24360 55 4d 0a 20 20 75 38 20 2a 61 46 72 6f 6d 20 3d  UM.  u8 *aFrom =
24370 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a   0;.#endif..  /*
24380 20 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20   .  ** Find the 
24390 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 2a  parent page..  *
243a0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
243b0 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61  e->isInit );.  a
243c0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
243d0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
243e0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
243f0 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d  ;.  pBt = pPage-
24400 3e 70 42 74 3b 0a 20 20 70 50 61 72 65 6e 74 20  >pBt;.  pParent 
24410 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  = pPage->pParent
24420 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
24430 65 6e 74 20 29 3b 0a 20 20 69 66 28 20 53 51 4c  ent );.  if( SQL
24440 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
24450 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
24460 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
24470 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  )) ){.    return
24480 20 72 63 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45   rc;.  }.  TRACE
24490 28 28 22 42 41 4c 41 4e 43 45 3a 20 62 65 67 69  (("BALANCE: begi
244a0 6e 20 70 61 67 65 20 25 64 20 63 68 69 6c 64 20  n page %d child 
244b0 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d  of %d\n", pPage-
244c0 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e  >pgno, pParent->
244d0 70 67 6e 6f 29 29 3b 0a 0a 23 69 66 6e 64 65 66  pgno));..#ifndef
244e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49   SQLITE_OMIT_QUI
244f0 43 4b 42 41 4c 41 4e 43 45 0a 20 20 2f 2a 0a 20  CKBALANCE.  /*. 
24500 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20 63 61   ** A special ca
24510 73 65 3a 20 20 49 66 20 61 20 6e 65 77 20 65 6e  se:  If a new en
24520 74 72 79 20 68 61 73 20 6a 75 73 74 20 62 65 65  try has just bee
24530 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  n inserted into 
24540 61 0a 20 20 2a 2a 20 74 61 62 6c 65 20 28 74 68  a.  ** table (th
24550 61 74 20 69 73 2c 20 61 20 62 74 72 65 65 20 77  at is, a btree w
24560 69 74 68 20 69 6e 74 65 67 65 72 20 6b 65 79 73  ith integer keys
24570 20 61 6e 64 20 61 6c 6c 20 64 61 74 61 20 61 74   and all data at
24580 20 74 68 65 20 6c 65 61 76 65 73 29 0a 20 20 2a   the leaves).  *
24590 2a 20 61 6e 64 20 74 68 65 20 6e 65 77 20 65 6e  * and the new en
245a0 74 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  try is the right
245b0 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 6e 20 74  -most entry in t
245c0 68 65 20 74 72 65 65 20 28 69 74 20 68 61 73 20  he tree (it has 
245d0 74 68 65 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74  the.  ** largest
245e0 20 6b 65 79 29 20 74 68 65 6e 20 75 73 65 20 74   key) then use t
245f0 68 65 20 73 70 65 63 69 61 6c 20 62 61 6c 61 6e  he special balan
24600 63 65 5f 71 75 69 63 6b 28 29 20 72 6f 75 74 69  ce_quick() routi
24610 6e 65 20 66 6f 72 0a 20 20 2a 2a 20 62 61 6c 61  ne for.  ** bala
24620 6e 63 69 6e 67 2e 20 20 62 61 6c 61 6e 63 65 5f  ncing.  balance_
24630 71 75 69 63 6b 28 29 20 69 73 20 6d 75 63 68 20  quick() is much 
24640 66 61 73 74 65 72 20 61 6e 64 20 72 65 73 75 6c  faster and resul
24650 74 73 20 69 6e 20 61 20 74 69 67 68 74 65 72 0a  ts in a tighter.
24660 20 20 2a 2a 20 70 61 63 6b 69 6e 67 20 6f 66 20    ** packing of 
24670 64 61 74 61 20 69 6e 20 74 68 65 20 63 6f 6d 6d  data in the comm
24680 6f 6e 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  on case..  */.  
24690 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
246a0 26 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  &&.      pPage->
246b0 69 6e 74 4b 65 79 20 26 26 0a 20 20 20 20 20 20  intKey &&.      
246c0 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20  pPage->leafData 
246d0 26 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  &&.      pPage->
246e0 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 26 26 0a  nOverflow==1 &&.
246f0 20 20 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76        pPage->aOv
24700 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 50 61 67 65  fl[0].idx==pPage
24710 2d 3e 6e 43 65 6c 6c 20 26 26 0a 20 20 20 20 20  ->nCell &&.     
24720 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 2d   pPage->pParent-
24730 3e 70 67 6e 6f 21 3d 31 20 26 26 0a 20 20 20 20  >pgno!=1 &&.    
24740 20 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72    get4byte(&pPar
24750 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
24760 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  nt->hdrOffset+8]
24770 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 0a 20  )==pPage->pgno. 
24780 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
24790 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 74 68  * TODO: Check th
247a0 65 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 74 68  e siblings to th
247b0 65 20 6c 65 66 74 20 6f 66 20 70 50 61 67 65 2e  e left of pPage.
247c0 20 49 74 20 6d 61 79 20 62 65 20 74 68 61 74 0a   It may be that.
247d0 20 20 20 20 2a 2a 20 74 68 65 79 20 61 72 65 20      ** they are 
247e0 6e 6f 74 20 66 75 6c 6c 20 61 6e 64 20 6e 6f 20  not full and no 
247f0 6e 65 77 20 70 61 67 65 20 69 73 20 72 65 71 75  new page is requ
24800 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
24810 20 72 65 74 75 72 6e 20 62 61 6c 61 6e 63 65 5f   return balance_
24820 71 75 69 63 6b 28 70 50 61 67 65 2c 20 70 50 61  quick(pPage, pPa
24830 72 65 6e 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  rent);.  }.#endi
24840 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e  f..  /*.  ** Fin
24850 64 20 74 68 65 20 63 65 6c 6c 20 69 6e 20 74 68  d the cell in th
24860 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 77 68  e parent page wh
24870 6f 73 65 20 6c 65 66 74 20 63 68 69 6c 64 20 70  ose left child p
24880 6f 69 6e 74 73 20 62 61 63 6b 0a 20 20 2a 2a 20  oints back.  ** 
24890 74 6f 20 70 50 61 67 65 2e 20 20 54 68 65 20 22  to pPage.  The "
248a0 69 64 78 22 20 76 61 72 69 61 62 6c 65 20 69 73  idx" variable is
248b0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
248c0 61 74 20 63 65 6c 6c 2e 20 20 49 66 20 70 50 61  at cell.  If pPa
248d0 67 65 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 72  ge.  ** is the r
248e0 69 67 68 74 6d 6f 73 74 20 63 68 69 6c 64 20 6f  ightmost child o
248f0 66 20 70 50 61 72 65 6e 74 20 74 68 65 6e 20 73  f pParent then s
24900 65 74 20 69 64 78 20 74 6f 20 70 50 61 72 65 6e  et idx to pParen
24910 74 2d 3e 6e 43 65 6c 6c 20 0a 20 20 2a 2f 0a 20  t->nCell .  */. 
24920 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e 69 64   if( pParent->id
24930 78 53 68 69 66 74 20 29 7b 0a 20 20 20 20 50 67  xShift ){.    Pg
24940 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 70 67 6e  no pgno;.    pgn
24950 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b  o = pPage->pgno;
24960 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e  .    assert( pgn
24970 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50  o==sqlite3PagerP
24980 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d  agenumber(pPage-
24990 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
249a0 20 66 6f 72 28 69 64 78 3d 30 3b 20 69 64 78 3c   for(idx=0; idx<
249b0 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 20  pParent->nCell; 
249c0 69 64 78 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  idx++){.      if
249d0 28 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  ( get4byte(findC
249e0 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 64 78  ell(pParent, idx
249f0 29 29 3d 3d 70 67 6e 6f 20 29 7b 0a 20 20 20 20  ))==pgno ){.    
24a00 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
24a10 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
24a20 65 72 74 28 20 69 64 78 3c 70 50 61 72 65 6e 74  ert( idx<pParent
24a30 2d 3e 6e 43 65 6c 6c 0a 20 20 20 20 20 20 20 20  ->nCell.        
24a40 20 20 20 20 20 7c 7c 20 67 65 74 34 62 79 74 65       || get4byte
24a50 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
24a60 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
24a70 73 65 74 2b 38 5d 29 3d 3d 70 67 6e 6f 20 29 3b  set+8])==pgno );
24a80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 64  .  }else{.    id
24a90 78 20 3d 20 70 50 61 67 65 2d 3e 69 64 78 50 61  x = pPage->idxPa
24aa0 72 65 6e 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  rent;.  }..  /*.
24ab0 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    ** Initialize 
24ac0 76 61 72 69 61 62 6c 65 73 20 73 6f 20 74 68 61  variables so tha
24ad0 74 20 69 74 20 77 69 6c 6c 20 62 65 20 73 61 66  t it will be saf
24ae0 65 20 74 6f 20 6a 75 6d 70 0a 20 20 2a 2a 20 64  e to jump.  ** d
24af0 69 72 65 63 74 6c 79 20 74 6f 20 62 61 6c 61 6e  irectly to balan
24b00 63 65 5f 63 6c 65 61 6e 75 70 20 61 74 20 61 6e  ce_cleanup at an
24b10 79 20 6d 6f 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20  y moment..  */. 
24b20 20 6e 4f 6c 64 20 3d 20 6e 4e 65 77 20 3d 20 30   nOld = nNew = 0
24b30 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
24b40 52 65 66 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  Ref(pParent->pDb
24b50 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  Page);..  /*.  *
24b60 2a 20 46 69 6e 64 20 73 69 62 6c 69 6e 67 20 70  * Find sibling p
24b70 61 67 65 73 20 74 6f 20 70 50 61 67 65 20 61 6e  ages to pPage an
24b80 64 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 70  d the cells in p
24b90 50 61 72 65 6e 74 20 74 68 61 74 20 64 69 76 69  Parent that divi
24ba0 64 65 0a 20 20 2a 2a 20 74 68 65 20 73 69 62 6c  de.  ** the sibl
24bb0 69 6e 67 73 2e 20 20 41 6e 20 61 74 74 65 6d 70  ings.  An attemp
24bc0 74 20 69 73 20 6d 61 64 65 20 74 6f 20 66 69 6e  t is made to fin
24bd0 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e  d NN siblings on
24be0 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 73 69 64   either.  ** sid
24bf0 65 20 6f 66 20 70 50 61 67 65 2e 20 20 4d 6f 72  e of pPage.  Mor
24c00 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 74  e siblings are t
24c10 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73 69  aken from one si
24c20 64 65 2c 20 68 6f 77 65 76 65 72 2c 20 69 66 0a  de, however, if.
24c30 20 20 2a 2a 20 70 50 61 67 65 20 74 68 65 72 65    ** pPage there
24c40 20 61 72 65 20 66 65 77 65 72 20 74 68 61 6e 20   are fewer than 
24c50 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 74  NN siblings on t
24c60 68 65 20 6f 74 68 65 72 20 73 69 64 65 2e 20 20  he other side.  
24c70 49 66 20 70 50 61 72 65 6e 74 0a 20 20 2a 2a 20  If pParent.  ** 
24c80 68 61 73 20 4e 42 20 6f 72 20 66 65 77 65 72 20  has NB or fewer 
24c90 63 68 69 6c 64 72 65 6e 20 74 68 65 6e 20 61 6c  children then al
24ca0 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 50  l children of pP
24cb0 61 72 65 6e 74 20 61 72 65 20 74 61 6b 65 6e 2e  arent are taken.
24cc0 0a 20 20 2a 2f 0a 20 20 6e 78 44 69 76 20 3d 20  .  */.  nxDiv = 
24cd0 69 64 78 20 2d 20 4e 4e 3b 0a 20 20 69 66 28 20  idx - NN;.  if( 
24ce0 6e 78 44 69 76 20 2b 20 4e 42 20 3e 20 70 50 61  nxDiv + NB > pPa
24cf0 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  rent->nCell ){. 
24d00 20 20 20 6e 78 44 69 76 20 3d 20 70 50 61 72 65     nxDiv = pPare
24d10 6e 74 2d 3e 6e 43 65 6c 6c 20 2d 20 4e 42 20 2b  nt->nCell - NB +
24d20 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 78   1;.  }.  if( nx
24d30 44 69 76 3c 30 20 29 7b 0a 20 20 20 20 6e 78 44  Div<0 ){.    nxD
24d40 69 76 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 44  iv = 0;.  }.  nD
24d50 69 76 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d  iv = 0;.  for(i=
24d60 30 2c 20 6b 3d 6e 78 44 69 76 3b 20 69 3c 4e 42  0, k=nxDiv; i<NB
24d70 3b 20 69 2b 2b 2c 20 6b 2b 2b 29 7b 0a 20 20 20  ; i++, k++){.   
24d80 20 69 66 28 20 6b 3c 70 50 61 72 65 6e 74 2d 3e   if( k<pParent->
24d90 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 61  nCell ){.      a
24da0 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43 65  pDiv[i] = findCe
24db0 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6b 29 3b 0a  ll(pParent, k);.
24dc0 20 20 20 20 20 20 6e 44 69 76 2b 2b 3b 0a 20 20        nDiv++;.  
24dd0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
24de0 72 65 6e 74 2d 3e 6c 65 61 66 20 29 3b 0a 20 20  rent->leaf );.  
24df0 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d      pgnoOld[i] =
24e00 20 67 65 74 34 62 79 74 65 28 61 70 44 69 76 5b   get4byte(apDiv[
24e10 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  i]);.    }else i
24e20 66 28 20 6b 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e  f( k==pParent->n
24e30 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 67  Cell ){.      pg
24e40 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65 74 34 62  noOld[i] = get4b
24e50 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
24e60 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
24e70 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
24e80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 72 65  }else{.      bre
24e90 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ak;.    }.    rc
24ea0 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
24eb0 65 28 70 42 74 2c 20 70 67 6e 6f 4f 6c 64 5b 69  e(pBt, pgnoOld[i
24ec0 5d 2c 20 26 61 70 4f 6c 64 5b 69 5d 2c 20 70 50  ], &apOld[i], pP
24ed0 61 72 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20  arent);.    if( 
24ee0 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
24ef0 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 61  e_cleanup;.    a
24f00 70 4f 6c 64 5b 69 5d 2d 3e 69 64 78 50 61 72 65  pOld[i]->idxPare
24f10 6e 74 20 3d 20 6b 3b 0a 20 20 20 20 61 70 43 6f  nt = k;.    apCo
24f20 70 79 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 61  py[i] = 0;.    a
24f30 73 73 65 72 74 28 20 69 3d 3d 6e 4f 6c 64 20 29  ssert( i==nOld )
24f40 3b 0a 20 20 20 20 6e 4f 6c 64 2b 2b 3b 0a 20 20  ;.    nOld++;.  
24f50 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20 31    nMaxCells += 1
24f60 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c  +apOld[i]->nCell
24f70 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72  +apOld[i]->nOver
24f80 66 6c 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  flow;.  }..  /* 
24f90 4d 61 6b 65 20 6e 4d 61 78 43 65 6c 6c 73 20 61  Make nMaxCells a
24fa0 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 32 20 69   multiple of 2 i
24fb0 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 73 65  n order to prese
24fc0 72 76 65 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20  rve 8-byte.  ** 
24fd0 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e  alignment */.  n
24fe0 4d 61 78 43 65 6c 6c 73 20 3d 20 28 6e 4d 61 78  MaxCells = (nMax
24ff0 43 65 6c 6c 73 20 2b 20 31 29 26 7e 31 3b 0a 0a  Cells + 1)&~1;..
25000 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61    /*.  ** Alloca
25010 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65 6d  te space for mem
25020 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 0a 20  ory structures. 
25030 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73   */.  apCell = s
25040 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
25050 0a 20 20 20 20 20 20 20 6e 4d 61 78 43 65 6c 6c  .       nMaxCell
25060 73 2a 73 69 7a 65 6f 66 28 75 38 2a 29 20 20 20  s*sizeof(u8*)   
25070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25080 20 20 20 20 20 20 20 20 2f 2a 20 61 70 43 65 6c          /* apCel
25090 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d 61 78  l */.     + nMax
250a0 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 69 6e 74  Cells*sizeof(int
250b0 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
250c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
250d0 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20  zCell */.     + 
250e0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65  ROUND8(sizeof(Me
250f0 6d 50 61 67 65 29 29 2a 4e 42 20 20 20 20 20 20  mPage))*NB      
25100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25110 2f 2a 20 61 43 6f 70 79 20 2a 2f 0a 20 20 20 20  /* aCopy */.    
25120 20 2b 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   + pBt->pageSize
25130 2a 28 35 2b 4e 42 29 20 20 20 20 20 20 20 20 20  *(5+NB)         
25140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25150 20 20 20 2f 2a 20 61 53 70 61 63 65 20 2a 2f 0a     /* aSpace */.
25160 20 20 20 20 20 2b 20 28 49 53 41 55 54 4f 56 41       + (ISAUTOVA
25170 43 55 55 4d 20 3f 20 6e 4d 61 78 43 65 6c 6c 73  CUUM ? nMaxCells
25180 20 3a 20 30 29 20 20 20 20 20 20 20 20 20 20 20   : 0)           
25190 20 20 20 20 20 20 20 2f 2a 20 61 46 72 6f 6d 20         /* aFrom 
251a0 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20 61 70  */.  );.  if( ap
251b0 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Cell==0 ){.    r
251c0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
251d0 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e  ;.    goto balan
251e0 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  ce_cleanup;.  }.
251f0 20 20 73 7a 43 65 6c 6c 20 3d 20 28 69 6e 74 2a    szCell = (int*
25200 29 26 61 70 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c  )&apCell[nMaxCel
25210 6c 73 5d 3b 0a 20 20 61 43 6f 70 79 5b 30 5d 20  ls];.  aCopy[0] 
25220 3d 20 28 75 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e  = (u8*)&szCell[n
25230 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 73 73  MaxCells];.  ass
25240 65 72 74 28 20 28 28 61 43 6f 70 79 5b 30 5d 20  ert( ((aCopy[0] 
25250 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c 29 20 26  - (u8*)apCell) &
25260 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d 62   7)==0 ); /* 8-b
25270 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72 65  yte alignment re
25280 71 75 69 72 65 64 20 2a 2f 0a 20 20 66 6f 72 28  quired */.  for(
25290 69 3d 31 3b 20 69 3c 4e 42 3b 20 69 2b 2b 29 7b  i=1; i<NB; i++){
252a0 0a 20 20 20 20 61 43 6f 70 79 5b 69 5d 20 3d 20  .    aCopy[i] = 
252b0 26 61 43 6f 70 79 5b 69 2d 31 5d 5b 70 42 74 2d  &aCopy[i-1][pBt-
252c0 3e 70 61 67 65 53 69 7a 65 2b 52 4f 55 4e 44 38  >pageSize+ROUND8
252d0 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29  (sizeof(MemPage)
252e0 29 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  )];.    assert( 
252f0 28 28 61 43 6f 70 79 5b 69 5d 20 2d 20 28 75 38  ((aCopy[i] - (u8
25300 2a 29 61 70 43 65 6c 6c 29 20 26 20 37 29 3d 3d  *)apCell) & 7)==
25310 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61  0 ); /* 8-byte a
25320 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65  lignment require
25330 64 20 2a 2f 0a 20 20 7d 0a 20 20 61 53 70 61 63  d */.  }.  aSpac
25340 65 20 3d 20 26 61 43 6f 70 79 5b 4e 42 2d 31 5d  e = &aCopy[NB-1]
25350 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2b 52  [pBt->pageSize+R
25360 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d  OUND8(sizeof(Mem
25370 50 61 67 65 29 29 5d 3b 0a 20 20 61 73 73 65 72  Page))];.  asser
25380 74 28 20 28 28 61 53 70 61 63 65 20 2d 20 28 75  t( ((aSpace - (u
25390 38 2a 29 61 70 43 65 6c 6c 29 20 26 20 37 29 3d  8*)apCell) & 7)=
253a0 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20  =0 ); /* 8-byte 
253b0 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72  alignment requir
253c0 65 64 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  ed */.#ifndef SQ
253d0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
253e0 43 55 55 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e  CUUM.  if( pBt->
253f0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
25400 20 20 61 46 72 6f 6d 20 3d 20 26 61 53 70 61 63    aFrom = &aSpac
25410 65 5b 35 2a 70 42 74 2d 3e 70 61 67 65 53 69 7a  e[5*pBt->pageSiz
25420 65 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  e];.  }.#endif. 
25430 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4d 61 6b 65   .  /*.  ** Make
25440 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 63   copies of the c
25450 6f 6e 74 65 6e 74 20 6f 66 20 70 50 61 67 65 20  ontent of pPage 
25460 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73  and its siblings
25470 20 69 6e 74 6f 20 61 4f 6c 64 5b 5d 2e 0a 20 20   into aOld[]..  
25480 2a 2a 20 54 68 65 20 72 65 73 74 20 6f 66 20 74  ** The rest of t
25490 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  his function wil
254a0 6c 20 75 73 65 20 64 61 74 61 20 66 72 6f 6d 20  l use data from 
254b0 74 68 65 20 63 6f 70 69 65 73 20 72 61 74 68 65  the copies rathe
254c0 72 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  r.  ** that the 
254d0 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 73  original pages s
254e0 69 6e 63 65 20 74 68 65 20 6f 72 69 67 69 6e 61  ince the origina
254f0 6c 20 70 61 67 65 73 20 77 69 6c 6c 20 62 65 20  l pages will be 
25500 69 6e 20 74 68 65 0a 20 20 2a 2a 20 70 72 6f 63  in the.  ** proc
25510 65 73 73 20 6f 66 20 62 65 69 6e 67 20 6f 76 65  ess of being ove
25520 72 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20  rwritten..  */. 
25530 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64   for(i=0; i<nOld
25540 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50  ; i++){.    MemP
25550 61 67 65 20 2a 70 20 3d 20 61 70 43 6f 70 79 5b  age *p = apCopy[
25560 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 26  i] = (MemPage*)&
25570 61 43 6f 70 79 5b 69 5d 5b 70 42 74 2d 3e 70 61  aCopy[i][pBt->pa
25580 67 65 53 69 7a 65 5d 3b 0a 20 20 20 20 70 2d 3e  geSize];.    p->
25590 61 44 61 74 61 20 3d 20 26 28 28 75 38 2a 29 70  aData = &((u8*)p
255a0 29 5b 2d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  )[-pBt->pageSize
255b0 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d  ];.    memcpy(p-
255c0 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d  >aData, apOld[i]
255d0 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 70 61  ->aData, pBt->pa
255e0 67 65 53 69 7a 65 20 2b 20 73 69 7a 65 6f 66 28  geSize + sizeof(
255f0 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 20 20 2f  MemPage));.    /
25600 2a 20 54 68 65 20 6d 65 6d 63 70 79 28 29 20 61  * The memcpy() a
25610 62 6f 76 65 20 63 68 61 6e 67 65 73 20 74 68 65  bove changes the
25620 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 61 44 61   value of p->aDa
25630 74 61 20 73 6f 20 77 65 20 68 61 76 65 20 74 6f  ta so we have to
25640 0a 20 20 20 20 2a 2a 20 73 65 74 20 69 74 20 61  .    ** set it a
25650 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 70 2d 3e  gain. */.    p->
25660 61 44 61 74 61 20 3d 20 26 28 28 75 38 2a 29 70  aData = &((u8*)p
25670 29 5b 2d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  )[-pBt->pageSize
25680 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  ];.  }..  /*.  *
25690 2a 20 4c 6f 61 64 20 70 6f 69 6e 74 65 72 73 20  * Load pointers 
256a0 74 6f 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20  to all cells on 
256b0 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 6e  sibling pages an
256c0 64 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  d the divider ce
256d0 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68  lls.  ** into th
256e0 65 20 6c 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d  e local apCell[]
256f0 20 61 72 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f   array.  Make co
25700 70 69 65 73 20 6f 66 20 74 68 65 20 64 69 76 69  pies of the divi
25710 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69  der cells.  ** i
25720 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e  nto space obtain
25730 65 64 20 66 6f 72 6d 20 61 53 70 61 63 65 5b 5d  ed form aSpace[]
25740 20 61 6e 64 20 72 65 6d 6f 76 65 20 74 68 65 20   and remove the 
25750 74 68 65 20 64 69 76 69 64 65 72 20 43 65 6c 6c  the divider Cell
25760 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72  s.  ** from pPar
25770 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ent..  **.  ** I
25780 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61  f the siblings a
25790 72 65 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 73  re on leaf pages
257a0 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64  , then the child
257b0 20 70 6f 69 6e 74 65 72 73 20 6f 66 20 74 68 65   pointers of the
257c0 0a 20 20 2a 2a 20 64 69 76 69 64 65 72 20 63 65  .  ** divider ce
257d0 6c 6c 73 20 61 72 65 20 73 74 72 69 70 70 65 64  lls are stripped
257e0 20 66 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20   from the cells 
257f0 62 65 66 6f 72 65 20 74 68 65 79 20 61 72 65 20  before they are 
25800 63 6f 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f  copied.  ** into
25810 20 61 53 70 61 63 65 5b 5d 2e 20 20 49 6e 20 74   aSpace[].  In t
25820 68 69 73 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c  his way, all cel
25830 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61  ls in apCell[] a
25840 72 65 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20  re without.  ** 
25850 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20  child pointers. 
25860 20 49 66 20 73 69 62 6c 69 6e 67 73 20 61 72 65   If siblings are
25870 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65   not leaves, the
25880 6e 20 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20 20  n all cell in.  
25890 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c  ** apCell[] incl
258a0 75 64 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65  ude child pointe
258b0 72 73 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c  rs.  Either way,
258c0 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
258d0 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65 20  Cell[].  ** are 
258e0 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  alike..  **.  **
258f0 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3a   leafCorrection:
25900 20 20 34 20 69 66 20 70 50 61 67 65 20 69 73 20    4 if pPage is 
25910 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20 70 50  a leaf.  0 if pP
25920 61 67 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61  age is not a lea
25930 66 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c 65  f..  **       le
25940 61 66 44 61 74 61 3a 20 20 31 20 69 66 20 70 50  afData:  1 if pP
25950 61 67 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64 61  age holds key+da
25960 74 61 20 61 6e 64 20 70 50 61 72 65 6e 74 20 68  ta and pParent h
25970 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a  olds only keys..
25980 20 20 2a 2f 0a 20 20 6e 43 65 6c 6c 20 3d 20 30    */.  nCell = 0
25990 3b 0a 20 20 6c 65 61 66 43 6f 72 72 65 63 74 69  ;.  leafCorrecti
259a0 6f 6e 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66  on = pPage->leaf
259b0 2a 34 3b 0a 20 20 6c 65 61 66 44 61 74 61 20 3d  *4;.  leafData =
259c0 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61   pPage->leafData
259d0 20 26 26 20 70 50 61 67 65 2d 3e 6c 65 61 66 3b   && pPage->leaf;
259e0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f  .  for(i=0; i<nO
259f0 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65  ld; i++){.    Me
25a00 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70  mPage *pOld = ap
25a10 43 6f 70 79 5b 69 5d 3b 0a 20 20 20 20 69 6e 74  Copy[i];.    int
25a20 20 6c 69 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e   limit = pOld->n
25a30 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72  Cell+pOld->nOver
25a40 66 6c 6f 77 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  flow;.    for(j=
25a50 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29  0; j<limit; j++)
25a60 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
25a70 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20  nCell<nMaxCells 
25a80 29 3b 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b  );.      apCell[
25a90 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65  nCell] = findOve
25aa0 72 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20  rflowCell(pOld, 
25ab0 6a 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c  j);.      szCell
25ac0 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69  [nCell] = cellSi
25ad0 7a 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65  zePtr(pOld, apCe
25ae0 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 23 69 66 6e  ll[nCell]);.#ifn
25af0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
25b00 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
25b10 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
25b20 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  cuum ){.        
25b30 69 6e 74 20 61 3b 0a 20 20 20 20 20 20 20 20 61  int a;.        a
25b40 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 69 3b  From[nCell] = i;
25b50 0a 20 20 20 20 20 20 20 20 66 6f 72 28 61 3d 30  .        for(a=0
25b60 3b 20 61 3c 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66  ; a<pOld->nOverf
25b70 6c 6f 77 3b 20 61 2b 2b 29 7b 0a 20 20 20 20 20  low; a++){.     
25b80 20 20 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e 61       if( pOld->a
25b90 4f 76 66 6c 5b 61 5d 2e 70 43 65 6c 6c 3d 3d 61  Ovfl[a].pCell==a
25ba0 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 29 7b 0a  pCell[nCell] ){.
25bb0 20 20 20 20 20 20 20 20 20 20 20 20 61 46 72 6f              aFro
25bc0 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78 46 46 3b  m[nCell] = 0xFF;
25bd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
25be0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
25bf0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25c00 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e  }.#endif.      n
25c10 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Cell++;.    }.  
25c20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31 20 29    if( i<nOld-1 )
25c30 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d  {.      int sz =
25c40 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
25c50 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b  rent, apDiv[i]);
25c60 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61 66 44  .      if( leafD
25c70 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ata ){.        /
25c80 2a 20 57 69 74 68 20 74 68 65 20 4c 45 41 46 44  * With the LEAFD
25c90 41 54 41 20 66 6c 61 67 2c 20 70 50 61 72 65 6e  ATA flag, pParen
25ca0 74 20 63 65 6c 6c 73 20 68 6f 6c 64 20 6f 6e 6c  t cells hold onl
25cb0 79 20 49 4e 54 4b 45 59 73 20 74 68 61 74 0a 20  y INTKEYs that. 
25cc0 20 20 20 20 20 20 20 2a 2a 20 61 72 65 20 64 75         ** are du
25cd0 70 6c 69 63 61 74 65 73 20 6f 66 20 6b 65 79 73  plicates of keys
25ce0 20 6f 6e 20 74 68 65 20 63 68 69 6c 64 20 70 61   on the child pa
25cf0 67 65 73 2e 20 20 57 65 20 6e 65 65 64 20 74 6f  ges.  We need to
25d00 20 72 65 6d 6f 76 65 0a 20 20 20 20 20 20 20 20   remove.        
25d10 2a 2a 20 74 68 65 20 64 69 76 69 64 65 72 20 63  ** the divider c
25d20 65 6c 6c 73 20 66 72 6f 6d 20 70 50 61 72 65 6e  ells from pParen
25d30 74 2c 20 62 75 74 20 74 68 65 20 64 69 76 69 64  t, but the divid
25d40 65 72 73 20 63 65 6c 6c 73 20 61 72 65 20 6e 6f  ers cells are no
25d50 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64  t.        ** add
25d60 65 64 20 74 6f 20 61 70 43 65 6c 6c 5b 5d 20 62  ed to apCell[] b
25d70 65 63 61 75 73 65 20 74 68 65 79 20 61 72 65 20  ecause they are 
25d80 64 75 70 6c 69 63 61 74 65 73 20 6f 66 20 63 68  duplicates of ch
25d90 69 6c 64 20 63 65 6c 6c 73 2e 0a 20 20 20 20 20  ild cells..     
25da0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 64 72     */.        dr
25db0 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  opCell(pParent, 
25dc0 6e 78 44 69 76 2c 20 73 7a 29 3b 0a 20 20 20 20  nxDiv, sz);.    
25dd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
25de0 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20   u8 *pTemp;.    
25df0 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
25e00 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  l<nMaxCells );. 
25e10 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43         szCell[nC
25e20 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20  ell] = sz;.     
25e30 20 20 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61     pTemp = &aSpa
25e40 63 65 5b 69 53 70 61 63 65 5d 3b 0a 20 20 20 20  ce[iSpace];.    
25e50 20 20 20 20 69 53 70 61 63 65 20 2b 3d 20 73 7a      iSpace += sz
25e60 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
25e70 28 20 69 53 70 61 63 65 3c 3d 70 42 74 2d 3e 70  ( iSpace<=pBt->p
25e80 61 67 65 53 69 7a 65 2a 35 20 29 3b 0a 20 20 20  ageSize*5 );.   
25e90 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d       memcpy(pTem
25ea0 70 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29  p, apDiv[i], sz)
25eb0 3b 0a 20 20 20 20 20 20 20 20 61 70 43 65 6c 6c  ;.        apCell
25ec0 5b 6e 43 65 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b  [nCell] = pTemp+
25ed0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a  leafCorrection;.
25ee0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
25ef0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
25f00 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e         if( pBt->
25f10 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
25f20 20 20 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43          aFrom[nC
25f30 65 6c 6c 5d 20 3d 20 30 78 46 46 3b 0a 20 20 20  ell] = 0xFF;.   
25f40 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
25f50 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70        dropCell(p
25f60 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 73  Parent, nxDiv, s
25f70 7a 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65  z);.        szCe
25f80 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d 3d 20 6c 65 61  ll[nCell] -= lea
25f90 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20  fCorrection;.   
25fa0 20 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74       assert( get
25fb0 34 62 79 74 65 28 70 54 65 6d 70 29 3d 3d 70 67  4byte(pTemp)==pg
25fc0 6e 6f 4f 6c 64 5b 69 5d 20 29 3b 0a 20 20 20 20  noOld[i] );.    
25fd0 20 20 20 20 69 66 28 20 21 70 4f 6c 64 2d 3e 6c      if( !pOld->l
25fe0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
25ff0 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72   assert( leafCor
26000 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20  rection==0 );.  
26010 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
26020 69 67 68 74 20 70 6f 69 6e 74 65 72 20 6f 66 20  ight pointer of 
26030 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 70  the child page p
26040 4f 6c 64 20 62 65 63 6f 6d 65 73 20 74 68 65 20  Old becomes the 
26050 6c 65 66 74 0a 20 20 20 20 20 20 20 20 20 20 2a  left.          *
26060 2a 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65  * pointer of the
26070 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f   divider cell */
26080 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
26090 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c  y(apCell[nCell],
260a0 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61 5b 70 4f   &pOld->aData[pO
260b0 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ld->hdrOffset+8]
260c0 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 4);.        }e
260d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
260e0 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65  ssert( leafCorre
260f0 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20  ction==4 );.    
26100 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 43      }.        nC
26110 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  ell++;.      }. 
26120 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20     }.  }..  /*. 
26130 20 2a 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74   ** Figure out t
26140 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
26150 65 73 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c  es needed to hol
26160 64 20 61 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c  d all nCell cell
26170 73 2e 0a 20 20 2a 2a 20 53 74 6f 72 65 20 74 68  s..  ** Store th
26180 69 73 20 6e 75 6d 62 65 72 20 69 6e 20 22 6b 22  is number in "k"
26190 2e 20 20 41 6c 73 6f 20 63 6f 6d 70 75 74 65 20  .  Also compute 
261a0 73 7a 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73  szNew[] which is
261b0 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 2a 2a 20   the total.  ** 
261c0 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c  size of all cell
261d0 73 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 70 61  s on the i-th pa
261e0 67 65 20 61 6e 64 20 63 6e 74 4e 65 77 5b 5d 20  ge and cntNew[] 
261f0 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 64  which is the ind
26200 65 78 0a 20 20 2a 2a 20 69 6e 20 61 70 43 65 6c  ex.  ** in apCel
26210 6c 5b 5d 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  l[] of the cell 
26220 74 68 61 74 20 64 69 76 69 64 65 73 20 70 61 67  that divides pag
26230 65 20 69 20 66 72 6f 6d 20 70 61 67 65 20 69 2b  e i from page i+
26240 31 2e 20 20 0a 20 20 2a 2a 20 63 6e 74 4e 65 77  1.  .  ** cntNew
26250 5b 6b 5d 20 73 68 6f 75 6c 64 20 65 71 75 61 6c  [k] should equal
26260 20 6e 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a   nCell..  **.  *
26270 2a 20 56 61 6c 75 65 73 20 63 6f 6d 70 75 74 65  * Values compute
26280 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 3a  d by this block:
26290 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
262a0 20 20 20 20 20 6b 3a 20 54 68 65 20 74 6f 74 61       k: The tota
262b0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c  l number of sibl
262c0 69 6e 67 20 70 61 67 65 73 0a 20 20 2a 2a 20 20  ing pages.  **  
262d0 20 20 73 7a 4e 65 77 5b 69 5d 3a 20 53 70 61 63    szNew[i]: Spac
262e0 65 64 20 75 73 65 64 20 6f 6e 20 74 68 65 20 69  ed used on the i
262f0 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65  -th sibling page
26300 2e 0a 20 20 2a 2a 20 20 20 63 6e 74 4e 65 77 5b  ..  **   cntNew[
26310 69 5d 3a 20 49 6e 64 65 78 20 69 6e 20 61 70 43  i]: Index in apC
26320 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c 6c  ell[] and szCell
26330 5b 5d 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  [] for the first
26340 20 63 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20 20   cell to.  **   
26350 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20 72             the r
26360 69 67 68 74 20 6f 66 20 74 68 65 20 69 2d 74 68  ight of the i-th
26370 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20   sibling page.. 
26380 20 2a 2a 20 75 73 61 62 6c 65 53 70 61 63 65 3a   ** usableSpace:
26390 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
263a0 20 6f 66 20 73 70 61 63 65 20 61 76 61 69 6c 61   of space availa
263b0 62 6c 65 20 6f 6e 20 65 61 63 68 20 73 69 62 6c  ble on each sibl
263c0 69 6e 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a  ing..  ** .  */.
263d0 20 20 75 73 61 62 6c 65 53 70 61 63 65 20 3d 20    usableSpace = 
263e0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
263f0 2d 20 31 32 20 2b 20 6c 65 61 66 43 6f 72 72 65  - 12 + leafCorre
26400 63 74 69 6f 6e 3b 0a 20 20 66 6f 72 28 73 75 62  ction;.  for(sub
26410 74 6f 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e  total=k=i=0; i<n
26420 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
26430 61 73 73 65 72 74 28 20 69 3c 6e 4d 61 78 43 65  assert( i<nMaxCe
26440 6c 6c 73 20 29 3b 0a 20 20 20 20 73 75 62 74 6f  lls );.    subto
26450 74 61 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d  tal += szCell[i]
26460 20 2b 20 32 3b 0a 20 20 20 20 69 66 28 20 73 75   + 2;.    if( su
26470 62 74 6f 74 61 6c 20 3e 20 75 73 61 62 6c 65 53  btotal > usableS
26480 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 73 7a  pace ){.      sz
26490 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61  New[k] = subtota
264a0 6c 20 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20  l - szCell[i];. 
264b0 20 20 20 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d       cntNew[k] =
264c0 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65   i;.      if( le
264d0 61 66 44 61 74 61 20 29 7b 20 69 2d 2d 3b 20 7d  afData ){ i--; }
264e0 0a 20 20 20 20 20 20 73 75 62 74 6f 74 61 6c 20  .      subtotal 
264f0 3d 20 30 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a  = 0;.      k++;.
26500 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65      }.  }.  szNe
26510 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 3b  w[k] = subtotal;
26520 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e  .  cntNew[k] = n
26530 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20  Cell;.  k++;..  
26540 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61 63 6b  /*.  ** The pack
26550 69 6e 67 20 63 6f 6d 70 75 74 65 64 20 62 79 20  ing computed by 
26560 74 68 65 20 70 72 65 76 69 6f 75 73 20 62 6c 6f  the previous blo
26570 63 6b 20 69 73 20 62 69 61 73 65 64 20 74 6f 77  ck is biased tow
26580 61 72 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73  ard the siblings
26590 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 66  .  ** on the lef
265a0 74 20 73 69 64 65 2e 20 20 54 68 65 20 6c 65 66  t side.  The lef
265b0 74 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 61  t siblings are a
265c0 6c 77 61 79 73 20 6e 65 61 72 6c 79 20 66 75 6c  lways nearly ful
265d0 6c 2c 20 77 68 69 6c 65 20 74 68 65 0a 20 20 2a  l, while the.  *
265e0 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62  * right-most sib
265f0 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20 6e 65  ling might be ne
26600 61 72 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69  arly empty.  Thi
26610 73 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20  s block of code 
26620 61 74 74 65 6d 70 74 73 0a 20 20 2a 2a 20 74 6f  attempts.  ** to
26630 20 61 64 6a 75 73 74 20 74 68 65 20 70 61 63 6b   adjust the pack
26640 69 6e 67 20 6f 66 20 73 69 62 6c 69 6e 67 73 20  ing of siblings 
26650 74 6f 20 67 65 74 20 61 20 62 65 74 74 65 72 20  to get a better 
26660 62 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20  balance..  **.  
26670 2a 2a 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65  ** This adjustme
26680 6e 74 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20  nt is more than 
26690 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  an optimization.
266a0 20 20 54 68 65 20 70 61 63 6b 69 6e 67 20 61 62    The packing ab
266b0 6f 76 65 20 6d 69 67 68 74 0a 20 20 2a 2a 20 62  ove might.  ** b
266c0 65 20 73 6f 20 6f 75 74 20 6f 66 20 62 61 6c 61  e so out of bala
266d0 6e 63 65 20 61 73 20 74 6f 20 62 65 20 69 6c 6c  nce as to be ill
266e0 65 67 61 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70  egal.  For examp
266f0 6c 65 2c 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  le, the right-mo
26700 73 74 0a 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20  st.  ** sibling 
26710 6d 69 67 68 74 20 62 65 20 63 6f 6d 70 6c 65 74  might be complet
26720 65 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73  ely empty.  This
26730 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6e   adjustment is n
26740 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a  ot optional..  *
26750 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d 31 3b 20 69  /.  for(i=k-1; i
26760 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e  >0; i--){.    in
26770 74 20 73 7a 52 69 67 68 74 20 3d 20 73 7a 4e 65  t szRight = szNe
26780 77 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a 65 20 6f  w[i];  /* Size o
26790 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65  f sibling on the
267a0 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 69 6e   right */.    in
267b0 74 20 73 7a 4c 65 66 74 20 3d 20 73 7a 4e 65 77  t szLeft = szNew
267c0 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f  [i-1]; /* Size o
267d0 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65  f sibling on the
267e0 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 69 6e 74   left */.    int
267f0 20 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   r;             
26800 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 69 67   /* Index of rig
26810 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 69 6e 20  ht-most cell in 
26820 6c 65 66 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a  left sibling */.
26830 20 20 20 20 69 6e 74 20 64 3b 20 20 20 20 20 20      int d;      
26840 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
26850 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 74   of first cell t
26860 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 72 69  o the left of ri
26870 67 68 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a  ght sibling */..
26880 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69      r = cntNew[i
26890 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 64 20 3d  -1] - 1;.    d =
268a0 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74   r + 1 - leafDat
268b0 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  a;.    assert( d
268c0 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
268d0 20 20 61 73 73 65 72 74 28 20 72 3c 6e 4d 61 78    assert( r<nMax
268e0 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 77 68 69  Cells );.    whi
268f0 6c 65 28 20 73 7a 52 69 67 68 74 3d 3d 30 20 7c  le( szRight==0 |
26900 7c 20 73 7a 52 69 67 68 74 2b 73 7a 43 65 6c 6c  | szRight+szCell
26910 5b 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28 73  [d]+2<=szLeft-(s
26920 7a 43 65 6c 6c 5b 72 5d 2b 32 29 20 29 7b 0a 20  zCell[r]+2) ){. 
26930 20 20 20 20 20 73 7a 52 69 67 68 74 20 2b 3d 20       szRight += 
26940 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20  szCell[d] + 2;. 
26950 20 20 20 20 20 73 7a 4c 65 66 74 20 2d 3d 20 73       szLeft -= s
26960 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20  zCell[r] + 2;.  
26970 20 20 20 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d      cntNew[i-1]-
26980 2d 3b 0a 20 20 20 20 20 20 72 20 3d 20 63 6e 74  -;.      r = cnt
26990 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20  New[i-1] - 1;.  
269a0 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20      d = r + 1 - 
269b0 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20 7d 0a  leafData;.    }.
269c0 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 73      szNew[i] = s
269d0 7a 52 69 67 68 74 3b 0a 20 20 20 20 73 7a 4e 65  zRight;.    szNe
269e0 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65 66 74 3b  w[i-1] = szLeft;
269f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65  .  }..  /* Eithe
26a00 72 20 77 65 20 66 6f 75 6e 64 20 6f 6e 65 20 6f  r we found one o
26a10 72 20 6d 6f 72 65 20 63 65 6c 6c 73 20 28 63 6e  r more cells (cn
26a20 74 6e 65 77 5b 30 5d 29 3e 30 29 20 6f 72 20 77  tnew[0])>0) or w
26a30 65 20 61 72 65 20 74 68 65 0a 20 20 2a 2a 20 61  e are the.  ** a
26a40 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
26a50 67 65 2e 20 20 41 20 76 69 72 74 75 61 6c 20 72  ge.  A virtual r
26a60 6f 6f 74 20 70 61 67 65 20 69 73 20 77 68 65 6e  oot page is when
26a70 20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74 0a 20   the real root. 
26a80 20 2a 2a 20 70 61 67 65 20 69 73 20 70 61 67 65   ** page is page
26a90 20 31 20 61 6e 64 20 77 65 20 61 72 65 20 74 68   1 and we are th
26aa0 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 6f 66 20  e only child of 
26ab0 74 68 61 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  that page..  */.
26ac0 20 20 61 73 73 65 72 74 28 20 63 6e 74 4e 65 77    assert( cntNew
26ad0 5b 30 5d 3e 30 20 7c 7c 20 28 70 50 61 72 65 6e  [0]>0 || (pParen
26ae0 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50  t->pgno==1 && pP
26af0 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29  arent->nCell==0)
26b00 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41   );..  /*.  ** A
26b10 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77 20 70 61  llocate k new pa
26b20 67 65 73 2e 20 20 52 65 75 73 65 20 6f 6c 64 20  ges.  Reuse old 
26b30 70 61 67 65 73 20 77 68 65 72 65 20 70 6f 73 73  pages where poss
26b40 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  ible..  */.  ass
26b50 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ert( pPage->pgno
26b60 3e 31 20 29 3b 0a 20 20 70 61 67 65 46 6c 61 67  >1 );.  pageFlag
26b70 73 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  s = pPage->aData
26b80 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  [0];.  for(i=0; 
26b90 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d  i<k; i++){.    M
26ba0 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20  emPage *pNew;.  
26bb0 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a    if( i<nOld ){.
26bc0 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61 70 4e        pNew = apN
26bd0 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b 69 5d  ew[i] = apOld[i]
26be0 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b  ;.      pgnoNew[
26bf0 69 5d 20 3d 20 70 67 6e 6f 4f 6c 64 5b 69 5d 3b  i] = pgnoOld[i];
26c00 0a 20 20 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20  .      apOld[i] 
26c10 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
26c20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
26c30 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29  e(pNew->pDbPage)
26c40 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
26c50 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
26c60 65 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c 73 65  eanup;.    }else
26c70 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
26c80 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20  i>0 );.      rc 
26c90 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
26ca0 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20  age(pBt, &pNew, 
26cb0 26 70 67 6e 6f 4e 65 77 5b 69 5d 2c 20 70 67 6e  &pgnoNew[i], pgn
26cc0 6f 4e 65 77 5b 69 2d 31 5d 2c 20 30 29 3b 0a 20  oNew[i-1], 0);. 
26cd0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
26ce0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
26cf0 75 70 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b  up;.      apNew[
26d00 69 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d  i] = pNew;.    }
26d10 0a 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20  .    nNew++;.   
26d20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20   zeroPage(pNew, 
26d30 70 61 67 65 46 6c 61 67 73 29 3b 0a 20 20 7d 0a  pageFlags);.  }.
26d40 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f  .  /* Free any o
26d50 6c 64 20 70 61 67 65 73 20 74 68 61 74 20 77 65  ld pages that we
26d60 72 65 20 6e 6f 74 20 72 65 75 73 65 64 20 61 73  re not reused as
26d70 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f   new pages..  */
26d80 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 4f 6c 64  .  while( i<nOld
26d90 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 72 65   ){.    rc = fre
26da0 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b  ePage(apOld[i]);
26db0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
26dc0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
26dd0 75 70 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  up;.    releaseP
26de0 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20  age(apOld[i]);. 
26df0 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b     apOld[i] = 0;
26e00 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20  .    i++;.  }.. 
26e10 20 2f 2a 0a 20 20 2a 2a 20 50 75 74 20 74 68 65   /*.  ** Put the
26e20 20 6e 65 77 20 70 61 67 65 73 20 69 6e 20 61 63   new pages in ac
26e30 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20  cending order.  
26e40 54 68 69 73 20 68 65 6c 70 73 20 74 6f 0a 20 20  This helps to.  
26e50 2a 2a 20 6b 65 65 70 20 65 6e 74 72 69 65 73 20  ** keep entries 
26e60 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  in the disk file
26e70 20 69 6e 20 6f 72 64 65 72 20 73 6f 20 74 68 61   in order so tha
26e80 74 20 61 20 73 63 61 6e 0a 20 20 2a 2a 20 6f 66  t a scan.  ** of
26e90 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 61 20   the table is a 
26ea0 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f  linear scan thro
26eb0 75 67 68 20 74 68 65 20 66 69 6c 65 2e 20 20 54  ugh the file.  T
26ec0 68 61 74 0a 20 20 2a 2a 20 69 6e 20 74 75 72 6e  hat.  ** in turn
26ed0 20 68 65 6c 70 73 20 74 68 65 20 6f 70 65 72 61   helps the opera
26ee0 74 69 6e 67 20 73 79 73 74 65 6d 20 74 6f 20 64  ting system to d
26ef0 65 6c 69 76 65 72 20 70 61 67 65 73 0a 20 20 2a  eliver pages.  *
26f00 2a 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20  * from the disk 
26f10 6d 6f 72 65 20 72 61 70 69 64 6c 79 2e 0a 20 20  more rapidly..  
26f20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32  **.  ** An O(n^2
26f30 29 20 69 6e 73 65 72 74 69 6f 6e 20 73 6f 72 74  ) insertion sort
26f40 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 75 73   algorithm is us
26f50 65 64 2c 20 62 75 74 20 73 69 6e 63 65 0a 20 20  ed, but since.  
26f60 2a 2a 20 6e 20 69 73 20 6e 65 76 65 72 20 6d 6f  ** n is never mo
26f70 72 65 20 74 68 61 6e 20 4e 42 20 28 61 20 73 6d  re than NB (a sm
26f80 61 6c 6c 20 63 6f 6e 73 74 61 6e 74 29 2c 20 74  all constant), t
26f90 68 61 74 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20  hat should.  ** 
26fa0 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d  not be a problem
26fb0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e  ..  **.  ** When
26fc0 20 4e 42 3d 3d 33 2c 20 74 68 69 73 20 6f 6e 65   NB==3, this one
26fd0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 61   optimization ma
26fe0 6b 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  kes the database
26ff0 0a 20 20 2a 2a 20 61 62 6f 75 74 20 32 35 25 20  .  ** about 25% 
27000 66 61 73 74 65 72 20 66 6f 72 20 6c 61 72 67 65  faster for large
27010 20 69 6e 73 65 72 74 69 6f 6e 73 20 61 6e 64 20   insertions and 
27020 64 65 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  deletions..  */.
27030 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d 31    for(i=0; i<k-1
27040 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
27050 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e 65 77 5b 69  minV = pgnoNew[i
27060 5d 3b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 49 20  ];.    int minI 
27070 3d 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69  = i;.    for(j=i
27080 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20  +1; j<k; j++){. 
27090 20 20 20 20 20 69 66 28 20 70 67 6e 6f 4e 65 77       if( pgnoNew
270a0 5b 6a 5d 3c 28 75 6e 73 69 67 6e 65 64 29 6d 69  [j]<(unsigned)mi
270b0 6e 56 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 69  nV ){.        mi
270c0 6e 49 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  nI = j;.        
270d0 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e 65 77 5b 6a  minV = pgnoNew[j
270e0 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ];.      }.    }
270f0 0a 20 20 20 20 69 66 28 20 6d 69 6e 49 3e 69 20  .    if( minI>i 
27100 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 3b 0a  ){.      int t;.
27110 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
27120 54 3b 0a 20 20 20 20 20 20 74 20 3d 20 70 67 6e  T;.      t = pgn
27130 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 70  oNew[i];.      p
27140 54 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20  T = apNew[i];.  
27150 20 20 20 20 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d      pgnoNew[i] =
27160 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 3b 0a   pgnoNew[minI];.
27170 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d        apNew[i] =
27180 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20   apNew[minI];.  
27190 20 20 20 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49      pgnoNew[minI
271a0 5d 20 3d 20 74 3b 0a 20 20 20 20 20 20 61 70 4e  ] = t;.      apN
271b0 65 77 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a 20  ew[minI] = pT;. 
271c0 20 20 20 7d 0a 20 20 7d 0a 20 20 54 52 41 43 45     }.  }.  TRACE
271d0 28 28 22 42 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a  (("BALANCE: old:
271e0 20 25 64 20 25 64 20 25 64 20 20 6e 65 77 3a 20   %d %d %d  new: 
271f0 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64  %d(%d) %d(%d) %d
27200 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25  (%d) %d(%d) %d(%
27210 64 29 5c 6e 22 2c 0a 20 20 20 20 70 67 6e 6f 4f  d)\n",.    pgnoO
27220 6c 64 5b 30 5d 2c 20 0a 20 20 20 20 6e 4f 6c 64  ld[0], .    nOld
27230 3e 3d 32 20 3f 20 70 67 6e 6f 4f 6c 64 5b 31 5d  >=2 ? pgnoOld[1]
27240 20 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d   : 0,.    nOld>=
27250 33 20 3f 20 70 67 6e 6f 4f 6c 64 5b 32 5d 20 3a  3 ? pgnoOld[2] :
27260 20 30 2c 0a 20 20 20 20 70 67 6e 6f 4e 65 77 5b   0,.    pgnoNew[
27270 30 5d 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20  0], szNew[0],.  
27280 20 20 6e 4e 65 77 3e 3d 32 20 3f 20 70 67 6e 6f    nNew>=2 ? pgno
27290 4e 65 77 5b 31 5d 20 3a 20 30 2c 20 6e 4e 65 77  New[1] : 0, nNew
272a0 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a  >=2 ? szNew[1] :
272b0 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 33 20   0,.    nNew>=3 
272c0 3f 20 70 67 6e 6f 4e 65 77 5b 32 5d 20 3a 20 30  ? pgnoNew[2] : 0
272d0 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e 65  , nNew>=3 ? szNe
272e0 77 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e  w[2] : 0,.    nN
272f0 65 77 3e 3d 34 20 3f 20 70 67 6e 6f 4e 65 77 5b  ew>=4 ? pgnoNew[
27300 33 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34 20  3] : 0, nNew>=4 
27310 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a  ? szNew[3] : 0,.
27320 20 20 20 20 6e 4e 65 77 3e 3d 35 20 3f 20 70 67      nNew>=5 ? pg
27330 6e 6f 4e 65 77 5b 34 5d 20 3a 20 30 2c 20 6e 4e  noNew[4] : 0, nN
27340 65 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b 34 5d  ew>=5 ? szNew[4]
27350 20 3a 20 30 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20   : 0));..  /*.  
27360 2a 2a 20 45 76 65 6e 6c 79 20 64 69 73 74 72 69  ** Evenly distri
27370 62 75 74 65 20 74 68 65 20 64 61 74 61 20 69 6e  bute the data in
27380 20 61 70 43 65 6c 6c 5b 5d 20 61 63 72 6f 73 73   apCell[] across
27390 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 2e 0a   the new pages..
273a0 20 20 2a 2a 20 49 6e 73 65 72 74 20 64 69 76 69    ** Insert divi
273b0 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 70  der cells into p
273c0 50 61 72 65 6e 74 20 61 73 20 6e 65 63 65 73 73  Parent as necess
273d0 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20  ary..  */.  j = 
273e0 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
273f0 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nNew; i++){.    
27400 2f 2a 20 41 73 73 65 6d 62 6c 65 20 74 68 65 20  /* Assemble the 
27410 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65  new sibling page
27420 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65  . */.    MemPage
27430 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69   *pNew = apNew[i
27440 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  ];.    assert( j
27450 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
27460 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
27470 70 67 6e 6f 3d 3d 70 67 6e 6f 4e 65 77 5b 69 5d  pgno==pgnoNew[i]
27480 20 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c 65   );.    assemble
27490 50 61 67 65 28 70 4e 65 77 2c 20 63 6e 74 4e 65  Page(pNew, cntNe
274a0 77 5b 69 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b  w[i]-j, &apCell[
274b0 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b  j], &szCell[j]);
274c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
274d0 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e  w->nCell>0 || (n
274e0 4e 65 77 3d 3d 31 20 26 26 20 63 6e 74 4e 65 77  New==1 && cntNew
274f0 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61  [0]==0) );.    a
27500 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 76  ssert( pNew->nOv
27510 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 23 69  erflow==0 );..#i
27520 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
27530 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
27540 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
27550 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
27560 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74  tabase, update t
27570 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
27580 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 74 68  ntries.    ** th
27590 61 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  at point to the 
275a0 73 69 62 6c 69 6e 67 73 20 74 68 61 74 20 77 65  siblings that we
275b0 72 65 20 72 65 61 72 72 61 6e 67 65 64 2e 20 54  re rearranged. T
275c0 68 65 73 65 20 63 61 6e 20 62 65 3a 20 6c 65 66  hese can be: lef
275d0 74 0a 20 20 20 20 2a 2a 20 63 68 69 6c 64 72 65  t.    ** childre
275e0 6e 20 6f 66 20 63 65 6c 6c 73 2c 20 74 68 65 20  n of cells, the 
275f0 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 74  right-child of t
27600 68 65 20 70 61 67 65 2c 20 6f 72 20 6f 76 65 72  he page, or over
27610 66 6c 6f 77 20 70 61 67 65 73 0a 20 20 20 20 2a  flow pages.    *
27620 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  * pointed to by 
27630 63 65 6c 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  cells..    */.  
27640 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
27650 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 66  acuum ){.      f
27660 6f 72 28 6b 3d 6a 3b 20 6b 3c 63 6e 74 4e 65 77  or(k=j; k<cntNew
27670 5b 69 5d 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  [i]; k++){.     
27680 20 20 20 61 73 73 65 72 74 28 20 6b 3c 6e 4d 61     assert( k<nMa
27690 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20  xCells );.      
276a0 20 20 69 66 28 20 61 46 72 6f 6d 5b 6b 5d 3d 3d    if( aFrom[k]==
276b0 30 78 46 46 20 7c 7c 20 61 70 43 6f 70 79 5b 61  0xFF || apCopy[a
276c0 46 72 6f 6d 5b 6b 5d 5d 2d 3e 70 67 6e 6f 21 3d  From[k]]->pgno!=
276d0 70 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20  pNew->pgno ){.  
276e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72          rc = ptr
276f0 6d 61 70 50 75 74 4f 76 66 6c 28 70 4e 65 77 2c  mapPutOvfl(pNew,
27700 20 6b 2d 6a 29 3b 0a 20 20 20 20 20 20 20 20 20   k-j);.         
27710 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
27720 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
27730 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
27740 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20  leanup;.        
27750 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
27760 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
27770 69 66 0a 0a 20 20 20 20 6a 20 3d 20 63 6e 74 4e  if..    j = cntN
27780 65 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49  ew[i];..    /* I
27790 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61  f the sibling pa
277a0 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f  ge assembled abo
277b0 76 65 20 77 61 73 20 6e 6f 74 20 74 68 65 20 72  ve was not the r
277c0 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e  ight-most siblin
277d0 67 2c 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74  g,.    ** insert
277e0 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20   a divider cell 
277f0 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  into the parent 
27800 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
27810 20 69 66 28 20 69 3c 6e 4e 65 77 2d 31 20 26 26   if( i<nNew-1 &&
27820 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20   j<nCell ){.    
27830 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20    u8 *pCell;.   
27840 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20     u8 *pTemp;.  
27850 20 20 20 20 69 6e 74 20 73 7a 3b 0a 0a 20 20 20      int sz;..   
27860 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61     assert( j<nMa
27870 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20  xCells );.      
27880 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a  pCell = apCell[j
27890 5d 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 73 7a  ];.      sz = sz
278a0 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f  Cell[j] + leafCo
278b0 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20  rrection;.      
278c0 69 66 28 20 21 70 4e 65 77 2d 3e 6c 65 61 66 20  if( !pNew->leaf 
278d0 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
278e0 79 28 26 70 4e 65 77 2d 3e 61 44 61 74 61 5b 38  y(&pNew->aData[8
278f0 5d 2c 20 70 43 65 6c 6c 2c 20 34 29 3b 0a 20 20  ], pCell, 4);.  
27900 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 30 3b        pTemp = 0;
27910 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
27920 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 09 2f 2a   leafData ){../*
27930 20 49 66 20 74 68 65 20 74 72 65 65 20 69 73 20   If the tree is 
27940 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65  a leaf-data tree
27950 2c 20 61 6e 64 20 74 68 65 20 73 69 62 6c 69 6e  , and the siblin
27960 67 73 20 61 72 65 20 6c 65 61 76 65 73 2c 20 0a  gs are leaves, .
27970 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
27980 74 68 65 72 65 20 69 73 20 6e 6f 20 64 69 76 69  there is no divi
27990 64 65 72 20 63 65 6c 6c 20 69 6e 20 61 70 43 65  der cell in apCe
279a0 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c 20 74  ll[]. Instead, t
279b0 68 65 20 64 69 76 69 64 65 72 20 0a 20 20 20 20  he divider .    
279c0 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73      ** cell cons
279d0 69 73 74 73 20 6f 66 20 74 68 65 20 69 6e 74 65  ists of the inte
279e0 67 65 72 20 6b 65 79 20 66 6f 72 20 74 68 65 20  ger key for the 
279f0 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20  right-most cell 
27a00 6f 66 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  of .        ** t
27a10 68 65 20 73 69 62 6c 69 6e 67 2d 70 61 67 65 20  he sibling-page 
27a20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20  assembled above 
27a30 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f  only..        */
27a40 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  .        CellInf
27a50 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  o info;.        
27a60 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 70 61 72  j--;.        par
27a70 73 65 43 65 6c 6c 50 74 72 28 70 4e 65 77 2c 20  seCellPtr(pNew, 
27a80 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f  apCell[j], &info
27a90 29 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  );.        pCell
27aa0 20 3d 20 26 61 53 70 61 63 65 5b 69 53 70 61 63   = &aSpace[iSpac
27ab0 65 5d 3b 0a 20 20 20 20 20 20 20 20 66 69 6c 6c  e];.        fill
27ac0 49 6e 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  InCell(pParent, 
27ad0 70 43 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e  pCell, 0, info.n
27ae0 4b 65 79 2c 20 30 2c 20 30 2c 20 26 73 7a 29 3b  Key, 0, 0, &sz);
27af0 0a 20 20 20 20 20 20 20 20 69 53 70 61 63 65 20  .        iSpace 
27b00 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 61  += sz;.        a
27b10 73 73 65 72 74 28 20 69 53 70 61 63 65 3c 3d 70  ssert( iSpace<=p
27b20 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 35 20 29  Bt->pageSize*5 )
27b30 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70 20  ;.        pTemp 
27b40 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
27b50 7b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20  {.        pCell 
27b60 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 70 54  -= 4;.        pT
27b70 65 6d 70 20 3d 20 26 61 53 70 61 63 65 5b 69 53  emp = &aSpace[iS
27b80 70 61 63 65 5d 3b 0a 20 20 20 20 20 20 20 20 69  pace];.        i
27b90 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20  Space += sz;.   
27ba0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53 70       assert( iSp
27bb0 61 63 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69  ace<=pBt->pageSi
27bc0 7a 65 2a 35 20 29 3b 0a 20 20 20 20 20 20 7d 0a  ze*5 );.      }.
27bd0 20 20 20 20 20 20 72 63 20 3d 20 69 6e 73 65 72        rc = inser
27be0 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e  tCell(pParent, n
27bf0 78 44 69 76 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c  xDiv, pCell, sz,
27c00 20 70 54 65 6d 70 2c 20 34 29 3b 0a 20 20 20 20   pTemp, 4);.    
27c10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
27c20 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e  _OK ) goto balan
27c30 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
27c40 20 20 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f    put4byte(findO
27c50 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72  verflowCell(pPar
27c60 65 6e 74 2c 6e 78 44 69 76 29 2c 20 70 4e 65 77  ent,nxDiv), pNew
27c70 2d 3e 70 67 6e 6f 29 3b 0a 23 69 66 6e 64 65 66  ->pgno);.#ifndef
27c80 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
27c90 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a  OVACUUM.      /*
27ca0 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61   If this is an a
27cb0 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
27cc0 61 73 65 2c 20 61 6e 64 20 6e 6f 74 20 61 20 6c  ase, and not a l
27cd0 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c 0a 20  eaf-data tree,. 
27ce0 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 75 70 64       ** then upd
27cf0 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ate the pointer 
27d00 6d 61 70 20 77 69 74 68 20 61 6e 20 65 6e 74 72  map with an entr
27d10 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  y for the overfl
27d20 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ow page.      **
27d30 20 74 68 61 74 20 74 68 65 20 63 65 6c 6c 20 6a   that the cell j
27d40 75 73 74 20 69 6e 73 65 72 74 65 64 20 70 6f 69  ust inserted poi
27d50 6e 74 73 20 74 6f 20 28 69 66 20 61 6e 79 29 2e  nts to (if any).
27d60 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
27d70 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
27d80 75 75 6d 20 26 26 20 21 6c 65 61 66 44 61 74 61  uum && !leafData
27d90 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
27da0 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70   ptrmapPutOvfl(p
27db0 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 29 3b 0a  Parent, nxDiv);.
27dc0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
27dd0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27de0 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61         goto bala
27df0 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
27e00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
27e10 65 6e 64 69 66 0a 20 20 20 20 20 20 6a 2b 2b 3b  endif.      j++;
27e20 0a 20 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a  .      nxDiv++;.
27e30 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
27e40 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a  rt( j==nCell );.
27e50 20 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30    assert( nOld>0
27e60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e   );.  assert( nN
27e70 65 77 3e 30 20 29 3b 0a 20 20 69 66 28 20 28 70  ew>0 );.  if( (p
27e80 61 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f 4c  ageFlags & PTF_L
27e90 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6d  EAF)==0 ){.    m
27ea0 65 6d 63 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65  emcpy(&apNew[nNe
27eb0 77 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20  w-1]->aData[8], 
27ec0 26 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d  &apCopy[nOld-1]-
27ed0 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b 0a 20  >aData[8], 4);. 
27ee0 20 7d 0a 20 20 69 66 28 20 6e 78 44 69 76 3d 3d   }.  if( nxDiv==
27ef0 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2b 70  pParent->nCell+p
27f00 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
27f10 77 20 29 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68  w ){.    /* Righ
27f20 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 69  t-most sibling i
27f30 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
27f40 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e   child of pParen
27f50 74 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74  t */.    put4byt
27f60 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
27f70 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
27f80 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77  fset+8], pgnoNew
27f90 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 65 6c  [nNew-1]);.  }el
27fa0 73 65 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68 74  se{.    /* Right
27fb0 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 69 73  -most sibling is
27fc0 20 74 68 65 20 6c 65 66 74 20 63 68 69 6c 64 20   the left child 
27fd0 6f 66 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  of the first ent
27fe0 72 79 20 69 6e 20 70 50 61 72 65 6e 74 0a 20 20  ry in pParent.  
27ff0 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 72 69    ** past the ri
28000 67 68 74 2d 6d 6f 73 74 20 64 69 76 69 64 65 72  ght-most divider
28010 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 70 75   entry */.    pu
28020 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66  t4byte(findOverf
28030 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  lowCell(pParent,
28040 20 6e 78 44 69 76 29 2c 20 70 67 6e 6f 4e 65 77   nxDiv), pgnoNew
28050 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 0a 0a  [nNew-1]);.  }..
28060 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 70 61 72 65    /*.  ** Repare
28070 6e 74 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 61  nt children of a
28080 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2f 0a 20  ll cells..  */. 
28090 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77   for(i=0; i<nNew
280a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d  ; i++){.    rc =
280b0 20 72 65 70 61 72 65 6e 74 43 68 69 6c 64 50 61   reparentChildPa
280c0 67 65 73 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20  ges(apNew[i]);. 
280d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
280e0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61  E_OK ) goto bala
280f0 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  nce_cleanup;.  }
28100 0a 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74  .  rc = reparent
28110 43 68 69 6c 64 50 61 67 65 73 28 70 50 61 72 65  ChildPages(pPare
28120 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  nt);.  if( rc!=S
28130 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
28140 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
28150 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 61 6c 61  ..  /*.  ** Bala
28160 6e 63 65 20 74 68 65 20 70 61 72 65 6e 74 20 70  nce the parent p
28170 61 67 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  age.  Note that 
28180 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
28190 20 28 70 50 61 67 65 29 20 6d 69 67 68 74 0a 20   (pPage) might. 
281a0 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 61 64   ** have been ad
281b0 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ded to the freel
281c0 69 73 74 20 73 6f 20 69 74 20 6d 69 67 68 74 20  ist so it might 
281d0 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 69 6e 69  no longer be ini
281e0 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 42  tialized..  ** B
281f0 75 74 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  ut the parent pa
28200 67 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  ge will always b
28210 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20  e initialized.. 
28220 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
28230 61 72 65 6e 74 2d 3e 69 73 49 6e 69 74 20 29 3b  arent->isInit );
28240 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28  .  rc = balance(
28250 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a 20 20 0a  pParent, 0);.  .
28260 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75    /*.  ** Cleanu
28270 70 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  p before returni
28280 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65  ng..  */.balance
28290 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69  _cleanup:.  sqli
282a0 74 65 46 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a  teFree(apCell);.
282b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c    for(i=0; i<nOl
282c0 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c  d; i++){.    rel
282d0 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69  easePage(apOld[i
282e0 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  ]);.  }.  for(i=
282f0 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b  0; i<nNew; i++){
28300 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
28310 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 7d 0a  (apNew[i]);.  }.
28320 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
28330 61 72 65 6e 74 29 3b 0a 20 20 54 52 41 43 45 28  arent);.  TRACE(
28340 28 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e 69 73  ("BALANCE: finis
28350 68 65 64 20 77 69 74 68 20 25 64 3a 20 6f 6c 64  hed with %d: old
28360 3d 25 64 20 6e 65 77 3d 25 64 20 63 65 6c 6c 73  =%d new=%d cells
28370 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
28380 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 6e    pPage->pgno, n
28390 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c  Old, nNew, nCell
283a0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
283b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
283c0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
283d0 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 70 61   for the root pa
283e0 67 65 20 6f 66 20 61 20 62 74 72 65 65 20 77 68  ge of a btree wh
283f0 65 6e 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70  en the root.** p
28400 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  age contains no 
28410 63 65 6c 6c 73 2e 20 20 54 68 69 73 20 69 73 20  cells.  This is 
28420 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74  an opportunity t
28430 6f 20 6d 61 6b 65 20 74 68 65 20 74 72 65 65 0a  o make the tree.
28440 2a 2a 20 73 68 61 6c 6c 6f 77 65 72 20 62 79 20  ** shallower by 
28450 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  one level..*/.st
28460 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
28470 5f 73 68 61 6c 6c 6f 77 65 72 28 4d 65 6d 50 61  _shallower(MemPa
28480 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 4d 65  ge *pPage){.  Me
28490 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 3b 20 20  mPage *pChild;  
284a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
284b0 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 70 61 67  e only child pag
284c0 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 20 20  e of pPage */.  
284d0 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b 20  Pgno pgnoChild; 
284e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
284f0 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  Page number for 
28500 70 43 68 69 6c 64 20 2a 2f 0a 20 20 69 6e 74 20  pChild */.  int 
28510 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
28520 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
28530 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
28540 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20  procedures */.  
28550 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
28560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28570 2f 2a 20 54 68 65 20 6d 61 69 6e 20 42 54 72 65  /* The main BTre
28580 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  e structure */. 
28590 20 69 6e 74 20 6d 78 43 65 6c 6c 50 65 72 50 61   int mxCellPerPa
285a0 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ge;           /*
285b0 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   Maximum number 
285c0 6f 66 20 63 65 6c 6c 73 20 70 65 72 20 70 61 67  of cells per pag
285d0 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
285e0 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
285f0 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73      /* All cells
28600 20 66 72 6f 6d 20 70 61 67 65 73 20 62 65 69 6e   from pages bein
28610 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20  g balanced */.  
28620 69 6e 74 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20  int *szCell;    
28630 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28640 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c  Local size of al
28650 6c 20 63 65 6c 6c 73 20 2a 2f 0a 0a 20 20 61 73  l cells */..  as
28660 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 50 61  sert( pPage->pPa
28670 72 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73  rent==0 );.  ass
28680 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
28690 6c 3d 3d 30 20 29 3b 0a 20 20 70 42 74 20 3d 20  l==0 );.  pBt = 
286a0 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 6d 78  pPage->pBt;.  mx
286b0 43 65 6c 6c 50 65 72 50 61 67 65 20 3d 20 4d 58  CellPerPage = MX
286c0 5f 43 45 4c 4c 28 70 42 74 29 3b 0a 20 20 61 70  _CELL(pBt);.  ap
286d0 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Cell = sqliteMal
286e0 6c 6f 63 52 61 77 28 20 6d 78 43 65 6c 6c 50 65  locRaw( mxCellPe
286f0 72 50 61 67 65 2a 28 73 69 7a 65 6f 66 28 75 38  rPage*(sizeof(u8
28700 2a 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29 20  *)+sizeof(int)) 
28710 29 3b 0a 20 20 69 66 28 20 61 70 43 65 6c 6c 3d  );.  if( apCell=
28720 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
28730 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 73 7a 43 65  TE_NOMEM;.  szCe
28740 6c 6c 20 3d 20 28 69 6e 74 2a 29 26 61 70 43 65  ll = (int*)&apCe
28750 6c 6c 5b 6d 78 43 65 6c 6c 50 65 72 50 61 67 65  ll[mxCellPerPage
28760 5d 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  ];.  if( pPage->
28770 6c 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a 20 54  leaf ){.    /* T
28780 68 65 20 74 61 62 6c 65 20 69 73 20 63 6f 6d 70  he table is comp
28790 6c 65 74 65 6c 79 20 65 6d 70 74 79 20 2a 2f 0a  letely empty */.
287a0 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c 41      TRACE(("BALA
287b0 4e 43 45 3a 20 65 6d 70 74 79 20 74 61 62 6c 65  NCE: empty table
287c0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70   %d\n", pPage->p
287d0 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  gno));.  }else{.
287e0 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20      /* The root 
287f0 70 61 67 65 20 69 73 20 65 6d 70 74 79 20 62 75  page is empty bu
28800 74 20 68 61 73 20 6f 6e 65 20 63 68 69 6c 64 2e  t has one child.
28810 20 20 54 72 61 6e 73 66 65 72 20 74 68 65 0a 20    Transfer the. 
28820 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f     ** informatio
28830 6e 20 66 72 6f 6d 20 74 68 61 74 20 6f 6e 65 20  n from that one 
28840 63 68 69 6c 64 20 69 6e 74 6f 20 74 68 65 20 72  child into the r
28850 6f 6f 74 20 70 61 67 65 20 69 66 20 69 74 20 0a  oot page if it .
28860 20 20 20 20 2a 2a 20 77 69 6c 6c 20 66 69 74 2e      ** will fit.
28870 20 20 54 68 69 73 20 72 65 64 75 63 65 73 20 74    This reduces t
28880 68 65 20 64 65 70 74 68 20 6f 66 20 74 68 65 20  he depth of the 
28890 74 72 65 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20  tree by one..   
288a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
288b0 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 70  e root page is p
288c0 61 67 65 20 31 2c 20 69 74 20 68 61 73 20 6c 65  age 1, it has le
288d0 73 73 20 73 70 61 63 65 20 61 76 61 69 6c 61 62  ss space availab
288e0 6c 65 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 69  le than.    ** i
288f0 74 73 20 63 68 69 6c 64 20 28 64 75 65 20 74 6f  ts child (due to
28900 20 74 68 65 20 31 30 30 20 62 79 74 65 20 68 65   the 100 byte he
28910 61 64 65 72 20 74 68 61 74 20 6f 63 63 75 72 73  ader that occurs
28920 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
28930 67 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  g.    ** of the 
28940 64 61 74 61 62 61 73 65 20 66 6c 65 29 2c 20 73  database fle), s
28950 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 62  o it might not b
28960 65 20 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 61  e able to hold a
28970 6c 6c 20 6f 66 20 74 68 65 20 0a 20 20 20 20 2a  ll of the .    *
28980 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 75  * information cu
28990 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 65  rrently containe
289a0 64 20 69 6e 20 74 68 65 20 63 68 69 6c 64 2e 20  d in the child. 
289b0 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
289c0 0a 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68  .    ** case, th
289d0 65 6e 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 65  en do not do the
289e0 20 74 72 61 6e 73 66 65 72 2e 20 20 4c 65 61 76   transfer.  Leav
289f0 65 20 70 61 67 65 20 31 20 65 6d 70 74 79 20 65  e page 1 empty e
28a00 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72  xcept.    ** for
28a10 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e 74   the right-point
28a20 65 72 20 74 6f 20 74 68 65 20 63 68 69 6c 64 20  er to the child 
28a30 70 61 67 65 2e 20 20 54 68 65 20 63 68 69 6c 64  page.  The child
28a40 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a 20 20   page becomes.  
28a50 20 20 2a 2a 20 74 68 65 20 76 69 72 74 75 61 6c    ** the virtual
28a60 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 72 65   root of the tre
28a70 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 67  e..    */.    pg
28a80 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74 34 62 79  noChild = get4by
28a90 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
28aa0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
28ab0 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  t+8]);.    asser
28ac0 74 28 20 70 67 6e 6f 43 68 69 6c 64 3e 30 20 29  t( pgnoChild>0 )
28ad0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67  ;.    assert( pg
28ae0 6e 6f 43 68 69 6c 64 3c 3d 73 71 6c 69 74 65 33  noChild<=sqlite3
28af0 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
28b00 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65  Page->pBt->pPage
28b10 72 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 67  r) );.    rc = g
28b20 65 74 50 61 67 65 28 70 50 61 67 65 2d 3e 70 42  etPage(pPage->pB
28b30 74 2c 20 70 67 6e 6f 43 68 69 6c 64 2c 20 26 70  t, pgnoChild, &p
28b40 43 68 69 6c 64 2c 20 30 29 3b 0a 20 20 20 20 69  Child, 0);.    i
28b50 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64  f( rc ) goto end
28b60 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65  _shallow_balance
28b70 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
28b80 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20  >pgno==1 ){.    
28b90 20 20 72 63 20 3d 20 69 6e 69 74 50 61 67 65 28    rc = initPage(
28ba0 70 43 68 69 6c 64 2c 20 70 50 61 67 65 29 3b 0a  pChild, pPage);.
28bb0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
28bc0 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f  oto end_shallow_
28bd0 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20 20 20 61  balance;.      a
28be0 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e  ssert( pChild->n
28bf0 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
28c00 20 20 20 20 20 69 66 28 20 70 43 68 69 6c 64 2d       if( pChild-
28c10 3e 6e 46 72 65 65 3e 3d 31 30 30 20 29 7b 0a 20  >nFree>=100 ){. 
28c20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68         /* The ch
28c30 69 6c 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ild information 
28c40 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20  will fit on the 
28c50 72 6f 6f 74 20 70 61 67 65 2c 20 73 6f 20 64 6f  root page, so do
28c60 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
28c70 63 6f 70 79 20 2a 2f 0a 20 20 20 20 20 20 20 20  copy */.        
28c80 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 7a  int i;.        z
28c90 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70  eroPage(pPage, p
28ca0 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 29  Child->aData[0])
28cb0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
28cc0 30 3b 20 69 3c 70 43 68 69 6c 64 2d 3e 6e 43 65  0; i<pChild->nCe
28cd0 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
28ce0 20 20 20 20 61 70 43 65 6c 6c 5b 69 5d 20 3d 20      apCell[i] = 
28cf0 66 69 6e 64 43 65 6c 6c 28 70 43 68 69 6c 64 2c  findCell(pChild,
28d00 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a  i);.          sz
28d10 43 65 6c 6c 5b 69 5d 20 3d 20 63 65 6c 6c 53 69  Cell[i] = cellSi
28d20 7a 65 50 74 72 28 70 43 68 69 6c 64 2c 20 61 70  zePtr(pChild, ap
28d30 43 65 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  Cell[i]);.      
28d40 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
28d50 6d 62 6c 65 50 61 67 65 28 70 50 61 67 65 2c 20  mblePage(pPage, 
28d60 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 2c 20 61  pChild->nCell, a
28d70 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 29 3b 0a  pCell, szCell);.
28d80 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20          /* Copy 
28d90 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e 74 65  the right-pointe
28da0 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 74  r of the child t
28db0 6f 20 74 68 65 20 70 61 72 65 6e 74 2e 20 2a 2f  o the parent. */
28dc0 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
28dd0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
28de0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
28df0 2b 38 5d 2c 20 0a 20 20 20 20 20 20 20 20 20 20  +8], .          
28e00 20 20 67 65 74 34 62 79 74 65 28 26 70 43 68 69    get4byte(&pChi
28e10 6c 64 2d 3e 61 44 61 74 61 5b 70 43 68 69 6c 64  ld->aData[pChild
28e20 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29  ->hdrOffset+8]))
28e30 3b 0a 20 20 20 20 20 20 20 20 66 72 65 65 50 61  ;.        freePa
28e40 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20  ge(pChild);.    
28e50 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c 41      TRACE(("BALA
28e60 4e 43 45 3a 20 63 68 69 6c 64 20 25 64 20 74 72  NCE: child %d tr
28e70 61 6e 73 66 65 72 20 74 6f 20 70 61 67 65 20 31  ansfer to page 1
28e80 5c 6e 22 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e  \n", pChild->pgn
28e90 6f 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  o));.      }else
28ea0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
28eb0 20 63 68 69 6c 64 20 68 61 73 20 6d 6f 72 65 20   child has more 
28ec0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74  information that
28ed0 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65   will fit on the
28ee0 20 72 6f 6f 74 2e 0a 20 20 20 20 20 20 20 20 2a   root..        *
28ef0 2a 20 54 68 65 20 74 72 65 65 20 69 73 20 61 6c  * The tree is al
28f00 72 65 61 64 79 20 62 61 6c 61 6e 63 65 64 2e 20  ready balanced. 
28f10 20 44 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a   Do nothing. */.
28f20 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
28f30 42 41 4c 41 4e 43 45 3a 20 63 68 69 6c 64 20 25  BALANCE: child %
28f40 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f  d will not fit o
28f50 6e 20 70 61 67 65 20 31 5c 6e 22 2c 20 70 43 68  n page 1\n", pCh
28f60 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  ild->pgno));.   
28f70 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
28f80 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61        memcpy(pPa
28f90 67 65 2d 3e 61 44 61 74 61 2c 20 70 43 68 69 6c  ge->aData, pChil
28fa0 64 2d 3e 61 44 61 74 61 2c 20 70 50 61 67 65 2d  d->aData, pPage-
28fb0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
28fc0 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  );.      pPage->
28fd0 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20  isInit = 0;.    
28fe0 20 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74    pPage->pParent
28ff0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
29000 20 69 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c   initPage(pPage,
29010 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   0);.      asser
29020 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
29030 20 29 3b 0a 20 20 20 20 20 20 66 72 65 65 50 61   );.      freePa
29040 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20  ge(pChild);.    
29050 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
29060 45 3a 20 74 72 61 6e 73 66 65 72 20 63 68 69 6c  E: transfer chil
29070 64 20 25 64 20 69 6e 74 6f 20 72 6f 6f 74 20 25  d %d into root %
29080 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
29090 20 20 20 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f      pChild->pgno
290a0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b  , pPage->pgno));
290b0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
290c0 72 65 70 61 72 65 6e 74 43 68 69 6c 64 50 61 67  reparentChildPag
290d0 65 73 28 70 50 61 67 65 29 3b 0a 20 20 20 20 61  es(pPage);.    a
290e0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
290f0 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 23 69  verflow==0 );.#i
29100 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
29110 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
29120 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
29130 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 69 6e  cuum ){.      in
29140 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  t i;.      for(i
29150 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65  =0; i<pPage->nCe
29160 6c 6c 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  ll; i++){ .     
29170 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
29180 74 4f 76 66 6c 28 70 50 61 67 65 2c 20 69 29 3b  tOvfl(pPage, i);
29190 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
291a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
291b0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
291c0 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65  _shallow_balance
291d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
291e0 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
291f0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
29200 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e  ITE_OK ) goto en
29210 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63  d_shallow_balanc
29220 65 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  e;.    releasePa
29230 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 7d 0a  ge(pChild);.  }.
29240 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61  end_shallow_bala
29250 6e 63 65 3a 0a 20 20 73 71 6c 69 74 65 46 72 65  nce:.  sqliteFre
29260 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 72 65 74  e(apCell);.  ret
29270 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
29280 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
29290 69 73 20 6f 76 65 72 66 75 6c 6c 0a 2a 2a 0a 2a  is overfull.**.*
292a0 2a 20 57 68 65 6e 20 74 68 69 73 20 68 61 70 70  * When this happ
292b0 65 6e 73 2c 20 43 72 65 61 74 65 20 61 20 6e 65  ens, Create a ne
292c0 77 20 63 68 69 6c 64 20 70 61 67 65 20 61 6e 64  w child page and
292d0 20 63 6f 70 79 20 74 68 65 0a 2a 2a 20 63 6f 6e   copy the.** con
292e0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 72 6f 6f  tents of the roo
292f0 74 20 69 6e 74 6f 20 74 68 65 20 63 68 69 6c 64  t into the child
29300 2e 20 20 54 68 65 6e 20 6d 61 6b 65 20 74 68 65  .  Then make the
29310 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 61 6e   root.** page an
29320 20 65 6d 70 74 79 20 70 61 67 65 20 77 69 74 68   empty page with
29330 20 72 69 67 68 74 43 68 69 6c 64 20 70 6f 69 6e   rightChild poin
29340 74 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 0a  ting to the new.
29350 2a 2a 20 63 68 69 6c 64 2e 20 20 20 46 69 6e 61  ** child.   Fina
29360 6c 6c 79 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63  lly, call balanc
29370 65 5f 69 6e 74 65 72 6e 61 6c 28 29 20 6f 6e 20  e_internal() on 
29380 74 68 65 20 6e 65 77 20 63 68 69 6c 64 0a 2a 2a  the new child.**
29390 20 74 6f 20 63 61 75 73 65 20 69 74 20 74 6f 20   to cause it to 
293a0 73 70 6c 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  split..*/.static
293b0 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65 65   int balance_dee
293c0 70 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  per(MemPage *pPa
293d0 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  ge){.  int rc;  
293e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
293f0 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20  turn value from 
29400 73 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f  subprocedures */
29410 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 43 68 69  .  MemPage *pChi
29420 6c 64 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  ld;    /* Pointe
29430 72 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64  r to a new child
29440 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
29450 70 67 6e 6f 43 68 69 6c 64 3b 20 20 20 20 20 2f  pgnoChild;     /
29460 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
29470 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70   the new child p
29480 61 67 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  age */.  BtShare
29490 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20  d *pBt;         
294a0 2f 2a 20 54 68 65 20 42 54 72 65 65 20 2a 2f 0a  /* The BTree */.
294b0 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65    int usableSize
294c0 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 75  ;     /* Total u
294d0 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 61 20  sable size of a 
294e0 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 64 61  page */.  u8 *da
294f0 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ta;           /*
29500 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   Content of the 
29510 70 61 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20  parent page */. 
29520 20 75 38 20 2a 63 64 61 74 61 3b 20 20 20 20 20   u8 *cdata;     
29530 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20       /* Content 
29540 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  of the child pag
29550 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20  e */.  int hdr; 
29560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
29570 66 73 65 74 20 74 6f 20 70 61 67 65 20 68 65 61  fset to page hea
29580 64 65 72 20 69 6e 20 70 61 72 65 6e 74 20 2a 2f  der in parent */
29590 0a 20 20 69 6e 74 20 62 72 6b 3b 20 20 20 20 20  .  int brk;     
295a0 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
295b0 20 74 6f 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66   to content of f
295c0 69 72 73 74 20 63 65 6c 6c 20 69 6e 20 70 61 72  irst cell in par
295d0 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ent */..  assert
295e0 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  ( pPage->pParent
295f0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
29600 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
29610 77 3e 30 20 29 3b 0a 20 20 70 42 74 20 3d 20 70  w>0 );.  pBt = p
29620 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 72 63 20  Page->pBt;.  rc 
29630 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
29640 61 67 65 28 70 42 74 2c 20 26 70 43 68 69 6c 64  age(pBt, &pChild
29650 2c 20 26 70 67 6e 6f 43 68 69 6c 64 2c 20 70 50  , &pgnoChild, pP
29660 61 67 65 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20  age->pgno, 0);. 
29670 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
29680 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73   rc;.  assert( s
29690 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
296a0 74 65 61 62 6c 65 28 70 43 68 69 6c 64 2d 3e 70  teable(pChild->p
296b0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 75 73 61  DbPage) );.  usa
296c0 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  bleSize = pBt->u
296d0 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 64 61 74  sableSize;.  dat
296e0 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
296f0 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
29700 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 62 72  >hdrOffset;.  br
29710 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  k = get2byte(&da
29720 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 63 64  ta[hdr+5]);.  cd
29730 61 74 61 20 3d 20 70 43 68 69 6c 64 2d 3e 61 44  ata = pChild->aD
29740 61 74 61 3b 0a 20 20 6d 65 6d 63 70 79 28 63 64  ata;.  memcpy(cd
29750 61 74 61 2c 20 26 64 61 74 61 5b 68 64 72 5d 2c  ata, &data[hdr],
29760 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
29770 65 74 2b 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c  et+2*pPage->nCel
29780 6c 2d 68 64 72 29 3b 0a 20 20 6d 65 6d 63 70 79  l-hdr);.  memcpy
29790 28 26 63 64 61 74 61 5b 62 72 6b 5d 2c 20 26 64  (&cdata[brk], &d
297a0 61 74 61 5b 62 72 6b 5d 2c 20 75 73 61 62 6c 65  ata[brk], usable
297b0 53 69 7a 65 2d 62 72 6b 29 3b 0a 20 20 61 73 73  Size-brk);.  ass
297c0 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 69 73 49  ert( pChild->isI
297d0 6e 69 74 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d  nit==0 );.  rc =
297e0 20 69 6e 69 74 50 61 67 65 28 70 43 68 69 6c 64   initPage(pChild
297f0 2c 20 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20  , pPage);.  if( 
29800 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
29810 65 64 65 65 70 65 72 5f 6f 75 74 3b 0a 20 20 6d  edeeper_out;.  m
29820 65 6d 63 70 79 28 70 43 68 69 6c 64 2d 3e 61 4f  emcpy(pChild->aO
29830 76 66 6c 2c 20 70 50 61 67 65 2d 3e 61 4f 76 66  vfl, pPage->aOvf
29840 6c 2c 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  l, pPage->nOverf
29850 6c 6f 77 2a 73 69 7a 65 6f 66 28 70 50 61 67 65  low*sizeof(pPage
29860 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 3b 0a 20 20  ->aOvfl[0]));.  
29870 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  pChild->nOverflo
29880 77 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  w = pPage->nOver
29890 66 6c 6f 77 3b 0a 20 20 69 66 28 20 70 43 68 69  flow;.  if( pChi
298a0 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b  ld->nOverflow ){
298b0 0a 20 20 20 20 70 43 68 69 6c 64 2d 3e 6e 46 72  .    pChild->nFr
298c0 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73  ee = 0;.  }.  as
298d0 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e 43  sert( pChild->nC
298e0 65 6c 6c 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  ell==pPage->nCel
298f0 6c 20 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28  l );.  zeroPage(
29900 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e 61  pPage, pChild->a
29910 44 61 74 61 5b 30 5d 20 26 20 7e 50 54 46 5f 4c  Data[0] & ~PTF_L
29920 45 41 46 29 3b 0a 20 20 70 75 74 34 62 79 74 65  EAF);.  put4byte
29930 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
29940 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
29950 38 5d 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a  8], pgnoChild);.
29960 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
29970 45 3a 20 63 6f 70 79 20 72 6f 6f 74 20 25 64 20  E: copy root %d 
29980 69 6e 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61 67  into %d\n", pPag
29990 65 2d 3e 70 67 6e 6f 2c 20 70 43 68 69 6c 64 2d  e->pgno, pChild-
299a0 3e 70 67 6e 6f 29 29 3b 0a 23 69 66 6e 64 65 66  >pgno));.#ifndef
299b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
299c0 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20 70 42  OVACUUM.  if( pB
299d0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
299e0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
299f0 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
29a00 42 74 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f  Bt, pChild->pgno
29a10 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
29a20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
29a30 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
29a40 62 61 6c 61 6e 63 65 64 65 65 70 65 72 5f 6f 75  balancedeeper_ou
29a50 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  t;.    for(i=0; 
29a60 69 3c 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b  i<pChild->nCell;
29a70 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20   i++){.      rc 
29a80 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28  = ptrmapPutOvfl(
29a90 70 43 68 69 6c 64 2c 20 69 29 3b 0a 20 20 20 20  pChild, i);.    
29aa0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
29ab0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
29ac0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
29ad0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
29ae0 69 66 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e 63  if.  rc = balanc
29af0 65 5f 6e 6f 6e 72 6f 6f 74 28 70 43 68 69 6c 64  e_nonroot(pChild
29b00 29 3b 0a 0a 62 61 6c 61 6e 63 65 64 65 65 70 65  );..balancedeepe
29b10 72 5f 6f 75 74 3a 0a 20 20 72 65 6c 65 61 73 65  r_out:.  release
29b20 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20  Page(pChild);.  
29b30 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
29b40 0a 2a 2a 20 44 65 63 69 64 65 20 69 66 20 74 68  .** Decide if th
29b50 65 20 70 61 67 65 20 70 50 61 67 65 20 6e 65 65  e page pPage nee
29b60 64 73 20 74 6f 20 62 65 20 62 61 6c 61 6e 63 65  ds to be balance
29b70 64 2e 20 20 49 66 20 62 61 6c 61 6e 63 69 6e 67  d.  If balancing
29b80 20 69 73 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c   is.** required,
29b90 20 63 61 6c 6c 20 74 68 65 20 61 70 70 72 6f 70   call the approp
29ba0 72 69 61 74 65 20 62 61 6c 61 6e 63 69 6e 67 20  riate balancing 
29bb0 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74  routine..*/.stat
29bc0 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 28 4d  ic int balance(M
29bd0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
29be0 6e 74 20 69 6e 73 65 72 74 29 7b 0a 20 20 69 6e  nt insert){.  in
29bf0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
29c00 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70  ;.  if( pPage->p
29c10 50 61 72 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20  Parent==0 ){.   
29c20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65   if( pPage->nOve
29c30 72 66 6c 6f 77 3e 30 20 29 7b 0a 20 20 20 20 20  rflow>0 ){.     
29c40 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 64 65   rc = balance_de
29c50 65 70 65 72 28 70 50 61 67 65 29 3b 0a 20 20 20  eper(pPage);.   
29c60 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
29c70 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
29c80 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20  e->nCell==0 ){. 
29c90 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63       rc = balanc
29ca0 65 5f 73 68 61 6c 6c 6f 77 65 72 28 70 50 61 67  e_shallower(pPag
29cb0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  e);.    }.  }els
29cc0 65 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  e{.    if( pPage
29cd0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c  ->nOverflow>0 ||
29ce0 20 0a 20 20 20 20 20 20 20 20 28 21 69 6e 73 65   .        (!inse
29cf0 72 74 20 26 26 20 70 50 61 67 65 2d 3e 6e 46 72  rt && pPage->nFr
29d00 65 65 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  ee>pPage->pBt->u
29d10 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 29 20 29  sableSize*2/3) )
29d20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c  {.      rc = bal
29d30 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 50 61  ance_nonroot(pPa
29d40 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ge);.    }.  }. 
29d50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
29d60 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
29d70 65 20 63 68 65 63 6b 73 20 61 6c 6c 20 63 75 72  e checks all cur
29d80 73 6f 72 73 20 74 68 61 74 20 70 6f 69 6e 74 20  sors that point 
29d90 74 6f 20 74 61 62 6c 65 20 70 67 6e 6f 52 6f 6f  to table pgnoRoo
29da0 74 2e 0a 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20  t..** If any of 
29db0 74 68 6f 73 65 20 63 75 72 73 6f 72 73 20 77 65  those cursors we
29dc0 72 65 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77  re opened with w
29dd0 72 46 6c 61 67 3d 3d 30 20 69 6e 20 61 20 64 69  rFlag==0 in a di
29de0 66 66 65 72 65 6e 74 0a 2a 2a 20 64 61 74 61 62  fferent.** datab
29df0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 28  ase connection (
29e00 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
29e10 63 74 69 6f 6e 20 74 68 61 74 20 73 68 61 72 65  ction that share
29e20 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 63  s the pager.** c
29e30 61 63 68 65 20 77 69 74 68 20 74 68 65 20 63 75  ache with the cu
29e40 72 72 65 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e  rrent connection
29e50 29 20 61 6e 64 20 74 68 61 74 20 6f 74 68 65 72  ) and that other
29e60 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20   connection .** 
29e70 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 65  is not in the Re
29e80 61 64 55 6e 63 6f 6d 6d 6d 69 74 74 65 64 20 73  adUncommmitted s
29e90 74 61 74 65 2c 20 74 68 65 6e 20 74 68 69 73 20  tate, then this 
29ea0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
29eb0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  .** SQLITE_LOCKE
29ec0 44 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 64 64 69  D..**.** In addi
29ed0 74 69 6f 6e 20 74 6f 20 63 68 65 63 6b 69 6e 67  tion to checking
29ee0 20 66 6f 72 20 72 65 61 64 2d 6c 6f 63 6b 73 20   for read-locks 
29ef0 28 77 68 65 72 65 20 61 20 72 65 61 64 2d 6c 6f  (where a read-lo
29f00 63 6b 20 0a 2a 2a 20 6d 65 61 6e 73 20 61 20 63  ck .** means a c
29f10 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 77 69 74  ursor opened wit
29f20 68 20 77 72 46 6c 61 67 3d 3d 30 29 20 74 68 69  h wrFlag==0) thi
29f30 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 6d  s routine also m
29f40 6f 76 65 73 0a 2a 2a 20 61 6c 6c 20 63 75 72 73  oves.** all curs
29f50 6f 72 73 20 77 72 69 74 65 20 63 75 72 73 6f 72  ors write cursor
29f60 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 61  s so that they a
29f70 72 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  re pointing to t
29f80 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 43 65 6c  he .** first Cel
29f90 6c 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 70 61  l on the root pa
29fa0 67 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63  ge.  This is nec
29fb0 65 73 73 61 72 79 20 62 65 63 61 75 73 65 20 61  essary because a
29fc0 6e 20 69 6e 73 65 72 74 20 0a 2a 2a 20 6f 72 20  n insert .** or 
29fd0 64 65 6c 65 74 65 20 6d 69 67 68 74 20 63 68 61  delete might cha
29fe0 6e 67 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  nge the number o
29ff0 66 20 63 65 6c 6c 73 20 6f 6e 20 61 20 70 61 67  f cells on a pag
2a000 65 20 6f 72 20 64 65 6c 65 74 65 0a 2a 2a 20 61  e or delete.** a
2a010 20 70 61 67 65 20 65 6e 74 69 72 65 6c 79 20 61   page entirely a
2a020 6e 64 20 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e  nd we do not wan
2a030 74 20 74 6f 20 6c 65 61 76 65 20 61 6e 79 20 63  t to leave any c
2a040 75 72 73 6f 72 73 20 0a 2a 2a 20 70 6f 69 6e 74  ursors .** point
2a050 69 6e 67 20 74 6f 20 6e 6f 6e 2d 65 78 69 73 74  ing to non-exist
2a060 61 6e 74 20 70 61 67 65 73 20 6f 72 20 63 65 6c  ant pages or cel
2a070 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
2a080 74 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73  t checkReadLocks
2a090 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20  (Btree *pBtree, 
2a0a0 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c 20 42  Pgno pgnoRoot, B
2a0b0 74 43 75 72 73 6f 72 20 2a 70 45 78 63 6c 75 64  tCursor *pExclud
2a0c0 65 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  e){.  BtCursor *
2a0d0 70 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  p;.  BtShared *p
2a0e0 42 74 20 3d 20 70 42 74 72 65 65 2d 3e 70 42 74  Bt = pBtree->pBt
2a0f0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
2a100 3d 20 70 42 74 72 65 65 2d 3e 70 53 71 6c 69 74  = pBtree->pSqlit
2a110 65 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e  e;.  for(p=pBt->
2a120 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
2a130 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
2a140 20 70 3d 3d 70 45 78 63 6c 75 64 65 20 29 20 63   p==pExclude ) c
2a150 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
2a160 20 70 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53   p->eState!=CURS
2a170 4f 52 5f 56 41 4c 49 44 20 29 20 63 6f 6e 74 69  OR_VALID ) conti
2a180 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  nue;.    if( p->
2a190 70 67 6e 6f 52 6f 6f 74 21 3d 70 67 6e 6f 52 6f  pgnoRoot!=pgnoRo
2a1a0 6f 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ot ) continue;. 
2a1b0 20 20 20 69 66 28 20 70 2d 3e 77 72 46 6c 61 67     if( p->wrFlag
2a1c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
2a1d0 69 74 65 33 20 2a 64 62 4f 74 68 65 72 20 3d 20  ite3 *dbOther = 
2a1e0 70 2d 3e 70 42 74 72 65 65 2d 3e 70 53 71 6c 69  p->pBtree->pSqli
2a1f0 74 65 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62  te;.      if( db
2a200 4f 74 68 65 72 3d 3d 30 20 7c 7c 0a 20 20 20 20  Other==0 ||.    
2a210 20 20 20 20 20 28 64 62 4f 74 68 65 72 21 3d 64       (dbOther!=d
2a220 62 20 26 26 20 28 64 62 4f 74 68 65 72 2d 3e 66  b && (dbOther->f
2a230 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
2a240 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 3d 3d  adUncommitted)==
2a250 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  0) ){.        re
2a260 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  turn SQLITE_LOCK
2a270 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ED;.      }.    
2a280 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 70 50 61  }else if( p->pPa
2a290 67 65 2d 3e 70 67 6e 6f 21 3d 70 2d 3e 70 67 6e  ge->pgno!=p->pgn
2a2a0 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20 6d  oRoot ){.      m
2a2b0 6f 76 65 54 6f 52 6f 6f 74 28 70 29 3b 0a 20 20  oveToRoot(p);.  
2a2c0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2a2d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
2a2e0 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65  *.** Insert a ne
2a2f0 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  w record into th
2a300 65 20 42 54 72 65 65 2e 20 20 54 68 65 20 6b 65  e BTree.  The ke
2a310 79 20 69 73 20 67 69 76 65 6e 20 62 79 20 28 70  y is given by (p
2a320 4b 65 79 2c 6e 4b 65 79 29 0a 2a 2a 20 61 6e 64  Key,nKey).** and
2a330 20 74 68 65 20 64 61 74 61 20 69 73 20 67 69 76   the data is giv
2a340 65 6e 20 62 79 20 28 70 44 61 74 61 2c 6e 44 61  en by (pData,nDa
2a350 74 61 29 2e 20 20 54 68 65 20 63 75 72 73 6f 72  ta).  The cursor
2a360 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f   is used only to
2a370 0a 2a 2a 20 64 65 66 69 6e 65 20 77 68 61 74 20  .** define what 
2a380 74 61 62 6c 65 20 74 68 65 20 72 65 63 6f 72 64  table the record
2a390 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72   should be inser
2a3a0 74 65 64 20 69 6e 74 6f 2e 20 20 54 68 65 20 63  ted into.  The c
2a3b0 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74  ursor.** is left
2a3c0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 72   pointing at a r
2a3d0 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a  andom location..
2a3e0 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 49 4e 54  **.** For an INT
2a3f0 4b 45 59 20 74 61 62 6c 65 2c 20 6f 6e 6c 79 20  KEY table, only 
2a400 74 68 65 20 6e 4b 65 79 20 76 61 6c 75 65 20 6f  the nKey value o
2a410 66 20 74 68 65 20 6b 65 79 20 69 73 20 75 73 65  f the key is use
2a420 64 2e 20 20 70 4b 65 79 20 69 73 0a 2a 2a 20 69  d.  pKey is.** i
2a430 67 6e 6f 72 65 64 2e 20 20 46 6f 72 20 61 20 5a  gnored.  For a Z
2a440 45 52 4f 44 41 54 41 20 74 61 62 6c 65 2c 20 74  ERODATA table, t
2a450 68 65 20 70 44 61 74 61 20 61 6e 64 20 6e 44 61  he pData and nDa
2a460 74 61 20 61 72 65 20 62 6f 74 68 20 69 67 6e 6f  ta are both igno
2a470 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  red..*/.int sqli
2a480 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 0a  te3BtreeInsert(.
2a490 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
2a4a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a4b0 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20   /* Insert data 
2a4c0 69 6e 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f  into the table o
2a4d0 66 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f  f this cursor */
2a4e0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
2a4f0 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20  Key, i64 nKey,  
2a500 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 6f 66 20    /* The key of 
2a510 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a  the new record *
2a520 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
2a530 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61  pData, int nData
2a540 2c 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 6f  ,  /* The data o
2a550 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64  f the new record
2a560 20 2a 2f 0a 20 20 69 6e 74 20 61 70 70 65 6e 64   */.  int append
2a570 42 69 61 73 20 20 20 20 20 20 20 20 20 20 20 20  Bias            
2a580 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2a590 74 68 69 73 20 69 73 20 6c 69 6b 65 6c 79 20 61  this is likely a
2a5a0 6e 20 61 70 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20  n append */.){. 
2a5b0 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c   int rc;.  int l
2a5c0 6f 63 3b 0a 20 20 69 6e 74 20 73 7a 4e 65 77 3b  oc;.  int szNew;
2a5d0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2a5e0 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e;.  BtShared *p
2a5f0 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65  Bt = pCur->pBtre
2a600 65 2d 3e 70 42 74 3b 0a 20 20 75 6e 73 69 67 6e  e->pBt;.  unsign
2a610 65 64 20 63 68 61 72 20 2a 6f 6c 64 43 65 6c 6c  ed char *oldCell
2a620 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
2a630 72 20 2a 6e 65 77 43 65 6c 6c 20 3d 20 30 3b 0a  r *newCell = 0;.
2a640 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72  .  if( pBt->inTr
2a650 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53  ansaction!=TRANS
2a660 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a  _WRITE ){.    /*
2a670 20 4d 75 73 74 20 73 74 61 72 74 20 61 20 74 72   Must start a tr
2a680 61 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65  ansaction before
2a690 20 64 6f 69 6e 67 20 61 6e 20 69 6e 73 65 72 74   doing an insert
2a6a0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 70   */.    return p
2a6b0 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53  Bt->readOnly ? S
2a6c0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a  QLITE_READONLY :
2a6d0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
2a6e0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 42   }.  assert( !pB
2a6f0 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20  t->readOnly );. 
2a700 20 69 66 28 20 21 70 43 75 72 2d 3e 77 72 46 6c   if( !pCur->wrFl
2a710 61 67 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ag ){.    return
2a720 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 20 20 20   SQLITE_PERM;   
2a730 2f 2a 20 43 75 72 73 6f 72 20 6e 6f 74 20 6f 70  /* Cursor not op
2a740 65 6e 20 66 6f 72 20 77 72 69 74 69 6e 67 20 2a  en for writing *
2a750 2f 0a 20 20 7d 0a 20 20 69 66 28 20 63 68 65 63  /.  }.  if( chec
2a760 6b 52 65 61 64 4c 6f 63 6b 73 28 70 43 75 72 2d  kReadLocks(pCur-
2a770 3e 70 42 74 72 65 65 2c 20 70 43 75 72 2d 3e 70  >pBtree, pCur->p
2a780 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 20 29  gnoRoot, pCur) )
2a790 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2a7a0 49 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54  ITE_LOCKED; /* T
2a7b0 68 65 20 74 61 62 6c 65 20 70 43 75 72 20 70 6f  he table pCur po
2a7c0 69 6e 74 73 20 74 6f 20 68 61 73 20 61 20 72 65  ints to has a re
2a7d0 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 0a  ad lock */.  }..
2a7e0 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20 70 6f    /* Save the po
2a7f0 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f  sitions of any o
2a800 74 68 65 72 20 63 75 72 73 6f 72 73 20 6f 70 65  ther cursors ope
2a810 6e 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 20  n on this table 
2a820 2a 2f 0a 20 20 63 6c 65 61 72 43 75 72 73 6f 72  */.  clearCursor
2a830 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
2a840 20 20 69 66 28 20 0a 20 20 20 20 53 51 4c 49 54    if( .    SQLIT
2a850 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76 65  E_OK!=(rc = save
2a860 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
2a870 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
2a880 70 43 75 72 29 29 20 7c 7c 0a 20 20 20 20 53 51  pCur)) ||.    SQ
2a890 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
2a8a0 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
2a8b0 6f 28 70 43 75 72 2c 20 70 4b 65 79 2c 20 6e 4b  o(pCur, pKey, nK
2a8c0 65 79 2c 20 61 70 70 65 6e 64 42 69 61 73 2c 20  ey, appendBias, 
2a8d0 26 6c 6f 63 29 29 0a 20 20 29 7b 0a 20 20 20 20  &loc)).  ){.    
2a8e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
2a8f0 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
2a900 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  pPage;.  assert(
2a910 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 7c   pPage->intKey |
2a920 7c 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61  | nKey>=0 );.  a
2a930 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
2a940 61 66 20 7c 7c 20 21 70 50 61 67 65 2d 3e 6c 65  af || !pPage->le
2a950 61 66 44 61 74 61 20 29 3b 0a 20 20 54 52 41 43  afData );.  TRAC
2a960 45 28 28 22 49 4e 53 45 52 54 3a 20 74 61 62 6c  E(("INSERT: tabl
2a970 65 3d 25 64 20 6e 6b 65 79 3d 25 6c 6c 64 20 6e  e=%d nkey=%lld n
2a980 64 61 74 61 3d 25 64 20 70 61 67 65 3d 25 64 20  data=%d page=%d 
2a990 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
2a9a0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
2a9b0 20 6e 4b 65 79 2c 20 6e 44 61 74 61 2c 20 70 50   nKey, nData, pP
2a9c0 61 67 65 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20  age->pgno,.     
2a9d0 20 20 20 20 20 6c 6f 63 3d 3d 30 20 3f 20 22 6f       loc==0 ? "o
2a9e0 76 65 72 77 72 69 74 65 22 20 3a 20 22 6e 65 77  verwrite" : "new
2a9f0 20 65 6e 74 72 79 22 29 29 3b 0a 20 20 61 73 73   entry"));.  ass
2aa00 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
2aa10 69 74 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  it );.  rc = sql
2aa20 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2aa30 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
2aa40 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2aa50 6e 20 72 63 3b 0a 20 20 6e 65 77 43 65 6c 6c 20  n rc;.  newCell 
2aa60 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
2aa70 77 28 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  w( MX_CELL_SIZE(
2aa80 70 42 74 29 20 29 3b 0a 20 20 69 66 28 20 6e 65  pBt) );.  if( ne
2aa90 77 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72  wCell==0 ) retur
2aaa0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
2aab0 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 43 65 6c    rc = fillInCel
2aac0 6c 28 70 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c  l(pPage, newCell
2aad0 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 44  , pKey, nKey, pD
2aae0 61 74 61 2c 20 6e 44 61 74 61 2c 20 26 73 7a 4e  ata, nData, &szN
2aaf0 65 77 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ew);.  if( rc ) 
2ab00 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b  goto end_insert;
2ab10 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77  .  assert( szNew
2ab20 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  ==cellSizePtr(pP
2ab30 61 67 65 2c 20 6e 65 77 43 65 6c 6c 29 20 29 3b  age, newCell) );
2ab40 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77  .  assert( szNew
2ab50 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  <=MX_CELL_SIZE(p
2ab60 42 74 29 20 29 3b 0a 20 20 69 66 28 20 6c 6f 63  Bt) );.  if( loc
2ab70 3d 3d 30 20 26 26 20 43 55 52 53 4f 52 5f 56 41  ==0 && CURSOR_VA
2ab80 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
2ab90 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 4f  e ){.    int szO
2aba0 6c 64 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ld;.    assert( 
2abb0 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20  pCur->idx>=0 && 
2abc0 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d  pCur->idx<pPage-
2abd0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 6f 6c  >nCell );.    ol
2abe0 64 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  dCell = findCell
2abf0 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64  (pPage, pCur->id
2ac00 78 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61  x);.    if( !pPa
2ac10 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2ac20 20 20 6d 65 6d 63 70 79 28 6e 65 77 43 65 6c 6c    memcpy(newCell
2ac30 2c 20 6f 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a 20  , oldCell, 4);. 
2ac40 20 20 20 7d 0a 20 20 20 20 73 7a 4f 6c 64 20 3d     }.    szOld =
2ac50 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
2ac60 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20  ge, oldCell);.  
2ac70 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c    rc = clearCell
2ac80 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29  (pPage, oldCell)
2ac90 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
2aca0 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a  oto end_insert;.
2acb0 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61      dropCell(pPa
2acc0 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 73  ge, pCur->idx, s
2acd0 7a 4f 6c 64 29 3b 0a 20 20 7d 65 6c 73 65 20 69  zOld);.  }else i
2ace0 66 28 20 6c 6f 63 3c 30 20 26 26 20 70 50 61 67  f( loc<0 && pPag
2acf0 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20  e->nCell>0 ){.  
2ad00 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2ad10 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20 70 43 75  >leaf );.    pCu
2ad20 72 2d 3e 69 64 78 2b 2b 3b 0a 20 20 20 20 70 43  r->idx++;.    pC
2ad30 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
2ad40 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
2ad50 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2ad60 6c 65 61 66 20 29 3b 0a 20 20 7d 0a 20 20 72 63  leaf );.  }.  rc
2ad70 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50   = insertCell(pP
2ad80 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20  age, pCur->idx, 
2ad90 6e 65 77 43 65 6c 6c 2c 20 73 7a 4e 65 77 2c 20  newCell, szNew, 
2ada0 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  0, 0);.  if( rc!
2adb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
2adc0 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20  o end_insert;.  
2add0 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61  rc = balance(pPa
2ade0 67 65 2c 20 31 29 3b 0a 20 20 2f 2a 20 73 71 6c  ge, 1);.  /* sql
2adf0 69 74 65 33 42 74 72 65 65 50 61 67 65 44 75 6d  ite3BtreePageDum
2ae00 70 28 70 43 75 72 2d 3e 70 42 74 2c 20 70 43 75  p(pCur->pBt, pCu
2ae10 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b  r->pgnoRoot, 1);
2ae20 20 2a 2f 0a 20 20 2f 2a 20 66 66 6c 75 73 68 28   */.  /* fflush(
2ae30 73 74 64 6f 75 74 29 3b 20 2a 2f 0a 20 20 69 66  stdout); */.  if
2ae40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2ae50 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f  ){.    moveToRoo
2ae60 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 65 6e 64  t(pCur);.  }.end
2ae70 5f 69 6e 73 65 72 74 3a 0a 20 20 73 71 6c 69 74  _insert:.  sqlit
2ae80 65 46 72 65 65 28 6e 65 77 43 65 6c 6c 29 3b 0a  eFree(newCell);.
2ae90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2aea0 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
2aeb0 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
2aec0 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
2aed0 6e 67 20 74 6f 2e 20 20 54 68 65 20 63 75 72 73  ng to.  The curs
2aee0 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f  or.** is left po
2aef0 69 6e 74 69 6e 67 20 61 74 20 61 20 72 61 6e 64  inting at a rand
2af00 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a  om location..*/.
2af10 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2af20 44 65 6c 65 74 65 28 42 74 43 75 72 73 6f 72 20  Delete(BtCursor 
2af30 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67  *pCur){.  MemPag
2af40 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
2af50 3e 70 50 61 67 65 3b 0a 20 20 75 6e 73 69 67 6e  >pPage;.  unsign
2af60 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a  ed char *pCell;.
2af70 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e 6f    int rc;.  Pgno
2af80 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 30 3b 0a   pgnoChild = 0;.
2af90 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2afa0 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  = pCur->pBtree->
2afb0 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pBt;..  assert( 
2afc0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
2afd0 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72  .  if( pBt->inTr
2afe0 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53  ansaction!=TRANS
2aff0 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a  _WRITE ){.    /*
2b000 20 4d 75 73 74 20 73 74 61 72 74 20 61 20 74 72   Must start a tr
2b010 61 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65  ansaction before
2b020 20 64 6f 69 6e 67 20 61 20 64 65 6c 65 74 65 20   doing a delete 
2b030 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42  */.    return pB
2b040 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51  t->readOnly ? SQ
2b050 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  LITE_READONLY : 
2b060 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
2b070 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74  }.  assert( !pBt
2b080 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20  ->readOnly );.  
2b090 69 66 28 20 70 43 75 72 2d 3e 69 64 78 20 3e 3d  if( pCur->idx >=
2b0a0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b   pPage->nCell ){
2b0b0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2b0c0 54 45 5f 45 52 52 4f 52 3b 20 20 2f 2a 20 54 68  TE_ERROR;  /* Th
2b0d0 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
2b0e0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 79 74  pointing to anyt
2b0f0 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  hing */.  }.  if
2b100 28 20 21 70 43 75 72 2d 3e 77 72 46 6c 61 67 20  ( !pCur->wrFlag 
2b110 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2b120 4c 49 54 45 5f 50 45 52 4d 3b 20 20 20 2f 2a 20  LITE_PERM;   /* 
2b130 44 69 64 20 6e 6f 74 20 6f 70 65 6e 20 74 68 69  Did not open thi
2b140 73 20 63 75 72 73 6f 72 20 66 6f 72 20 77 72 69  s cursor for wri
2b150 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  ting */.  }.  if
2b160 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73  ( checkReadLocks
2b170 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2c 20 70  (pCur->pBtree, p
2b180 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
2b190 43 75 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  Cur) ){.    retu
2b1a0 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2b1b0 3b 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 70  ; /* The table p
2b1c0 43 75 72 20 70 6f 69 6e 74 73 20 74 6f 20 68 61  Cur points to ha
2b1d0 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f  s a read lock */
2b1e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 6f  .  }..  /* Resto
2b1f0 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  re the current c
2b200 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 28  ursor position (
2b210 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 63  a no-op if the c
2b220 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e 20  ursor is not in 
2b230 0a 20 20 2a 2a 20 43 55 52 53 4f 52 5f 52 45 51  .  ** CURSOR_REQ
2b240 55 49 52 45 53 45 45 4b 20 73 74 61 74 65 29 20  UIRESEEK state) 
2b250 61 6e 64 20 73 61 76 65 20 74 68 65 20 70 6f 73  and save the pos
2b260 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74  itions of any ot
2b270 68 65 72 20 63 75 72 73 6f 72 73 20 0a 20 20 2a  her cursors .  *
2b280 2a 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61  * open on the sa
2b290 6d 65 20 74 61 62 6c 65 2e 20 54 68 65 6e 20 63  me table. Then c
2b2a0 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
2b2b0 57 72 69 74 65 28 29 20 6f 6e 20 74 68 65 20 70  Write() on the p
2b2c0 61 67 65 0a 20 20 2a 2a 20 74 68 61 74 20 74 68  age.  ** that th
2b2d0 65 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 20  e entry will be 
2b2e0 64 65 6c 65 74 65 64 20 66 72 6f 6d 2e 0a 20 20  deleted from..  
2b2f0 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20 20 28 72  */.  if( .    (r
2b300 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65  c = restoreOrCle
2b310 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  arCursorPosition
2b320 28 70 43 75 72 29 29 21 3d 30 20 7c 7c 0a 20 20  (pCur))!=0 ||.  
2b330 20 20 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43    (rc = saveAllC
2b340 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72  ursors(pBt, pCur
2b350 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72  ->pgnoRoot, pCur
2b360 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20 28 72 63  ))!=0 ||.    (rc
2b370 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2b380 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
2b390 61 67 65 29 29 21 3d 30 0a 20 20 29 7b 0a 20 20  age))!=0.  ){.  
2b3a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
2b3b0 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
2b3c0 65 20 63 65 6c 6c 20 77 69 74 68 69 6e 20 69 74  e cell within it
2b3d0 27 73 20 70 61 67 65 20 61 6e 64 20 6c 65 61 76  's page and leav
2b3e0 65 20 70 43 65 6c 6c 20 70 6f 69 6e 74 69 6e 67  e pCell pointing
2b3f0 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   to the.  ** dat
2b400 61 2e 20 54 68 65 20 63 6c 65 61 72 43 65 6c 6c  a. The clearCell
2b410 28 29 20 63 61 6c 6c 20 66 72 65 65 73 20 61 6e  () call frees an
2b420 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  y overflow pages
2b430 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2b440 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20   the.  ** cell. 
2b450 54 68 65 20 63 65 6c 6c 20 69 74 73 65 6c 66 20  The cell itself 
2b460 69 73 20 73 74 69 6c 6c 20 69 6e 74 61 63 74 2e  is still intact.
2b470 0a 20 20 2a 2f 0a 20 20 70 43 65 6c 6c 20 3d 20  .  */.  pCell = 
2b480 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
2b490 70 43 75 72 2d 3e 69 64 78 29 3b 0a 20 20 69 66  pCur->idx);.  if
2b4a0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
2b4b0 7b 0a 20 20 20 20 70 67 6e 6f 43 68 69 6c 64 20  {.    pgnoChild 
2b4c0 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  = get4byte(pCell
2b4d0 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 63 6c  );.  }.  rc = cl
2b4e0 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  earCell(pPage, p
2b4f0 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20 72 63 20  Cell);.  if( rc 
2b500 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
2b510 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
2b520 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
2b530 2a 20 54 68 65 20 65 6e 74 72 79 20 77 65 20 61  * The entry we a
2b540 72 65 20 61 62 6f 75 74 20 74 6f 20 64 65 6c 65  re about to dele
2b550 74 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66  te is not a leaf
2b560 20 73 6f 20 69 66 20 77 65 20 64 6f 20 6e 6f 74   so if we do not
2b570 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 6d 65 74  .    ** do somet
2b580 68 69 6e 67 20 77 65 20 77 69 6c 6c 20 6c 65 61  hing we will lea
2b590 76 65 20 61 20 68 6f 6c 65 20 6f 6e 20 61 6e 20  ve a hole on an 
2b5a0 69 6e 74 65 72 6e 61 6c 20 70 61 67 65 2e 0a 20  internal page.. 
2b5b0 20 20 20 2a 2a 20 57 65 20 68 61 76 65 20 74 6f     ** We have to
2b5c0 20 66 69 6c 6c 20 74 68 65 20 68 6f 6c 65 20 62   fill the hole b
2b5d0 79 20 6d 6f 76 69 6e 67 20 69 6e 20 61 20 63 65  y moving in a ce
2b5e0 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 2e 20  ll from a leaf. 
2b5f0 20 54 68 65 0a 20 20 20 20 2a 2a 20 6e 65 78 74   The.    ** next
2b600 20 43 65 6c 6c 20 61 66 74 65 72 20 74 68 65 20   Cell after the 
2b610 6f 6e 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65  one to be delete
2b620 64 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  d is guaranteed 
2b630 74 6f 20 65 78 69 73 74 20 61 6e 64 0a 20 20 20  to exist and.   
2b640 20 2a 2a 20 74 6f 20 62 65 20 61 20 6c 65 61 66   ** to be a leaf
2b650 20 73 6f 20 77 65 20 63 61 6e 20 75 73 65 20 69   so we can use i
2b660 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 42 74  t..    */.    Bt
2b670 43 75 72 73 6f 72 20 6c 65 61 66 43 75 72 3b 0a  Cursor leafCur;.
2b680 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
2b690 72 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 69 6e  r *pNext;.    in
2b6a0 74 20 73 7a 4e 65 78 74 3b 20 20 2f 2a 20 54 68  t szNext;  /* Th
2b6b0 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69  e compiler warni
2b6c0 6e 67 20 69 73 20 77 72 6f 6e 67 3a 20 73 7a 4e  ng is wrong: szN
2b6d0 65 78 74 20 69 73 20 61 6c 77 61 79 73 20 0a 20  ext is always . 
2b6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b6f0 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62  ** initialized b
2b700 65 66 6f 72 65 20 75 73 65 2e 20 20 41 64 64 69  efore use.  Addi
2b710 6e 67 20 61 6e 20 65 78 74 72 61 20 69 6e 69 74  ng an extra init
2b720 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20  ialization.     
2b730 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
2b740 6f 20 73 69 6c 65 6e 63 65 20 74 68 65 20 63 6f  o silence the co
2b750 6d 70 69 6c 65 72 20 73 6c 6f 77 73 20 64 6f 77  mpiler slows dow
2b760 6e 20 74 68 65 20 63 6f 64 65 2e 20 2a 2f 0a 20  n the code. */. 
2b770 20 20 20 69 6e 74 20 6e 6f 74 55 73 65 64 3b 0a     int notUsed;.
2b780 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
2b790 72 20 2a 74 65 6d 70 43 65 6c 6c 20 3d 20 30 3b  r *tempCell = 0;
2b7a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50  .    assert( !pP
2b7b0 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 29 3b  age->leafData );
2b7c0 0a 20 20 20 20 67 65 74 54 65 6d 70 43 75 72 73  .    getTempCurs
2b7d0 6f 72 28 70 43 75 72 2c 20 26 6c 65 61 66 43 75  or(pCur, &leafCu
2b7e0 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  r);.    rc = sql
2b7f0 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 26 6c  ite3BtreeNext(&l
2b800 65 61 66 43 75 72 2c 20 26 6e 6f 74 55 73 65 64  eafCur, &notUsed
2b810 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2b820 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b830 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2b840 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20  _NOMEM ){.      
2b850 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
2b860 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20  RRUPT_BKPT; .   
2b870 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
2b880 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2b890 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
2b8a0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2b8b0 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2d 3e  (leafCur.pPage->
2b8c0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  pDbPage);.    }.
2b8d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2b8e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54  TE_OK ){.      T
2b8f0 52 41 43 45 28 28 22 44 45 4c 45 54 45 3a 20 74  RACE(("DELETE: t
2b900 61 62 6c 65 3d 25 64 20 64 65 6c 65 74 65 20 69  able=%d delete i
2b910 6e 74 65 72 6e 61 6c 20 66 72 6f 6d 20 25 64 20  nternal from %d 
2b920 72 65 70 6c 61 63 65 20 66 72 6f 6d 20 6c 65 61  replace from lea
2b930 66 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  f %d\n",.       
2b940 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74    pCur->pgnoRoot
2b950 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 6c  , pPage->pgno, l
2b960 65 61 66 43 75 72 2e 70 50 61 67 65 2d 3e 70 67  eafCur.pPage->pg
2b970 6e 6f 29 29 3b 0a 20 20 20 20 20 20 64 72 6f 70  no));.      drop
2b980 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72  Cell(pPage, pCur
2b990 2d 3e 69 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50  ->idx, cellSizeP
2b9a0 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
2b9b0 29 3b 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d  );.      pNext =
2b9c0 20 66 69 6e 64 43 65 6c 6c 28 6c 65 61 66 43 75   findCell(leafCu
2b9d0 72 2e 70 50 61 67 65 2c 20 6c 65 61 66 43 75 72  r.pPage, leafCur
2b9e0 2e 69 64 78 29 3b 0a 20 20 20 20 20 20 73 7a 4e  .idx);.      szN
2b9f0 65 78 74 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ext = cellSizePt
2ba00 72 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2c  r(leafCur.pPage,
2ba10 20 70 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 61   pNext);.      a
2ba20 73 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c 5f 53  ssert( MX_CELL_S
2ba30 49 5a 45 28 70 42 74 29 3e 3d 73 7a 4e 65 78 74  IZE(pBt)>=szNext
2ba40 2b 34 20 29 3b 0a 20 20 20 20 20 20 74 65 6d 70  +4 );.      temp
2ba50 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Cell = sqliteMal
2ba60 6c 6f 63 52 61 77 28 20 4d 58 5f 43 45 4c 4c 5f  locRaw( MX_CELL_
2ba70 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 20  SIZE(pBt) );.   
2ba80 20 20 20 69 66 28 20 74 65 6d 70 43 65 6c 6c 3d     if( tempCell=
2ba90 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
2baa0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
2bab0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2bac0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2bad0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
2bae0 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50   = insertCell(pP
2baf0 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20  age, pCur->idx, 
2bb00 70 4e 65 78 74 2d 34 2c 20 73 7a 4e 65 78 74 2b  pNext-4, szNext+
2bb10 34 2c 20 74 65 6d 70 43 65 6c 6c 2c 20 30 29 3b  4, tempCell, 0);
2bb20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
2bb30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2bb40 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 66        put4byte(f
2bb50 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28  indOverflowCell(
2bb60 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78  pPage, pCur->idx
2bb70 29 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 20  ), pgnoChild);. 
2bb80 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63       rc = balanc
2bb90 65 28 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20  e(pPage, 0);.   
2bba0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
2bbb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2bbc0 20 20 64 72 6f 70 43 65 6c 6c 28 6c 65 61 66 43    dropCell(leafC
2bbd0 75 72 2e 70 50 61 67 65 2c 20 6c 65 61 66 43 75  ur.pPage, leafCu
2bbe0 72 2e 69 64 78 2c 20 73 7a 4e 65 78 74 29 3b 0a  r.idx, szNext);.
2bbf0 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e        rc = balan
2bc00 63 65 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65  ce(leafCur.pPage
2bc10 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
2bc20 73 71 6c 69 74 65 46 72 65 65 28 74 65 6d 70 43  sqliteFree(tempC
2bc30 65 6c 6c 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  ell);.    releas
2bc40 65 54 65 6d 70 43 75 72 73 6f 72 28 26 6c 65 61  eTempCursor(&lea
2bc50 66 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  fCur);.  }else{.
2bc60 20 20 20 20 54 52 41 43 45 28 28 22 44 45 4c 45      TRACE(("DELE
2bc70 54 45 3a 20 74 61 62 6c 65 3d 25 64 20 64 65 6c  TE: table=%d del
2bc80 65 74 65 20 66 72 6f 6d 20 6c 65 61 66 20 25 64  ete from leaf %d
2bc90 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 43 75 72  \n",.       pCur
2bca0 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67  ->pgnoRoot, pPag
2bcb0 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 64  e->pgno));.    d
2bcc0 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  ropCell(pPage, p
2bcd0 43 75 72 2d 3e 69 64 78 2c 20 63 65 6c 6c 53 69  Cur->idx, cellSi
2bce0 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  zePtr(pPage, pCe
2bcf0 6c 6c 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  ll));.    rc = b
2bd00 61 6c 61 6e 63 65 28 70 50 61 67 65 2c 20 30 29  alance(pPage, 0)
2bd10 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
2bd20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2bd30 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
2bd40 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2bd50 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  rc;.}../*.** Cre
2bd60 61 74 65 20 61 20 6e 65 77 20 42 54 72 65 65 20  ate a new BTree 
2bd70 74 61 62 6c 65 2e 20 20 57 72 69 74 65 20 69 6e  table.  Write in
2bd80 74 6f 20 2a 70 69 54 61 62 6c 65 20 74 68 65 20  to *piTable the 
2bd90 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66  page.** number f
2bda0 6f 72 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  or the root page
2bdb0 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
2bdc0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 79 70  e..**.** The typ
2bdd0 65 20 6f 66 20 74 79 70 65 20 69 73 20 64 65 74  e of type is det
2bde0 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 66  ermined by the f
2bdf0 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 2e 20  lags parameter. 
2be00 20 4f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 6f 6c   Only the.** fol
2be10 6c 6f 77 69 6e 67 20 76 61 6c 75 65 73 20 6f 66  lowing values of
2be20 20 66 6c 61 67 73 20 61 72 65 20 63 75 72 72 65   flags are curre
2be30 6e 74 6c 79 20 69 6e 20 75 73 65 2e 20 20 4f 74  ntly in use.  Ot
2be40 68 65 72 20 76 61 6c 75 65 73 20 66 6f 72 0a 2a  her values for.*
2be50 2a 20 66 6c 61 67 73 20 6d 69 67 68 74 20 6e 6f  * flags might no
2be60 74 20 77 6f 72 6b 3a 0a 2a 2a 0a 2a 2a 20 20 20  t work:.**.**   
2be70 20 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 7c 42    BTREE_INTKEY|B
2be80 54 52 45 45 5f 4c 45 41 46 44 41 54 41 20 20 20  TREE_LEAFDATA   
2be90 20 20 55 73 65 64 20 66 6f 72 20 53 51 4c 20 74    Used for SQL t
2bea0 61 62 6c 65 73 20 77 69 74 68 20 72 6f 77 69 64  ables with rowid
2beb0 20 6b 65 79 73 0a 2a 2a 20 20 20 20 20 42 54 52   keys.**     BTR
2bec0 45 45 5f 5a 45 52 4f 44 41 54 41 20 20 20 20 20  EE_ZERODATA     
2bed0 20 20 20 20 20 20 20 20 20 20 20 20 20 55 73 65               Use
2bee0 64 20 66 6f 72 20 53 51 4c 20 69 6e 64 69 63 65  d for SQL indice
2bef0 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  s.*/.int sqlite3
2bf00 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65  BtreeCreateTable
2bf10 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a  (Btree *p, int *
2bf20 70 69 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61  piTable, int fla
2bf30 67 73 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  gs){.  BtShared 
2bf40 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
2bf50 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b   MemPage *pRoot;
2bf60 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74  .  Pgno pgnoRoot
2bf70 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  ;.  int rc;.  if
2bf80 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
2bf90 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 57 52 49 54  tion!=TRANS_WRIT
2bfa0 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73 74  E ){.    /* Must
2bfb0 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63   start a transac
2bfc0 74 69 6f 6e 20 66 69 72 73 74 20 2a 2f 0a 20 20  tion first */.  
2bfd0 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 72 65    return pBt->re
2bfe0 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f  adOnly ? SQLITE_
2bff0 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54  READONLY : SQLIT
2c000 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61  E_ERROR;.  }.  a
2c010 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61  ssert( !pBt->rea
2c020 64 4f 6e 6c 79 20 29 3b 0a 0a 20 20 2f 2a 20 49  dOnly );..  /* I
2c030 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20  t is illegal to 
2c040 63 72 65 61 74 65 20 61 20 74 61 62 6c 65 20 69  create a table i
2c050 66 20 61 6e 79 20 63 75 72 73 6f 72 73 20 61 72  f any cursors ar
2c060 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 20 20  e open on the.  
2c070 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 69  ** database. Thi
2c080 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20  s is because in 
2c090 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65  auto-vacuum mode
2c0a0 20 74 68 65 20 62 61 63 6b 65 6e 64 20 6d 61 79   the backend may
2c0b0 0a 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 6d 6f  .  ** need to mo
2c0c0 76 65 20 61 20 64 61 74 61 62 61 73 65 20 70 61  ve a database pa
2c0d0 67 65 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20  ge to make room 
2c0e0 66 6f 72 20 74 68 65 20 6e 65 77 20 72 6f 6f 74  for the new root
2c0f0 2d 70 61 67 65 2e 0a 20 20 2a 2a 20 49 66 20 61  -page..  ** If a
2c100 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 77 61  n open cursor wa
2c110 73 20 75 73 69 6e 67 20 74 68 65 20 70 61 67 65  s using the page
2c120 20 61 20 70 72 6f 62 6c 65 6d 20 77 6f 75 6c 64   a problem would
2c130 20 6f 63 63 75 72 2e 0a 20 20 2a 2f 0a 20 20 69   occur..  */.  i
2c140 66 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  f( pBt->pCursor 
2c150 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2c160 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 7d  LITE_LOCKED;.  }
2c170 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
2c180 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2c190 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
2c1a0 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
2c1b0 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c  Root, &pgnoRoot,
2c1c0 20 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63   1, 0);.  if( rc
2c1d0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65   ) return rc;.#e
2c1e0 6c 73 65 0a 20 20 69 66 28 20 70 42 74 2d 3e 61  lse.  if( pBt->a
2c1f0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
2c200 20 50 67 6e 6f 20 70 67 6e 6f 4d 6f 76 65 3b 20   Pgno pgnoMove; 
2c210 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20 61 20 70       /* Move a p
2c220 61 67 65 20 68 65 72 65 20 74 6f 20 6d 61 6b 65  age here to make
2c230 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20 72 6f   room for the ro
2c240 6f 74 2d 70 61 67 65 20 2a 2f 0a 20 20 20 20 4d  ot-page */.    M
2c250 65 6d 50 61 67 65 20 2a 70 50 61 67 65 4d 6f 76  emPage *pPageMov
2c260 65 3b 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74  e; /* The page t
2c270 6f 20 6d 6f 76 65 20 74 6f 2e 20 2a 2f 0a 0a 20  o move to. */.. 
2c280 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 76     /* Read the v
2c290 61 6c 75 65 20 6f 66 20 6d 65 74 61 5b 33 5d 20  alue of meta[3] 
2c2a0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
2c2b0 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77  e to determine w
2c2c0 68 65 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  here the.    ** 
2c2d0 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65  root page of the
2c2e0 20 6e 65 77 20 74 61 62 6c 65 20 73 68 6f 75 6c   new table shoul
2c2f0 64 20 67 6f 2e 20 6d 65 74 61 5b 33 5d 20 69 73  d go. meta[3] is
2c300 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f   the largest roo
2c310 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 63 72  t-page.    ** cr
2c320 65 61 74 65 64 20 73 6f 20 66 61 72 2c 20 73 6f  eated so far, so
2c330 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61   the new root-pa
2c340 67 65 20 69 73 20 28 6d 65 74 61 5b 33 5d 2b 31  ge is (meta[3]+1
2c350 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  )..    */.    rc
2c360 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
2c370 65 74 4d 65 74 61 28 70 2c 20 34 2c 20 26 70 67  etMeta(p, 4, &pg
2c380 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28  noRoot);.    if(
2c390 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2c3a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2c3b0 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 0a 20 20 20  pgnoRoot++;..   
2c3c0 20 2f 2a 20 54 68 65 20 6e 65 77 20 72 6f 6f 74   /* The new root
2c3d0 2d 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65  -page may not be
2c3e0 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20   allocated on a 
2c3f0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
2c400 2c 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  , or the.    ** 
2c410 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 70 61 67  PENDING_BYTE pag
2c420 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
2c430 28 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 54 52 4d  ( pgnoRoot==PTRM
2c440 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 70  AP_PAGENO(pBt, p
2c450 67 6e 6f 52 6f 6f 74 29 20 7c 7c 0a 20 20 20 20  gnoRoot) ||.    
2c460 20 20 20 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 45      pgnoRoot==PE
2c470 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
2c480 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 70 67  pBt) ){.      pg
2c490 6e 6f 52 6f 6f 74 2b 2b 3b 0a 20 20 20 20 7d 0a  noRoot++;.    }.
2c4a0 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
2c4b0 52 6f 6f 74 3e 3d 33 20 29 3b 0a 0a 20 20 20 20  Root>=3 );..    
2c4c0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 70 61  /* Allocate a pa
2c4d0 67 65 2e 20 54 68 65 20 70 61 67 65 20 74 68 61  ge. The page tha
2c4e0 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65 73 69  t currently resi
2c4f0 64 65 73 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20  des at pgnoRoot 
2c500 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 6d  will.    ** be m
2c510 6f 76 65 64 20 74 6f 20 74 68 65 20 61 6c 6c 6f  oved to the allo
2c520 63 61 74 65 64 20 70 61 67 65 20 28 75 6e 6c 65  cated page (unle
2c530 73 73 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  ss the allocated
2c540 20 70 61 67 65 20 68 61 70 70 65 6e 73 0a 20 20   page happens.  
2c550 20 20 2a 2a 20 74 6f 20 72 65 73 69 64 65 20 61    ** to reside a
2c560 74 20 70 67 6e 6f 52 6f 6f 74 29 2e 0a 20 20 20  t pgnoRoot)..   
2c570 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c   */.    rc = all
2c580 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
2c590 42 74 2c 20 26 70 50 61 67 65 4d 6f 76 65 2c 20  Bt, &pPageMove, 
2c5a0 26 70 67 6e 6f 4d 6f 76 65 2c 20 70 67 6e 6f 52  &pgnoMove, pgnoR
2c5b0 6f 6f 74 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  oot, 1);.    if(
2c5c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2c5d0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
2c5e0 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  c;.    }..    if
2c5f0 28 20 70 67 6e 6f 4d 6f 76 65 21 3d 70 67 6e 6f  ( pgnoMove!=pgno
2c600 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20 75 38  Root ){.      u8
2c610 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 50 67   eType;.      Pg
2c620 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20  no iPtrPage;..  
2c630 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2c640 70 50 61 67 65 4d 6f 76 65 29 3b 0a 20 20 20 20  pPageMove);.    
2c650 20 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70    rc = getPage(p
2c660 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70  Bt, pgnoRoot, &p
2c670 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Root, 0);.      
2c680 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2c690 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
2c6a0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
2c6b0 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
2c6c0 70 47 65 74 28 70 42 74 2c 20 70 67 6e 6f 52 6f  pGet(pBt, pgnoRo
2c6d0 6f 74 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74  ot, &eType, &iPt
2c6e0 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  rPage);.      if
2c6f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2c700 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
2c710 5f 52 4f 4f 54 50 41 47 45 20 7c 7c 20 65 54 79  _ROOTPAGE || eTy
2c720 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe==PTRMAP_FREEP
2c730 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72  AGE ){.        r
2c740 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74  eleasePage(pRoot
2c750 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
2c760 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
2c770 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70      assert( eTyp
2c780 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e!=PTRMAP_ROOTPA
2c790 47 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  GE );.      asse
2c7a0 72 74 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41  rt( eType!=PTRMA
2c7b0 50 5f 46 52 45 45 50 41 47 45 20 29 3b 0a 20 20  P_FREEPAGE );.  
2c7c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2c7d0 50 61 67 65 72 57 72 69 74 65 28 70 52 6f 6f 74  PagerWrite(pRoot
2c7e0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2c7f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2c800 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2c810 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74  eleasePage(pRoot
2c820 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
2c830 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
2c840 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74      rc = relocat
2c850 65 50 61 67 65 28 70 42 74 2c 20 70 52 6f 6f 74  ePage(pBt, pRoot
2c860 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67  , eType, iPtrPag
2c870 65 2c 20 70 67 6e 6f 4d 6f 76 65 29 3b 0a 20 20  e, pgnoMove);.  
2c880 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2c890 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 69 66  pRoot);.      if
2c8a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2c8b0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
2c8c0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
2c8d0 20 20 20 20 72 63 20 3d 20 67 65 74 50 61 67 65      rc = getPage
2c8e0 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20  (pBt, pgnoRoot, 
2c8f0 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20 20  &pRoot, 0);.    
2c900 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2c910 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2c920 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2c930 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
2c940 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2c950 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Root->pDbPage);.
2c960 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2c970 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2c980 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2c990 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72  Root);.        r
2c9a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2c9b0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
2c9c0 20 20 20 70 52 6f 6f 74 20 3d 20 70 50 61 67 65     pRoot = pPage
2c9d0 4d 6f 76 65 3b 0a 20 20 20 20 7d 20 0a 0a 20 20  Move;.    } ..  
2c9e0 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
2c9f0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 61 6e 64 20  pointer-map and 
2ca00 6d 65 74 61 2d 64 61 74 61 20 77 69 74 68 20 74  meta-data with t
2ca10 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65  he new root-page
2ca20 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20   number. */.    
2ca30 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
2ca40 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 50 54  Bt, pgnoRoot, PT
2ca50 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30  RMAP_ROOTPAGE, 0
2ca60 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
2ca70 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
2ca80 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20  ge(pRoot);.     
2ca90 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2caa0 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
2cab0 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74  e3BtreeUpdateMet
2cac0 61 28 70 2c 20 34 2c 20 70 67 6e 6f 52 6f 6f 74  a(p, 4, pgnoRoot
2cad0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
2cae0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
2caf0 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20  ge(pRoot);.     
2cb00 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2cb10 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  }..  }else{.    
2cb20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
2cb30 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 52 6f  eePage(pBt, &pRo
2cb40 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c 20 31  ot, &pgnoRoot, 1
2cb50 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
2cb60 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2cb70 7d 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  }.#endif.  asser
2cb80 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
2cb90 73 77 72 69 74 65 61 62 6c 65 28 70 52 6f 6f 74  swriteable(pRoot
2cba0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
2cbb0 7a 65 72 6f 50 61 67 65 28 70 52 6f 6f 74 2c 20  zeroPage(pRoot, 
2cbc0 66 6c 61 67 73 20 7c 20 50 54 46 5f 4c 45 41 46  flags | PTF_LEAF
2cbd0 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
2cbe0 72 55 6e 72 65 66 28 70 52 6f 6f 74 2d 3e 70 44  rUnref(pRoot->pD
2cbf0 62 50 61 67 65 29 3b 0a 20 20 2a 70 69 54 61 62  bPage);.  *piTab
2cc00 6c 65 20 3d 20 28 69 6e 74 29 70 67 6e 6f 52 6f  le = (int)pgnoRo
2cc10 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ot;.  return SQL
2cc20 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
2cc30 20 45 72 61 73 65 20 74 68 65 20 67 69 76 65 6e   Erase the given
2cc40 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 61   database page a
2cc50 6e 64 20 61 6c 6c 20 69 74 73 20 63 68 69 6c 64  nd all its child
2cc60 72 65 6e 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ren.  Return.** 
2cc70 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20  the page to the 
2cc80 66 72 65 65 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  freelist..*/.sta
2cc90 74 69 63 20 69 6e 74 20 63 6c 65 61 72 44 61 74  tic int clearDat
2cca0 61 62 61 73 65 50 61 67 65 28 0a 20 20 42 74 53  abasePage(.  BtS
2ccb0 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
2ccc0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72        /* The BTr
2ccd0 65 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ee that contains
2cce0 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
2ccf0 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
2cd00 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
2cd10 6d 62 65 72 20 74 6f 20 63 6c 65 61 72 20 2a 2f  mber to clear */
2cd20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  .  MemPage *pPar
2cd30 65 6e 74 2c 20 20 20 20 20 2f 2a 20 50 61 72 65  ent,     /* Pare
2cd40 6e 74 20 70 61 67 65 2e 20 20 4e 55 4c 4c 20 66  nt page.  NULL f
2cd50 6f 72 20 74 68 65 20 72 6f 6f 74 20 2a 2f 0a 20  or the root */. 
2cd60 20 69 6e 74 20 66 72 65 65 50 61 67 65 46 6c 61   int freePageFla
2cd70 67 20 20 20 20 20 20 2f 2a 20 44 65 61 6c 6c 6f  g      /* Deallo
2cd80 63 61 74 65 20 70 61 67 65 20 69 66 20 74 72 75  cate page if tru
2cd90 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67  e */.){.  MemPag
2cda0 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20  e *pPage = 0;.  
2cdb0 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e  int rc;.  unsign
2cdc0 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a  ed char *pCell;.
2cdd0 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20    int i;..  if( 
2cde0 70 67 6e 6f 3e 73 71 6c 69 74 65 33 50 61 67 65  pgno>sqlite3Page
2cdf0 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
2ce00 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72  pPager) ){.    r
2ce10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
2ce20 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  RUPT_BKPT;.  }..
2ce30 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69    rc = getAndIni
2ce40 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c  tPage(pBt, pgno,
2ce50 20 26 70 50 61 67 65 2c 20 70 50 61 72 65 6e 74   &pPage, pParent
2ce60 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
2ce70 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65  to cleardatabase
2ce80 70 61 67 65 5f 6f 75 74 3b 0a 20 20 66 6f 72 28  page_out;.  for(
2ce90 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43  i=0; i<pPage->nC
2cea0 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  ell; i++){.    p
2ceb0 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
2cec0 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 69  pPage, i);.    i
2ced0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
2cee0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 63 6c  ){.      rc = cl
2cef0 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28  earDatabasePage(
2cf00 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 70 43  pBt, get4byte(pC
2cf10 65 6c 6c 29 2c 20 70 50 61 67 65 2d 3e 70 50 61  ell), pPage->pPa
2cf20 72 65 6e 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  rent, 1);.      
2cf30 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c  if( rc ) goto cl
2cf40 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f  eardatabasepage_
2cf50 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  out;.    }.    r
2cf60 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50  c = clearCell(pP
2cf70 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20  age, pCell);.   
2cf80 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63   if( rc ) goto c
2cf90 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65  leardatabasepage
2cfa0 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _out;.  }.  if( 
2cfb0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
2cfc0 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61      rc = clearDa
2cfd0 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c 20  tabasePage(pBt, 
2cfe0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
2cff0 3e 61 44 61 74 61 5b 38 5d 29 2c 20 70 50 61 67  >aData[8]), pPag
2d000 65 2d 3e 70 50 61 72 65 6e 74 2c 20 31 29 3b 0a  e->pParent, 1);.
2d010 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
2d020 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65 70  o cleardatabasep
2d030 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69  age_out;.  }.  i
2d040 66 28 20 66 72 65 65 50 61 67 65 46 6c 61 67 20  f( freePageFlag 
2d050 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65  ){.    rc = free
2d060 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d  Page(pPage);.  }
2d070 65 6c 73 65 20 69 66 28 20 28 72 63 20 3d 20 73  else if( (rc = s
2d080 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2d090 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2d0a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 65 72 6f  )==0 ){.    zero
2d0b0 50 61 67 65 28 70 50 61 67 65 2c 20 70 50 61 67  Page(pPage, pPag
2d0c0 65 2d 3e 61 44 61 74 61 5b 30 5d 20 7c 20 50 54  e->aData[0] | PT
2d0d0 46 5f 4c 45 41 46 29 3b 0a 20 20 7d 0a 0a 63 6c  F_LEAF);.  }..cl
2d0e0 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f  eardatabasepage_
2d0f0 6f 75 74 3a 0a 20 20 72 65 6c 65 61 73 65 50 61  out:.  releasePa
2d100 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74  ge(pPage);.  ret
2d110 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2d120 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 66 6f   Delete all info
2d130 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 20 73  rmation from a s
2d140 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74  ingle table in t
2d150 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 69 54  he database.  iT
2d160 61 62 6c 65 20 69 73 0a 2a 2a 20 74 68 65 20 70  able is.** the p
2d170 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
2d180 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61  e root of the ta
2d190 62 6c 65 2e 20 20 41 66 74 65 72 20 74 68 69 73  ble.  After this
2d1a0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
2d1b0 2c 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61  ,.** the root pa
2d1c0 67 65 20 69 73 20 65 6d 70 74 79 2c 20 62 75 74  ge is empty, but
2d1d0 20 73 74 69 6c 6c 20 65 78 69 73 74 73 2e 0a 2a   still exists..*
2d1e0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2d1f0 65 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68  e will fail with
2d200 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69   SQLITE_LOCKED i
2d210 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
2d220 6f 70 65 6e 0a 2a 2a 20 72 65 61 64 20 63 75 72  open.** read cur
2d230 73 6f 72 73 20 6f 6e 20 74 68 65 20 74 61 62 6c  sors on the tabl
2d240 65 2e 20 20 4f 70 65 6e 20 77 72 69 74 65 20 63  e.  Open write c
2d250 75 72 73 6f 72 73 20 61 72 65 20 6d 6f 76 65 64  ursors are moved
2d260 20 74 6f 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20   to the.** root 
2d270 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f  of the table..*/
2d280 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2d290 65 43 6c 65 61 72 54 61 62 6c 65 28 42 74 72 65  eClearTable(Btre
2d2a0 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65  e *p, int iTable
2d2b0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
2d2c0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2d2d0 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 70 2d 3e  ->pBt;.  if( p->
2d2e0 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57  inTrans!=TRANS_W
2d2f0 52 49 54 45 20 29 7b 0a 20 20 20 20 72 65 74 75  RITE ){.    retu
2d300 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  rn pBt->readOnly
2d310 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   ? SQLITE_READON
2d320 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f  LY : SQLITE_ERRO
2d330 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 63 68  R;.  }.  rc = ch
2d340 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70 2c 20  eckReadLocks(p, 
2d350 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 69 66  iTable, 0);.  if
2d360 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
2d370 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
2d380 20 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69   Save the positi
2d390 6f 6e 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72  on of all cursor
2d3a0 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 74  s open on this t
2d3b0 61 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 53 51  able */.  if( SQ
2d3c0 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
2d3d0 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
2d3e0 74 2c 20 69 54 61 62 6c 65 2c 20 30 29 29 20 29  t, iTable, 0)) )
2d3f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
2d400 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 63  .  }..  return c
2d410 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65  learDatabasePage
2d420 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 54 61 62  (pBt, (Pgno)iTab
2d430 6c 65 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  le, 0, 0);.}../*
2d440 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 69 6e  .** Erase all in
2d450 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 61 20 74  formation in a t
2d460 61 62 6c 65 20 61 6e 64 20 61 64 64 20 74 68 65  able and add the
2d470 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62   root of the tab
2d480 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 66 72 65  le to.** the fre
2d490 65 6c 69 73 74 2e 20 20 45 78 63 65 70 74 2c 20  elist.  Except, 
2d4a0 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  the root of the 
2d4b0 70 72 69 6e 63 69 70 6c 65 20 74 61 62 6c 65 20  principle table 
2d4c0 28 74 68 65 20 6f 6e 65 20 6f 6e 0a 2a 2a 20 70  (the one on.** p
2d4d0 61 67 65 20 31 29 20 69 73 20 6e 65 76 65 72 20  age 1) is never 
2d4e0 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65  added to the fre
2d4f0 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  elist..**.** Thi
2d500 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 66  s routine will f
2d510 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ail with SQLITE_
2d520 4c 4f 43 4b 45 44 20 69 66 20 74 68 65 72 65 20  LOCKED if there 
2d530 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20  are any open.** 
2d540 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 74  cursors on the t
2d550 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 41  able..**.** If A
2d560 55 54 4f 56 41 43 55 55 4d 20 69 73 20 65 6e 61  UTOVACUUM is ena
2d570 62 6c 65 64 20 61 6e 64 20 74 68 65 20 70 61 67  bled and the pag
2d580 65 20 61 74 20 69 54 61 62 6c 65 20 69 73 20 6e  e at iTable is n
2d590 6f 74 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 72  ot the last.** r
2d5a0 6f 6f 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  oot page in the 
2d5b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
2d5c0 68 65 6e 20 74 68 65 20 6c 61 73 74 20 72 6f 6f  hen the last roo
2d5d0 74 20 70 61 67 65 20 0a 2a 2a 20 69 6e 20 74 68  t page .** in th
2d5e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2d5f0 69 73 20 6d 6f 76 65 64 20 69 6e 74 6f 20 74 68  is moved into th
2d600 65 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c 79 20  e slot formerly 
2d610 6f 63 63 75 70 69 65 64 20 62 79 0a 2a 2a 20 69  occupied by.** i
2d620 54 61 62 6c 65 20 61 6e 64 20 74 68 61 74 20 6c  Table and that l
2d630 61 73 74 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c  ast slot formerl
2d640 79 20 6f 63 63 75 70 69 65 64 20 62 79 20 74 68  y occupied by th
2d650 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65  e last root page
2d660 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20  .** is added to 
2d670 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e 73  the freelist ins
2d680 74 65 61 64 20 6f 66 20 69 54 61 62 6c 65 2e 20  tead of iTable. 
2d690 20 49 6e 20 74 68 69 73 20 73 61 79 2c 20 61 6c   In this say, al
2d6a0 6c 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 73 20  l.** root pages 
2d6b0 61 72 65 20 6b 65 70 74 20 61 74 20 74 68 65 20  are kept at the 
2d6c0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
2d6d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2d6e0 77 68 69 63 68 0a 2a 2a 20 69 73 20 6e 65 63 65  which.** is nece
2d6f0 73 73 61 72 79 20 66 6f 72 20 41 55 54 4f 56 41  ssary for AUTOVA
2d700 43 55 55 4d 20 74 6f 20 77 6f 72 6b 20 72 69 67  CUUM to work rig
2d710 68 74 2e 20 20 2a 70 69 4d 6f 76 65 64 20 69 73  ht.  *piMoved is
2d720 20 73 65 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20   set to the .** 
2d730 70 61 67 65 20 6e 75 6d 62 65 72 20 74 68 61 74  page number that
2d740 20 75 73 65 64 20 74 6f 20 62 65 20 74 68 65 20   used to be the 
2d750 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65 20 69  last root page i
2d760 6e 20 74 68 65 20 66 69 6c 65 20 62 65 66 6f 72  n the file befor
2d770 65 0a 2a 2a 20 74 68 65 20 6d 6f 76 65 2e 20 20  e.** the move.  
2d780 49 66 20 6e 6f 20 70 61 67 65 20 67 65 74 73 20  If no page gets 
2d790 6d 6f 76 65 64 2c 20 2a 70 69 4d 6f 76 65 64 20  moved, *piMoved 
2d7a0 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 20  is set to 0..** 
2d7b0 54 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61  The last root pa
2d7c0 67 65 20 69 73 20 72 65 63 6f 72 64 65 64 20 69  ge is recorded i
2d7d0 6e 20 6d 65 74 61 5b 33 5d 20 61 6e 64 20 74 68  n meta[3] and th
2d7e0 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 6d 65  e value of.** me
2d7f0 74 61 5b 33 5d 20 69 73 20 75 70 64 61 74 65 64  ta[3] is updated
2d800 20 62 79 20 74 68 69 73 20 70 72 6f 63 65 64 75   by this procedu
2d810 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  re..*/.int sqlit
2d820 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65  e3BtreeDropTable
2d830 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69  (Btree *p, int i
2d840 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70 69 4d 6f  Table, int *piMo
2d850 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ved){.  int rc;.
2d860 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2d870 20 3d 20 30 3b 0a 20 20 42 74 53 68 61 72 65 64   = 0;.  BtShared
2d880 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
2d890 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
2d8a0 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s!=TRANS_WRITE )
2d8b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42 74  {.    return pBt
2d8c0 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c  ->readOnly ? SQL
2d8d0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53  ITE_READONLY : S
2d8e0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
2d8f0 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 69 6c 6c  ..  /* It is ill
2d900 65 67 61 6c 20 74 6f 20 64 72 6f 70 20 61 20 74  egal to drop a t
2d910 61 62 6c 65 20 69 66 20 61 6e 79 20 63 75 72 73  able if any curs
2d920 6f 72 73 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20  ors are open on 
2d930 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
2d940 65 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  e. This is becau
2d950 73 65 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75  se in auto-vacuu
2d960 6d 20 6d 6f 64 65 20 74 68 65 20 62 61 63 6b 65  m mode the backe
2d970 6e 64 20 6d 61 79 0a 20 20 2a 2a 20 6e 65 65 64  nd may.  ** need
2d980 20 74 6f 20 6d 6f 76 65 20 61 6e 6f 74 68 65 72   to move another
2d990 20 72 6f 6f 74 2d 70 61 67 65 20 74 6f 20 66 69   root-page to fi
2d9a0 6c 6c 20 61 20 67 61 70 20 6c 65 66 74 20 62 79  ll a gap left by
2d9b0 20 74 68 65 20 64 65 6c 65 74 65 64 0a 20 20 2a   the deleted.  *
2d9c0 2a 20 72 6f 6f 74 20 70 61 67 65 2e 20 49 66 20  * root page. If 
2d9d0 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 77  an open cursor w
2d9e0 61 73 20 75 73 69 6e 67 20 74 68 69 73 20 70 61  as using this pa
2d9f0 67 65 20 61 20 70 72 6f 62 6c 65 6d 20 77 6f 75  ge a problem wou
2da00 6c 64 20 0a 20 20 2a 2a 20 6f 63 63 75 72 2e 0a  ld .  ** occur..
2da10 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e    */.  if( pBt->
2da20 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 72  pCursor ){.    r
2da30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
2da40 4b 45 44 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  KED;.  }..  rc =
2da50 20 67 65 74 50 61 67 65 28 70 42 74 2c 20 28 50   getPage(pBt, (P
2da60 67 6e 6f 29 69 54 61 62 6c 65 2c 20 26 70 50 61  gno)iTable, &pPa
2da70 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  ge, 0);.  if( rc
2da80 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2da90 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2daa0 65 43 6c 65 61 72 54 61 62 6c 65 28 70 2c 20 69  eClearTable(p, i
2dab0 54 61 62 6c 65 29 3b 0a 20 20 69 66 28 20 72 63  Table);.  if( rc
2dac0 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50   ){.    releaseP
2dad0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
2dae0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
2daf0 20 20 2a 70 69 4d 6f 76 65 64 20 3d 20 30 3b 0a    *piMoved = 0;.
2db00 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3e 31 20  .  if( iTable>1 
2db10 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
2db20 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
2db30 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61  .    rc = freePa
2db40 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72  ge(pPage);.    r
2db50 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
2db60 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28  );.#else.    if(
2db70 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
2db80 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6d   ){.      Pgno m
2db90 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20  axRootPgno;.    
2dba0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2dbb0 72 65 65 47 65 74 4d 65 74 61 28 70 2c 20 34 2c  reeGetMeta(p, 4,
2dbc0 20 26 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a   &maxRootPgno);.
2dbd0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2dbe0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2dbf0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2dc00 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Page);.        r
2dc10 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2dc20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 69 54 61  }..      if( iTa
2dc30 62 6c 65 3d 3d 6d 61 78 52 6f 6f 74 50 67 6e 6f  ble==maxRootPgno
2dc40 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
2dc50 66 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  f the table bein
2dc60 67 20 64 72 6f 70 70 65 64 20 69 73 20 74 68 65  g dropped is the
2dc70 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
2dc80 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67  largest root-pag
2dc90 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d  e.        ** num
2dca0 62 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62  ber in the datab
2dcb0 61 73 65 2c 20 70 75 74 20 74 68 65 20 72 6f 6f  ase, put the roo
2dcc0 74 20 70 61 67 65 20 6f 6e 20 74 68 65 20 66 72  t page on the fr
2dcd0 65 65 20 6c 69 73 74 2e 20 0a 20 20 20 20 20 20  ee list. .      
2dce0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20    */.        rc 
2dcf0 3d 20 66 72 65 65 50 61 67 65 28 70 50 61 67 65  = freePage(pPage
2dd00 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
2dd10 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
2dd20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2dd30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2dd40 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2dd50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2dd60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2dd70 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69  /* The table bei
2dd80 6e 67 20 64 72 6f 70 70 65 64 20 64 6f 65 73 20  ng dropped does 
2dd90 6e 6f 74 20 68 61 76 65 20 74 68 65 20 6c 61 72  not have the lar
2dda0 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20  gest root-page. 
2ddb0 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72         ** number
2ddc0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2ddd0 2e 20 53 6f 20 6d 6f 76 65 20 74 68 65 20 70 61  . So move the pa
2dde0 67 65 20 74 68 61 74 20 64 6f 65 73 20 69 6e 74  ge that does int
2ddf0 6f 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  o the .        *
2de00 2a 20 67 61 70 20 6c 65 66 74 20 62 79 20 74 68  * gap left by th
2de10 65 20 64 65 6c 65 74 65 64 20 72 6f 6f 74 2d 70  e deleted root-p
2de20 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  age..        */.
2de30 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
2de40 2a 70 4d 6f 76 65 3b 0a 20 20 20 20 20 20 20 20  *pMove;.        
2de50 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
2de60 65 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  e);.        rc =
2de70 20 67 65 74 50 61 67 65 28 70 42 74 2c 20 6d 61   getPage(pBt, ma
2de80 78 52 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f 76  xRootPgno, &pMov
2de90 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  e, 0);.        i
2dea0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2deb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
2dec0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
2ded0 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
2dee0 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74  relocatePage(pBt
2def0 2c 20 70 4d 6f 76 65 2c 20 50 54 52 4d 41 50 5f  , pMove, PTRMAP_
2df00 52 4f 4f 54 50 41 47 45 2c 20 30 2c 20 69 54 61  ROOTPAGE, 0, iTa
2df10 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ble);.        re
2df20 6c 65 61 73 65 50 61 67 65 28 70 4d 6f 76 65 29  leasePage(pMove)
2df30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2df40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2df50 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2df60 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
2df70 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 50 61        rc = getPa
2df80 67 65 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50  ge(pBt, maxRootP
2df90 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20 30 29 3b  gno, &pMove, 0);
2dfa0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
2dfb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2dfc0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
2dfd0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
2dfe0 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61       rc = freePa
2dff0 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20  ge(pMove);.     
2e000 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2e010 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Move);.        i
2e020 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2e030 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
2e040 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
2e050 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 69 4d 6f   }.        *piMo
2e060 76 65 64 20 3d 20 6d 61 78 52 6f 6f 74 50 67 6e  ved = maxRootPgn
2e070 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  o;.      }..    
2e080 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 65 77    /* Set the new
2e090 20 27 6d 61 78 2d 72 6f 6f 74 2d 70 61 67 65 27   'max-root-page'
2e0a0 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 64 61   value in the da
2e0b0 74 61 62 61 73 65 20 68 65 61 64 65 72 2e 20 54  tabase header. T
2e0c0 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  his.      ** is 
2e0d0 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 20 6c 65  the old value le
2e0e0 73 73 20 6f 6e 65 2c 20 6c 65 73 73 20 6f 6e 65  ss one, less one
2e0f0 20 6d 6f 72 65 20 69 66 20 74 68 61 74 20 68 61   more if that ha
2e100 70 70 65 6e 73 20 74 6f 0a 20 20 20 20 20 20 2a  ppens to.      *
2e110 2a 20 62 65 20 61 20 72 6f 6f 74 2d 70 61 67 65  * be a root-page
2e120 20 6e 75 6d 62 65 72 2c 20 6c 65 73 73 20 6f 6e   number, less on
2e130 65 20 61 67 61 69 6e 20 69 66 20 74 68 61 74 20  e again if that 
2e140 69 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  is the.      ** 
2e150 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
2e160 45 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  E..      */.    
2e170 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b    maxRootPgno--;
2e180 0a 20 20 20 20 20 20 69 66 28 20 6d 61 78 52 6f  .      if( maxRo
2e190 6f 74 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f  otPgno==PENDING_
2e1a0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
2e1b0 7b 0a 20 20 20 20 20 20 20 20 6d 61 78 52 6f 6f  {.        maxRoo
2e1c0 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d  tPgno--;.      }
2e1d0 0a 20 20 20 20 20 20 69 66 28 20 6d 61 78 52 6f  .      if( maxRo
2e1e0 6f 74 50 67 6e 6f 3d 3d 50 54 52 4d 41 50 5f 50  otPgno==PTRMAP_P
2e1f0 41 47 45 4e 4f 28 70 42 74 2c 20 6d 61 78 52 6f  AGENO(pBt, maxRo
2e200 6f 74 50 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20  otPgno) ){.     
2e210 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d     maxRootPgno--
2e220 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2e230 61 73 73 65 72 74 28 20 6d 61 78 52 6f 6f 74 50  assert( maxRootP
2e240 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
2e250 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a  E_PAGE(pBt) );..
2e260 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2e270 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74  e3BtreeUpdateMet
2e280 61 28 70 2c 20 34 2c 20 6d 61 78 52 6f 6f 74 50  a(p, 4, maxRootP
2e290 67 6e 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  gno);.    }else{
2e2a0 0a 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65  .      rc = free
2e2b0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
2e2c0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2e2d0 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  Page);.    }.#en
2e2e0 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  dif.  }else{.   
2e2f0 20 2f 2a 20 49 66 20 73 71 6c 69 74 65 33 42 74   /* If sqlite3Bt
2e300 72 65 65 44 72 6f 70 54 61 62 6c 65 20 77 61 73  reeDropTable was
2e310 20 63 61 6c 6c 65 64 20 6f 6e 20 70 61 67 65 20   called on page 
2e320 31 2e 20 2a 2f 0a 20 20 20 20 7a 65 72 6f 50 61  1. */.    zeroPa
2e330 67 65 28 70 50 61 67 65 2c 20 50 54 46 5f 49 4e  ge(pPage, PTF_IN
2e340 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 20 29 3b  TKEY|PTF_LEAF );
2e350 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
2e360 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72  (pPage);.  }.  r
2e370 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 0a 0a  eturn rc;  .}...
2e380 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 6d  /*.** Read the m
2e390 65 74 61 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  eta-information 
2e3a0 6f 75 74 20 6f 66 20 61 20 64 61 74 61 62 61 73  out of a databas
2e3b0 65 20 66 69 6c 65 2e 20 20 4d 65 74 61 5b 30 5d  e file.  Meta[0]
2e3c0 0a 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d 62 65  .** is the numbe
2e3d0 72 20 6f 66 20 66 72 65 65 20 70 61 67 65 73 20  r of free pages 
2e3e0 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65  currently in the
2e3f0 20 64 61 74 61 62 61 73 65 2e 20 20 4d 65 74 61   database.  Meta
2e400 5b 31 5d 0a 2a 2a 20 74 68 72 6f 75 67 68 20 6d  [1].** through m
2e410 65 74 61 5b 31 35 5d 20 61 72 65 20 61 76 61 69  eta[15] are avai
2e420 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20 62 79  lable for use by
2e430 20 68 69 67 68 65 72 20 6c 61 79 65 72 73 2e 20   higher layers. 
2e440 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69 73 20 72   Meta[0].** is r
2e450 65 61 64 2d 6f 6e 6c 79 2c 20 74 68 65 20 6f 74  ead-only, the ot
2e460 68 65 72 73 20 61 72 65 20 72 65 61 64 2f 77 72  hers are read/wr
2e470 69 74 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20  ite..** .** The 
2e480 73 63 68 65 6d 61 20 6c 61 79 65 72 20 6e 75 6d  schema layer num
2e490 62 65 72 73 20 6d 65 74 61 20 76 61 6c 75 65 73  bers meta values
2e4a0 20 64 69 66 66 65 72 65 6e 74 6c 79 2e 20 20 41   differently.  A
2e4b0 74 20 74 68 65 20 73 63 68 65 6d 61 0a 2a 2a 20  t the schema.** 
2e4c0 6c 61 79 65 72 20 28 61 6e 64 20 74 68 65 20 53  layer (and the S
2e4d0 65 74 43 6f 6f 6b 69 65 20 61 6e 64 20 52 65 61  etCookie and Rea
2e4e0 64 43 6f 6f 6b 69 65 20 6f 70 63 6f 64 65 73 29  dCookie opcodes)
2e4f0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
2e500 2a 20 66 72 65 65 20 70 61 67 65 73 20 69 73 20  * free pages is 
2e510 6e 6f 74 20 76 69 73 69 62 6c 65 2e 20 20 53 6f  not visible.  So
2e520 20 43 6f 6f 6b 69 65 5b 30 5d 20 69 73 20 74 68   Cookie[0] is th
2e530 65 20 73 61 6d 65 20 61 73 20 4d 65 74 61 5b 31  e same as Meta[1
2e540 5d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  ]..*/.int sqlite
2e550 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 42 74  3BtreeGetMeta(Bt
2e560 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c  ree *p, int idx,
2e570 20 75 33 32 20 2a 70 4d 65 74 61 29 7b 0a 20 20   u32 *pMeta){.  
2e580 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
2e590 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73  .  int rc;.  uns
2e5a0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 31 3b  igned char *pP1;
2e5b0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2e5c0 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 2f 2a   = p->pBt;..  /*
2e5d0 20 52 65 61 64 69 6e 67 20 61 20 6d 65 74 61 2d   Reading a meta-
2e5e0 64 61 74 61 20 76 61 6c 75 65 20 72 65 71 75 69  data value requi
2e5f0 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  res a read-lock 
2e600 6f 6e 20 70 61 67 65 20 31 20 28 61 6e 64 20 68  on page 1 (and h
2e610 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 73 71  ence.  ** the sq
2e620 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
2e630 65 2e 20 57 65 20 67 72 61 62 20 74 68 69 73 20  e. We grab this 
2e640 6c 6f 63 6b 20 72 65 67 61 72 64 6c 65 73 73 20  lock regardless 
2e650 6f 66 20 77 68 65 74 68 65 72 20 6f 72 0a 20 20  of whether or.  
2e660 2a 2a 20 6e 6f 74 20 74 68 65 20 53 51 4c 49 54  ** not the SQLIT
2e670 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65  E_ReadUncommitte
2e680 64 20 66 6c 61 67 20 69 73 20 73 65 74 20 28 74  d flag is set (t
2e690 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20  he table rooted 
2e6a0 61 74 20 70 61 67 65 0a 20 20 2a 2a 20 31 20 69  at page.  ** 1 i
2e6b0 73 20 74 72 65 61 74 65 64 20 61 73 20 61 20 73  s treated as a s
2e6c0 70 65 63 69 61 6c 20 63 61 73 65 20 62 79 20 71  pecial case by q
2e6d0 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 29 20  ueryTableLock() 
2e6e0 61 6e 64 20 6c 6f 63 6b 54 61 62 6c 65 28 29 29  and lockTable())
2e6f0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75  ..  */.  rc = qu
2e700 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  eryTableLock(p, 
2e710 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20  1, READ_LOCK);. 
2e720 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2e730 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
2e740 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65   rc;.  }..  asse
2e750 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64  rt( idx>=0 && id
2e760 78 3c 3d 31 35 20 29 3b 0a 20 20 72 63 20 3d 20  x<=15 );.  rc = 
2e770 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
2e780 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 31 2c 20  pBt->pPager, 1, 
2e790 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  &pDbPage);.  if(
2e7a0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2e7b0 0a 20 20 70 50 31 20 3d 20 28 75 6e 73 69 67 6e  .  pP1 = (unsign
2e7c0 65 64 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65  ed char *)sqlite
2e7d0 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
2e7e0 62 50 61 67 65 29 3b 0a 20 20 2a 70 4d 65 74 61  bPage);.  *pMeta
2e7f0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 31   = get4byte(&pP1
2e800 5b 33 36 20 2b 20 69 64 78 2a 34 5d 29 3b 0a 20  [36 + idx*4]);. 
2e810 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
2e820 65 66 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20  ef(pDbPage);..  
2e830 2f 2a 20 49 66 20 61 75 74 6f 76 61 63 75 75 6d  /* If autovacuum
2e840 65 64 20 69 73 20 64 69 73 61 62 6c 65 64 20 69  ed is disabled i
2e850 6e 20 74 68 69 73 20 62 75 69 6c 64 20 62 75 74  n this build but
2e860 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74   we are trying t
2e870 6f 20 0a 20 20 2a 2a 20 61 63 63 65 73 73 20 61  o .  ** access a
2e880 6e 20 61 75 74 6f 76 61 63 75 75 6d 65 64 20 64  n autovacuumed d
2e890 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 6d 61  atabase, then ma
2e8a0 6b 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ke the database 
2e8b0 72 65 61 64 6f 6e 6c 79 2e 20 0a 20 20 2a 2f 0a  readonly. .  */.
2e8c0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
2e8d0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
2e8e0 69 66 28 20 69 64 78 3d 3d 34 20 26 26 20 2a 70  if( idx==4 && *p
2e8f0 4d 65 74 61 3e 30 20 29 20 70 42 74 2d 3e 72 65  Meta>0 ) pBt->re
2e900 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 23 65 6e 64  adOnly = 1;.#end
2e910 69 66 0a 0a 20 20 2f 2a 20 47 72 61 62 20 74 68  if..  /* Grab th
2e920 65 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70  e read-lock on p
2e930 61 67 65 20 31 2e 20 2a 2f 0a 20 20 72 63 20 3d  age 1. */.  rc =
2e940 20 6c 6f 63 6b 54 61 62 6c 65 28 70 2c 20 31 2c   lockTable(p, 1,
2e950 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 72   READ_LOCK);.  r
2e960 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2e970 2a 2a 20 57 72 69 74 65 20 6d 65 74 61 2d 69 6e  ** Write meta-in
2e980 66 6f 72 6d 61 74 69 6f 6e 20 62 61 63 6b 20 69  formation back i
2e990 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
2e9a0 2e 20 20 4d 65 74 61 5b 30 5d 20 69 73 0a 2a 2a  .  Meta[0] is.**
2e9b0 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 6d   read-only and m
2e9c0 61 79 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65  ay not be writte
2e9d0 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
2e9e0 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61  3BtreeUpdateMeta
2e9f0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69  (Btree *p, int i
2ea00 64 78 2c 20 75 33 32 20 69 4d 65 74 61 29 7b 0a  dx, u32 iMeta){.
2ea10 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2ea20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75 6e 73 69  = p->pBt;.  unsi
2ea30 67 6e 65 64 20 63 68 61 72 20 2a 70 50 31 3b 0a  gned char *pP1;.
2ea40 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
2ea50 72 74 28 20 69 64 78 3e 3d 31 20 26 26 20 69 64  rt( idx>=1 && id
2ea60 78 3c 3d 31 35 20 29 3b 0a 20 20 69 66 28 20 70  x<=15 );.  if( p
2ea70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
2ea80 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72 65  _WRITE ){.    re
2ea90 74 75 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e  turn pBt->readOn
2eaa0 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44  ly ? SQLITE_READ
2eab0 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52  ONLY : SQLITE_ER
2eac0 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ROR;.  }.  asser
2ead0 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d  t( pBt->pPage1!=
2eae0 30 20 29 3b 0a 20 20 70 50 31 20 3d 20 70 42 74  0 );.  pP1 = pBt
2eaf0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b  ->pPage1->aData;
2eb00 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
2eb10 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
2eb20 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
2eb30 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
2eb40 72 6e 20 72 63 3b 0a 20 20 70 75 74 34 62 79 74  rn rc;.  put4byt
2eb50 65 28 26 70 50 31 5b 33 36 20 2b 20 69 64 78 2a  e(&pP1[36 + idx*
2eb60 34 5d 2c 20 69 4d 65 74 61 29 3b 0a 20 20 72 65  4], iMeta);.  re
2eb70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2eb80 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2eb90 74 68 65 20 66 6c 61 67 20 62 79 74 65 20 61 74  the flag byte at
2eba0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
2ebb0 66 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20  f the page that 
2ebc0 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73  the cursor.** is
2ebd0 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
2ebe0 69 6e 67 20 74 6f 2e 0a 2a 2f 0a 69 6e 74 20 73  ing to..*/.int s
2ebf0 71 6c 69 74 65 33 42 74 72 65 65 46 6c 61 67 73  qlite3BtreeFlags
2ec00 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
2ec10 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61  {.  /* TODO: Wha
2ec20 74 20 61 62 6f 75 74 20 43 55 52 53 4f 52 5f 52  t about CURSOR_R
2ec30 45 51 55 49 52 45 53 45 45 4b 20 73 74 61 74 65  EQUIRESEEK state
2ec40 3f 20 50 72 6f 62 61 62 6c 79 20 6e 65 65 64 20  ? Probably need 
2ec50 74 6f 20 63 61 6c 6c 0a 20 20 2a 2a 20 72 65 73  to call.  ** res
2ec60 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f  toreOrClearCurso
2ec70 72 50 6f 73 69 74 69 6f 6e 28 29 20 68 65 72 65  rPosition() here
2ec80 2e 0a 20 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ..  */.  MemPage
2ec90 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
2eca0 70 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20  pPage;.  return 
2ecb0 70 50 61 67 65 20 3f 20 70 50 61 67 65 2d 3e 61  pPage ? pPage->a
2ecc0 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
2ecd0 66 66 73 65 74 5d 20 3a 20 30 3b 0a 7d 0a 0a 23  ffset] : 0;.}..#
2ece0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2ecf0 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  UG./*.** Print a
2ed00 20 64 69 73 61 73 73 65 6d 62 6c 79 20 6f 66 20   disassembly of 
2ed10 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 6f  the given page o
2ed20 6e 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75  n standard outpu
2ed30 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
2ed40 0a 2a 2a 20 69 73 20 75 73 65 64 20 66 6f 72 20  .** is used for 
2ed50 64 65 62 75 67 67 69 6e 67 20 61 6e 64 20 74 65  debugging and te
2ed60 73 74 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73  sting only..*/.s
2ed70 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 50  tatic int btreeP
2ed80 61 67 65 44 75 6d 70 28 42 74 53 68 61 72 65 64  ageDump(BtShared
2ed90 20 2a 70 42 74 2c 20 69 6e 74 20 70 67 6e 6f 2c   *pBt, int pgno,
2eda0 20 69 6e 74 20 72 65 63 75 72 73 69 76 65 2c 20   int recursive, 
2edb0 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
2edc0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
2edd0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
2ede0 20 69 6e 74 20 69 2c 20 6a 2c 20 63 3b 0a 20 20   int i, j, c;.  
2edf0 69 6e 74 20 6e 46 72 65 65 3b 0a 20 20 75 31 36  int nFree;.  u16
2ee00 20 69 64 78 3b 0a 20 20 69 6e 74 20 68 64 72 3b   idx;.  int hdr;
2ee10 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20  .  int nCell;.  
2ee20 69 6e 74 20 69 73 49 6e 69 74 3b 0a 20 20 75 6e  int isInit;.  un
2ee30 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
2ee40 61 3b 0a 20 20 63 68 61 72 20 72 61 6e 67 65 5b  a;.  char range[
2ee50 32 30 5d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  20];.  unsigned 
2ee60 63 68 61 72 20 70 61 79 6c 6f 61 64 5b 32 30 5d  char payload[20]
2ee70 3b 0a 0a 20 20 72 63 20 3d 20 67 65 74 50 61 67  ;..  rc = getPag
2ee80 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 70 67 6e  e(pBt, (Pgno)pgn
2ee90 6f 2c 20 26 70 50 61 67 65 2c 20 30 29 3b 0a 20  o, &pPage, 0);. 
2eea0 20 69 73 49 6e 69 74 20 3d 20 70 50 61 67 65 2d   isInit = pPage-
2eeb0 3e 69 73 49 6e 69 74 3b 0a 20 20 69 66 28 20 70  >isInit;.  if( p
2eec0 50 61 67 65 2d 3e 69 73 49 6e 69 74 3d 3d 30 20  Page->isInit==0 
2eed0 29 7b 0a 20 20 20 20 69 6e 69 74 50 61 67 65 28  ){.    initPage(
2eee0 70 50 61 67 65 2c 20 70 50 61 72 65 6e 74 29 3b  pPage, pParent);
2eef0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29 7b  .  }.  if( rc ){
2ef00 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2ef10 20 20 7d 0a 20 20 68 64 72 20 3d 20 70 50 61 67    }.  hdr = pPag
2ef20 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
2ef30 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
2ef40 61 74 61 3b 0a 20 20 63 20 3d 20 64 61 74 61 5b  ata;.  c = data[
2ef50 68 64 72 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 69  hdr];.  pPage->i
2ef60 6e 74 4b 65 79 20 3d 20 28 63 20 26 20 28 50 54  ntKey = (c & (PT
2ef70 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
2ef80 46 44 41 54 41 29 29 21 3d 30 3b 0a 20 20 70 50  FDATA))!=0;.  pP
2ef90 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61 20 3d 20  age->zeroData = 
2efa0 28 63 20 26 20 50 54 46 5f 5a 45 52 4f 44 41 54  (c & PTF_ZERODAT
2efb0 41 29 21 3d 30 3b 0a 20 20 70 50 61 67 65 2d 3e  A)!=0;.  pPage->
2efc0 6c 65 61 66 44 61 74 61 20 3d 20 28 63 20 26 20  leafData = (c & 
2efd0 50 54 46 5f 4c 45 41 46 44 41 54 41 29 21 3d 30  PTF_LEAFDATA)!=0
2efe0 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  ;.  pPage->leaf 
2eff0 3d 20 28 63 20 26 20 50 54 46 5f 4c 45 41 46 29  = (c & PTF_LEAF)
2f000 21 3d 30 3b 0a 20 20 70 50 61 67 65 2d 3e 68 61  !=0;.  pPage->ha
2f010 73 44 61 74 61 20 3d 20 21 28 70 50 61 67 65 2d  sData = !(pPage-
2f020 3e 7a 65 72 6f 44 61 74 61 20 7c 7c 20 28 21 70  >zeroData || (!p
2f030 50 61 67 65 2d 3e 6c 65 61 66 20 26 26 20 70 50  Page->leaf && pP
2f040 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 29 29 3b  age->leafData));
2f050 0a 20 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62  .  nCell = get2b
2f060 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
2f070 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
2f080 67 50 72 69 6e 74 66 28 22 50 41 47 45 20 25 64  gPrintf("PAGE %d
2f090 3a 20 20 66 6c 61 67 73 3d 30 78 25 30 32 78 20  :  flags=0x%02x 
2f0a0 20 66 72 61 67 3d 25 64 20 20 20 70 61 72 65 6e   frag=%d   paren
2f0b0 74 3d 25 64 5c 6e 22 2c 20 70 67 6e 6f 2c 0a 20  t=%d\n", pgno,. 
2f0c0 20 20 20 64 61 74 61 5b 68 64 72 5d 2c 20 64 61     data[hdr], da
2f0d0 74 61 5b 68 64 72 2b 37 5d 2c 20 0a 20 20 20 20  ta[hdr+7], .    
2f0e0 28 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 26  (pPage->isInit &
2f0f0 26 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  & pPage->pParent
2f100 29 20 3f 20 70 50 61 67 65 2d 3e 70 50 61 72 65  ) ? pPage->pPare
2f110 6e 74 2d 3e 70 67 6e 6f 20 3a 20 30 29 3b 0a 20  nt->pgno : 0);. 
2f120 20 61 73 73 65 72 74 28 20 68 64 72 20 3d 3d 20   assert( hdr == 
2f130 28 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a  (pgno==1 ? 100 :
2f140 20 30 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 68   0) );.  idx = h
2f150 64 72 20 2b 20 31 32 20 2d 20 70 50 61 67 65 2d  dr + 12 - pPage-
2f160 3e 6c 65 61 66 2a 34 3b 0a 20 20 66 6f 72 28 69  >leaf*4;.  for(i
2f170 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
2f180 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20  ){.    CellInfo 
2f190 69 6e 66 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 63  info;.    Pgno c
2f1a0 68 69 6c 64 3b 0a 20 20 20 20 75 6e 73 69 67 6e  hild;.    unsign
2f1b0 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a  ed char *pCell;.
2f1c0 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20      int sz;.    
2f1d0 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 20 20 61  int addr;..    a
2f1e0 64 64 72 20 3d 20 67 65 74 32 62 79 74 65 28 26  ddr = get2byte(&
2f1f0 64 61 74 61 5b 69 64 78 20 2b 20 32 2a 69 5d 29  data[idx + 2*i])
2f200 3b 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 26 64  ;.    pCell = &d
2f210 61 74 61 5b 61 64 64 72 5d 3b 0a 20 20 20 20 70  ata[addr];.    p
2f220 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
2f230 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
2f240 3b 0a 20 20 20 20 73 7a 20 3d 20 69 6e 66 6f 2e  ;.    sz = info.
2f250 6e 53 69 7a 65 3b 0a 20 20 20 20 73 70 72 69 6e  nSize;.    sprin
2f260 74 66 28 72 61 6e 67 65 2c 22 25 64 2e 2e 25 64  tf(range,"%d..%d
2f270 22 2c 20 61 64 64 72 2c 20 61 64 64 72 2b 73 7a  ", addr, addr+sz
2f280 2d 31 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  -1);.    if( pPa
2f290 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2f2a0 20 20 63 68 69 6c 64 20 3d 20 30 3b 0a 20 20 20    child = 0;.   
2f2b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
2f2c0 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28 70  ild = get4byte(p
2f2d0 43 65 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Cell);.    }.   
2f2e0 20 73 7a 20 3d 20 69 6e 66 6f 2e 6e 44 61 74 61   sz = info.nData
2f2f0 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ;.    if( !pPage
2f300 2d 3e 69 6e 74 4b 65 79 20 29 20 73 7a 20 2b 3d  ->intKey ) sz +=
2f310 20 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20   info.nKey;.    
2f320 69 66 28 20 73 7a 3e 73 69 7a 65 6f 66 28 70 61  if( sz>sizeof(pa
2f330 79 6c 6f 61 64 29 2d 31 20 29 20 73 7a 20 3d 20  yload)-1 ) sz = 
2f340 73 69 7a 65 6f 66 28 70 61 79 6c 6f 61 64 29 2d  sizeof(payload)-
2f350 31 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 61  1;.    memcpy(pa
2f360 79 6c 6f 61 64 2c 20 26 70 43 65 6c 6c 5b 69 6e  yload, &pCell[in
2f370 66 6f 2e 6e 48 65 61 64 65 72 5d 2c 20 73 7a 29  fo.nHeader], sz)
2f380 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
2f390 3c 73 7a 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  <sz; j++){.     
2f3a0 20 69 66 28 20 70 61 79 6c 6f 61 64 5b 6a 5d 3c   if( payload[j]<
2f3b0 30 78 32 30 20 7c 7c 20 70 61 79 6c 6f 61 64 5b  0x20 || payload[
2f3c0 6a 5d 3e 30 78 37 66 20 29 20 70 61 79 6c 6f 61  j]>0x7f ) payloa
2f3d0 64 5b 6a 5d 20 3d 20 27 2e 27 3b 0a 20 20 20 20  d[j] = '.';.    
2f3e0 7d 0a 20 20 20 20 70 61 79 6c 6f 61 64 5b 73 7a  }.    payload[sz
2f3f0 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  ] = 0;.    sqlit
2f400 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20  e3DebugPrintf(. 
2f410 20 20 20 20 20 22 63 65 6c 6c 20 25 32 64 3a 20       "cell %2d: 
2f420 69 3d 25 2d 31 30 73 20 63 68 6c 64 3d 25 2d 34  i=%-10s chld=%-4
2f430 64 20 6e 6b 3d 25 2d 34 6c 6c 64 20 6e 64 3d 25  d nk=%-4lld nd=%
2f440 2d 34 64 20 70 61 79 6c 6f 61 64 3d 25 73 5c 6e  -4d payload=%s\n
2f450 22 2c 0a 20 20 20 20 20 20 69 2c 20 72 61 6e 67  ",.      i, rang
2f460 65 2c 20 63 68 69 6c 64 2c 20 69 6e 66 6f 2e 6e  e, child, info.n
2f470 4b 65 79 2c 20 69 6e 66 6f 2e 6e 44 61 74 61 2c  Key, info.nData,
2f480 20 70 61 79 6c 6f 61 64 0a 20 20 20 20 29 3b 0a   payload.    );.
2f490 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65    }.  if( !pPage
2f4a0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 73 71  ->leaf ){.    sq
2f4b0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
2f4c0 28 22 72 69 67 68 74 5f 63 68 69 6c 64 3a 20 25  ("right_child: %
2f4d0 64 5c 6e 22 2c 20 67 65 74 34 62 79 74 65 28 26  d\n", get4byte(&
2f4e0 64 61 74 61 5b 68 64 72 2b 38 5d 29 29 3b 0a 20  data[hdr+8]));. 
2f4f0 20 7d 0a 20 20 6e 46 72 65 65 20 3d 20 30 3b 0a   }.  nFree = 0;.
2f500 20 20 69 20 3d 20 30 3b 0a 20 20 69 64 78 20 3d    i = 0;.  idx =
2f510 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
2f520 68 64 72 2b 31 5d 29 3b 0a 20 20 77 68 69 6c 65  hdr+1]);.  while
2f530 28 20 69 64 78 3e 30 20 26 26 20 69 64 78 3c 70  ( idx>0 && idx<p
2f540 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
2f550 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 6e 74  eSize ){.    int
2f560 20 73 7a 20 3d 20 67 65 74 32 62 79 74 65 28 26   sz = get2byte(&
2f570 64 61 74 61 5b 69 64 78 2b 32 5d 29 3b 0a 20 20  data[idx+2]);.  
2f580 20 20 73 70 72 69 6e 74 66 28 72 61 6e 67 65 2c    sprintf(range,
2f590 22 25 64 2e 2e 25 64 22 2c 20 69 64 78 2c 20 69  "%d..%d", idx, i
2f5a0 64 78 2b 73 7a 2d 31 29 3b 0a 20 20 20 20 6e 46  dx+sz-1);.    nF
2f5b0 72 65 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 73  ree += sz;.    s
2f5c0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
2f5d0 66 28 22 66 72 65 65 62 6c 6f 63 6b 20 25 32 64  f("freeblock %2d
2f5e0 3a 20 69 3d 25 2d 31 30 73 20 73 69 7a 65 3d 25  : i=%-10s size=%
2f5f0 2d 34 64 20 74 6f 74 61 6c 3d 25 64 5c 6e 22 2c  -4d total=%d\n",
2f600 0a 20 20 20 20 20 20 20 69 2c 20 72 61 6e 67 65  .       i, range
2f610 2c 20 73 7a 2c 20 6e 46 72 65 65 29 3b 0a 20 20  , sz, nFree);.  
2f620 20 20 69 64 78 20 3d 20 67 65 74 32 62 79 74 65    idx = get2byte
2f630 28 26 64 61 74 61 5b 69 64 78 5d 29 3b 0a 20 20  (&data[idx]);.  
2f640 20 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28    i++;.  }.  if(
2f650 20 69 64 78 21 3d 30 20 29 7b 0a 20 20 20 20 73   idx!=0 ){.    s
2f660 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
2f670 66 28 22 45 52 52 4f 52 3a 20 6e 65 78 74 20 66  f("ERROR: next f
2f680 72 65 65 62 6c 6f 63 6b 20 69 6e 64 65 78 20 6f  reeblock index o
2f690 75 74 20 6f 66 20 72 61 6e 67 65 3a 20 25 64 5c  ut of range: %d\
2f6a0 6e 22 2c 20 69 64 78 29 3b 0a 20 20 7d 0a 20 20  n", idx);.  }.  
2f6b0 69 66 28 20 72 65 63 75 72 73 69 76 65 20 26 26  if( recursive &&
2f6c0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2f6d0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2f6e0 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
2f6f0 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
2f700 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65   *pCell = findCe
2f710 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20  ll(pPage, i);.  
2f720 20 20 20 20 62 74 72 65 65 50 61 67 65 44 75 6d      btreePageDum
2f730 70 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28  p(pBt, get4byte(
2f740 70 43 65 6c 6c 29 2c 20 31 2c 20 70 50 61 67 65  pCell), 1, pPage
2f750 29 3b 0a 20 20 20 20 20 20 69 64 78 20 3d 20 67  );.      idx = g
2f760 65 74 32 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a  et2byte(pCell);.
2f770 20 20 20 20 7d 0a 20 20 20 20 62 74 72 65 65 50      }.    btreeP
2f780 61 67 65 44 75 6d 70 28 70 42 74 2c 20 67 65 74  ageDump(pBt, get
2f790 34 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  4byte(&data[hdr+
2f7a0 38 5d 29 2c 20 31 2c 20 70 50 61 67 65 29 3b 0a  8]), 1, pPage);.
2f7b0 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 69 73 49    }.  pPage->isI
2f7c0 6e 69 74 20 3d 20 69 73 49 6e 69 74 3b 0a 20 20  nit = isInit;.  
2f7d0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
2f7e0 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  f(pPage->pDbPage
2f7f0 29 3b 0a 20 20 66 66 6c 75 73 68 28 73 74 64 6f  );.  fflush(stdo
2f800 75 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ut);.  return SQ
2f810 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73  LITE_OK;.}.int s
2f820 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 44  qlite3BtreePageD
2f830 75 6d 70 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ump(Btree *p, in
2f840 74 20 70 67 6e 6f 2c 20 69 6e 74 20 72 65 63 75  t pgno, int recu
2f850 72 73 69 76 65 29 7b 0a 20 20 72 65 74 75 72 6e  rsive){.  return
2f860 20 62 74 72 65 65 50 61 67 65 44 75 6d 70 28 70   btreePageDump(p
2f870 2d 3e 70 42 74 2c 20 70 67 6e 6f 2c 20 72 65 63  ->pBt, pgno, rec
2f880 75 72 73 69 76 65 2c 20 30 29 3b 0a 7d 0a 23 65  ursive, 0);.}.#e
2f890 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65  ndif..#if define
2f8a0 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c  d(SQLITE_TEST) |
2f8b0 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
2f8c0 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 46 69  _DEBUG)./*.** Fi
2f8d0 6c 6c 20 61 52 65 73 75 6c 74 5b 5d 20 77 69 74  ll aResult[] wit
2f8e0 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  h information ab
2f8f0 6f 75 74 20 74 68 65 20 65 6e 74 72 79 20 61 6e  out the entry an
2f900 64 20 70 61 67 65 20 74 68 61 74 20 74 68 65 0a  d page that the.
2f910 2a 2a 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  ** cursor is poi
2f920 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2a 20 0a 2a 2a  nting to..** .**
2f930 20 20 20 61 52 65 73 75 6c 74 5b 30 5d 20 3d 20     aResult[0] = 
2f940 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
2f950 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 31 5d  .**   aResult[1]
2f960 20 3d 20 20 54 68 65 20 65 6e 74 72 79 20 6e 75   =  The entry nu
2f970 6d 62 65 72 0a 2a 2a 20 20 20 61 52 65 73 75 6c  mber.**   aResul
2f980 74 5b 32 5d 20 3d 20 20 54 6f 74 61 6c 20 6e 75  t[2] =  Total nu
2f990 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
2f9a0 6f 6e 20 74 68 69 73 20 70 61 67 65 0a 2a 2a 20  on this page.** 
2f9b0 20 20 61 52 65 73 75 6c 74 5b 33 5d 20 3d 20 20    aResult[3] =  
2f9c0 43 65 6c 6c 20 73 69 7a 65 20 28 6c 6f 63 61 6c  Cell size (local
2f9d0 20 70 61 79 6c 6f 61 64 20 2b 20 68 65 61 64 65   payload + heade
2f9e0 72 29 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b  r).**   aResult[
2f9f0 34 5d 20 3d 20 20 4e 75 6d 62 65 72 20 6f 66 20  4] =  Number of 
2fa00 66 72 65 65 20 62 79 74 65 73 20 6f 6e 20 74 68  free bytes on th
2fa10 69 73 20 70 61 67 65 0a 2a 2a 20 20 20 61 52 65  is page.**   aRe
2fa20 73 75 6c 74 5b 35 5d 20 3d 20 20 4e 75 6d 62 65  sult[5] =  Numbe
2fa30 72 20 6f 66 20 66 72 65 65 20 62 6c 6f 63 6b 73  r of free blocks
2fa40 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20   on the page.** 
2fa50 20 20 61 52 65 73 75 6c 74 5b 36 5d 20 3d 20 20    aResult[6] =  
2fa60 54 6f 74 61 6c 20 70 61 79 6c 6f 61 64 20 73 69  Total payload si
2fa70 7a 65 20 28 6c 6f 63 61 6c 20 2b 20 6f 76 65 72  ze (local + over
2fa80 66 6c 6f 77 29 0a 2a 2a 20 20 20 61 52 65 73 75  flow).**   aResu
2fa90 6c 74 5b 37 5d 20 3d 20 20 48 65 61 64 65 72 20  lt[7] =  Header 
2faa0 73 69 7a 65 20 69 6e 20 62 79 74 65 73 0a 2a 2a  size in bytes.**
2fab0 20 20 20 61 52 65 73 75 6c 74 5b 38 5d 20 3d 20     aResult[8] = 
2fac0 20 4c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 20 73   Local payload s
2fad0 69 7a 65 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74  ize.**   aResult
2fae0 5b 39 5d 20 3d 20 20 50 61 72 65 6e 74 20 70 61  [9] =  Parent pa
2faf0 67 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 61  ge number.**   a
2fb00 52 65 73 75 6c 74 5b 31 30 5d 3d 20 20 50 61 67  Result[10]=  Pag
2fb10 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
2fb20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
2fb30 61 67 65 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  age.**.** This r
2fb40 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
2fb50 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64  or testing and d
2fb60 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
2fb70 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
2fb80 65 65 43 75 72 73 6f 72 49 6e 66 6f 28 42 74 43  eeCursorInfo(BtC
2fb90 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
2fba0 20 2a 61 52 65 73 75 6c 74 2c 20 69 6e 74 20 75   *aResult, int u
2fbb0 70 43 6e 74 29 7b 0a 20 20 69 6e 74 20 63 6e 74  pCnt){.  int cnt
2fbc0 2c 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65  , idx;.  MemPage
2fbd0 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
2fbe0 70 50 61 67 65 3b 0a 20 20 42 74 43 75 72 73 6f  pPage;.  BtCurso
2fbf0 72 20 74 6d 70 43 75 72 3b 0a 0a 20 20 69 6e 74  r tmpCur;..  int
2fc00 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43   rc = restoreOrC
2fc10 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
2fc20 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
2fc30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2fc40 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2fc50 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
2fc60 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
2fc70 20 20 67 65 74 54 65 6d 70 43 75 72 73 6f 72 28    getTempCursor(
2fc80 70 43 75 72 2c 20 26 74 6d 70 43 75 72 29 3b 0a  pCur, &tmpCur);.
2fc90 20 20 77 68 69 6c 65 28 20 75 70 43 6e 74 2d 2d    while( upCnt--
2fca0 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 50 61   ){.    moveToPa
2fcb0 72 65 6e 74 28 26 74 6d 70 43 75 72 29 3b 0a 20  rent(&tmpCur);. 
2fcc0 20 7d 0a 20 20 70 50 61 67 65 20 3d 20 74 6d 70   }.  pPage = tmp
2fcd0 43 75 72 2e 70 50 61 67 65 3b 0a 20 20 61 52 65  Cur.pPage;.  aRe
2fce0 73 75 6c 74 5b 30 5d 20 3d 20 73 71 6c 69 74 65  sult[0] = sqlite
2fcf0 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
2fd00 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2fd10 3b 0a 20 20 61 73 73 65 72 74 28 20 61 52 65 73  ;.  assert( aRes
2fd20 75 6c 74 5b 30 5d 3d 3d 70 50 61 67 65 2d 3e 70  ult[0]==pPage->p
2fd30 67 6e 6f 20 29 3b 0a 20 20 61 52 65 73 75 6c 74  gno );.  aResult
2fd40 5b 31 5d 20 3d 20 74 6d 70 43 75 72 2e 69 64 78  [1] = tmpCur.idx
2fd50 3b 0a 20 20 61 52 65 73 75 6c 74 5b 32 5d 20 3d  ;.  aResult[2] =
2fd60 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20   pPage->nCell;. 
2fd70 20 69 66 28 20 74 6d 70 43 75 72 2e 69 64 78 3e   if( tmpCur.idx>
2fd80 3d 30 20 26 26 20 74 6d 70 43 75 72 2e 69 64 78  =0 && tmpCur.idx
2fd90 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b  <pPage->nCell ){
2fda0 0a 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  .    getCellInfo
2fdb0 28 26 74 6d 70 43 75 72 29 3b 0a 20 20 20 20 61  (&tmpCur);.    a
2fdc0 52 65 73 75 6c 74 5b 33 5d 20 3d 20 74 6d 70 43  Result[3] = tmpC
2fdd0 75 72 2e 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20  ur.info.nSize;. 
2fde0 20 20 20 61 52 65 73 75 6c 74 5b 36 5d 20 3d 20     aResult[6] = 
2fdf0 74 6d 70 43 75 72 2e 69 6e 66 6f 2e 6e 44 61 74  tmpCur.info.nDat
2fe00 61 3b 0a 20 20 20 20 61 52 65 73 75 6c 74 5b 37  a;.    aResult[7
2fe10 5d 20 3d 20 74 6d 70 43 75 72 2e 69 6e 66 6f 2e  ] = tmpCur.info.
2fe20 6e 48 65 61 64 65 72 3b 0a 20 20 20 20 61 52 65  nHeader;.    aRe
2fe30 73 75 6c 74 5b 38 5d 20 3d 20 74 6d 70 43 75 72  sult[8] = tmpCur
2fe40 2e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20  .info.nLocal;.  
2fe50 7d 65 6c 73 65 7b 0a 20 20 20 20 61 52 65 73 75  }else{.    aResu
2fe60 6c 74 5b 33 5d 20 3d 20 30 3b 0a 20 20 20 20 61  lt[3] = 0;.    a
2fe70 52 65 73 75 6c 74 5b 36 5d 20 3d 20 30 3b 0a 20  Result[6] = 0;. 
2fe80 20 20 20 61 52 65 73 75 6c 74 5b 37 5d 20 3d 20     aResult[7] = 
2fe90 30 3b 0a 20 20 20 20 61 52 65 73 75 6c 74 5b 38  0;.    aResult[8
2fea0 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 52 65  ] = 0;.  }.  aRe
2feb0 73 75 6c 74 5b 34 5d 20 3d 20 70 50 61 67 65 2d  sult[4] = pPage-
2fec0 3e 6e 46 72 65 65 3b 0a 20 20 63 6e 74 20 3d 20  >nFree;.  cnt = 
2fed0 30 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 32 62  0;.  idx = get2b
2fee0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
2fef0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
2ff00 65 74 2b 31 5d 29 3b 0a 20 20 77 68 69 6c 65 28  et+1]);.  while(
2ff10 20 69 64 78 3e 30 20 26 26 20 69 64 78 3c 70 50   idx>0 && idx<pP
2ff20 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
2ff30 53 69 7a 65 20 29 7b 0a 20 20 20 20 63 6e 74 2b  Size ){.    cnt+
2ff40 2b 3b 0a 20 20 20 20 69 64 78 20 3d 20 67 65 74  +;.    idx = get
2ff50 32 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  2byte(&pPage->aD
2ff60 61 74 61 5b 69 64 78 5d 29 3b 0a 20 20 7d 0a 20  ata[idx]);.  }. 
2ff70 20 61 52 65 73 75 6c 74 5b 35 5d 20 3d 20 63 6e   aResult[5] = cn
2ff80 74 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  t;.  if( pPage->
2ff90 70 50 61 72 65 6e 74 3d 3d 30 20 7c 7c 20 69 73  pParent==0 || is
2ffa0 52 6f 6f 74 50 61 67 65 28 70 50 61 67 65 29 20  RootPage(pPage) 
2ffb0 29 7b 0a 20 20 20 20 61 52 65 73 75 6c 74 5b 39  ){.    aResult[9
2ffc0 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ] = 0;.  }else{.
2ffd0 20 20 20 20 61 52 65 73 75 6c 74 5b 39 5d 20 3d      aResult[9] =
2ffe0 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 2d   pPage->pParent-
2fff0 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 69 66 28  >pgno;.  }.  if(
30000 20 74 6d 70 43 75 72 2e 69 6e 66 6f 2e 69 4f 76   tmpCur.info.iOv
30010 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 61 52  erflow ){.    aR
30020 65 73 75 6c 74 5b 31 30 5d 20 3d 20 67 65 74 34  esult[10] = get4
30030 62 79 74 65 28 26 74 6d 70 43 75 72 2e 69 6e 66  byte(&tmpCur.inf
30040 6f 2e 70 43 65 6c 6c 5b 74 6d 70 43 75 72 2e 69  o.pCell[tmpCur.i
30050 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b  nfo.iOverflow]);
30060 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 52  .  }else{.    aR
30070 65 73 75 6c 74 5b 31 30 5d 20 3d 20 30 3b 0a 20  esult[10] = 0;. 
30080 20 7d 0a 20 20 72 65 6c 65 61 73 65 54 65 6d 70   }.  releaseTemp
30090 43 75 72 73 6f 72 28 26 74 6d 70 43 75 72 29 3b  Cursor(&tmpCur);
300a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
300b0 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
300c0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
300d0 70 61 67 65 72 20 61 73 73 6f 63 69 61 74 65 64  pager associated
300e0 20 77 69 74 68 20 61 20 42 54 72 65 65 2e 20 20   with a BTree.  
300f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
30100 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
30110 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e  ing and debuggin
30120 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 50 61 67 65 72  g only..*/.Pager
30130 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 50 61   *sqlite3BtreePa
30140 67 65 72 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ger(Btree *p){. 
30150 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e   return p->pBt->
30160 70 50 61 67 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPager;.}../*.**
30170 20 54 68 69 73 20 73 74 72 75 63 74 75 72 65 20   This structure 
30180 69 73 20 70 61 73 73 65 64 20 61 72 6f 75 6e 64  is passed around
30190 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 74 68 65   through all the
301a0 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
301b0 20 72 6f 75 74 69 6e 65 73 0a 2a 2a 20 69 6e 20   routines.** in 
301c0 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 72  order to keep tr
301d0 61 63 6b 20 6f 66 20 73 6f 6d 65 20 67 6c 6f 62  ack of some glob
301e0 61 6c 20 73 74 61 74 65 20 69 6e 66 6f 72 6d 61  al state informa
301f0 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  tion..*/.typedef
30200 20 73 74 72 75 63 74 20 49 6e 74 65 67 72 69 74   struct Integrit
30210 79 43 6b 20 49 6e 74 65 67 72 69 74 79 43 6b 3b  yCk IntegrityCk;
30220 0a 73 74 72 75 63 74 20 49 6e 74 65 67 72 69 74  .struct Integrit
30230 79 43 6b 20 7b 0a 20 20 42 74 53 68 61 72 65 64  yCk {.  BtShared
30240 20 2a 70 42 74 3b 20 20 20 20 2f 2a 20 54 68 65   *pBt;    /* The
30250 20 74 72 65 65 20 62 65 69 6e 67 20 63 68 65 63   tree being chec
30260 6b 65 64 20 6f 75 74 20 2a 2f 0a 20 20 50 61 67  ked out */.  Pag
30270 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20 20 2f  er *pPager;    /
30280 2a 20 54 68 65 20 61 73 73 6f 63 69 61 74 65 64  * The associated
30290 20 70 61 67 65 72 2e 20 20 41 6c 73 6f 20 61 63   pager.  Also ac
302a0 63 65 73 73 69 62 6c 65 20 62 79 20 70 42 74 2d  cessible by pBt-
302b0 3e 70 50 61 67 65 72 20 2a 2f 0a 20 20 69 6e 74  >pPager */.  int
302c0 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 2f   nPage;        /
302d0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
302e0 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
302f0 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 6e 52 65  e */.  int *anRe
30300 66 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  f;       /* Numb
30310 65 72 20 6f 66 20 74 69 6d 65 73 20 65 61 63 68  er of times each
30320 20 70 61 67 65 20 69 73 20 72 65 66 65 72 65 6e   page is referen
30330 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 45  ced */.  int mxE
30340 72 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 74  rr;        /* St
30350 6f 70 20 61 63 63 75 6d 75 6c 61 74 69 6e 67 20  op accumulating 
30360 65 72 72 6f 72 73 20 77 68 65 6e 20 74 68 69 73  errors when this
30370 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20 2a 2f   reaches zero */
30380 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67  .  char *zErrMsg
30390 3b 20 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72  ;    /* An error
303a0 20 6d 65 73 73 61 67 65 2e 20 20 4e 55 4c 4c 20   message.  NULL 
303b0 69 66 20 6e 6f 20 65 72 72 6f 72 73 20 73 65 65  if no errors see
303c0 6e 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72  n. */.  int nErr
303d0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
303e0 62 65 72 20 6f 66 20 6d 65 73 73 61 67 65 73 20  ber of messages 
303f0 77 72 69 74 74 65 6e 20 74 6f 20 7a 45 72 72 4d  written to zErrM
30400 73 67 20 73 6f 20 66 61 72 20 2a 2f 0a 7d 3b 0a  sg so far */.};.
30410 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
30420 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43  OMIT_INTEGRITY_C
30430 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  HECK./*.** Appen
30440 64 20 61 20 6d 65 73 73 61 67 65 20 74 6f 20 74  d a message to t
30450 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
30460 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74   string..*/.stat
30470 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41 70 70  ic void checkApp
30480 65 6e 64 4d 73 67 28 0a 20 20 49 6e 74 65 67 72  endMsg(.  Integr
30490 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 0a 20  ityCk *pCheck,. 
304a0 20 63 68 61 72 20 2a 7a 4d 73 67 31 2c 0a 20 20   char *zMsg1,.  
304b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
304c0 6d 61 74 2c 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20  mat,.  ....){.  
304d0 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68  va_list ap;.  ch
304e0 61 72 20 2a 7a 4d 73 67 32 3b 0a 20 20 69 66 28  ar *zMsg2;.  if(
304f0 20 21 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 20   !pCheck->mxErr 
30500 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 68 65  ) return;.  pChe
30510 63 6b 2d 3e 6d 78 45 72 72 2d 2d 3b 0a 20 20 70  ck->mxErr--;.  p
30520 43 68 65 63 6b 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Check->nErr++;. 
30530 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
30540 6f 72 6d 61 74 29 3b 0a 20 20 7a 4d 73 67 32 20  ormat);.  zMsg2 
30550 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74  = sqlite3VMPrint
30560 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  f(zFormat, ap);.
30570 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
30580 69 66 28 20 7a 4d 73 67 31 3d 3d 30 20 29 20 7a  if( zMsg1==0 ) z
30590 4d 73 67 31 20 3d 20 22 22 3b 0a 20 20 69 66 28  Msg1 = "";.  if(
305a0 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67   pCheck->zErrMsg
305b0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f   ){.    char *zO
305c0 6c 64 20 3d 20 70 43 68 65 63 6b 2d 3e 7a 45 72  ld = pCheck->zEr
305d0 72 4d 73 67 3b 0a 20 20 20 20 70 43 68 65 63 6b  rMsg;.    pCheck
305e0 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
305f0 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
30600 69 6e 67 28 26 70 43 68 65 63 6b 2d 3e 7a 45 72  ing(&pCheck->zEr
30610 72 4d 73 67 2c 20 7a 4f 6c 64 2c 20 22 5c 6e 22  rMsg, zOld, "\n"
30620 2c 20 7a 4d 73 67 31 2c 20 7a 4d 73 67 32 2c 20  , zMsg1, zMsg2, 
30630 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 73  (char*)0);.    s
30640 71 6c 69 74 65 46 72 65 65 28 7a 4f 6c 64 29 3b  qliteFree(zOld);
30650 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
30660 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
30670 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 2c  pCheck->zErrMsg,
30680 20 7a 4d 73 67 31 2c 20 7a 4d 73 67 32 2c 20 28   zMsg1, zMsg2, (
30690 63 68 61 72 2a 29 30 29 3b 0a 20 20 7d 0a 20 20  char*)0);.  }.  
306a0 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 73 67 32  sqliteFree(zMsg2
306b0 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
306c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
306d0 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23  RITY_CHECK */..#
306e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
306f0 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
30700 43 4b 0a 2f 2a 0a 2a 2a 20 41 64 64 20 31 20 74  CK./*.** Add 1 t
30710 6f 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  o the reference 
30720 63 6f 75 6e 74 20 66 6f 72 20 70 61 67 65 20 69  count for page i
30730 50 61 67 65 2e 20 20 49 66 20 74 68 69 73 20 69  Page.  If this i
30740 73 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20  s the second.** 
30750 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
30760 20 70 61 67 65 2c 20 61 64 64 20 61 6e 20 65 72   page, add an er
30770 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 70  ror message to p
30780 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Check->zErrMsg..
30790 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  ** Return 1 if t
307a0 68 65 72 65 20 61 72 65 20 32 20 6f 72 65 20 6d  here are 2 ore m
307b0 6f 72 65 20 72 65 66 65 72 65 6e 63 65 73 20 74  ore references t
307c0 6f 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 30  o the page and 0
307d0 20 69 66 0a 2a 2a 20 69 66 20 74 68 69 73 20 69   if.** if this i
307e0 73 20 74 68 65 20 66 69 72 73 74 20 72 65 66 65  s the first refe
307f0 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67  rence to the pag
30800 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 63 68  e..**.** Also ch
30810 65 63 6b 20 74 68 61 74 20 74 68 65 20 70 61 67  eck that the pag
30820 65 20 6e 75 6d 62 65 72 20 69 73 20 69 6e 20 62  e number is in b
30830 6f 75 6e 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ounds..*/.static
30840 20 69 6e 74 20 63 68 65 63 6b 52 65 66 28 49 6e   int checkRef(In
30850 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63  tegrityCk *pChec
30860 6b 2c 20 69 6e 74 20 69 50 61 67 65 2c 20 63 68  k, int iPage, ch
30870 61 72 20 2a 7a 43 6f 6e 74 65 78 74 29 7b 0a 20  ar *zContext){. 
30880 20 69 66 28 20 69 50 61 67 65 3d 3d 30 20 29 20   if( iPage==0 ) 
30890 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
308a0 69 50 61 67 65 3e 70 43 68 65 63 6b 2d 3e 6e 50  iPage>pCheck->nP
308b0 61 67 65 20 7c 7c 20 69 50 61 67 65 3c 30 20 29  age || iPage<0 )
308c0 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e  {.    checkAppen
308d0 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
308e0 6e 74 65 78 74 2c 20 22 69 6e 76 61 6c 69 64 20  ntext, "invalid 
308f0 70 61 67 65 20 6e 75 6d 62 65 72 20 25 64 22 2c  page number %d",
30900 20 69 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74   iPage);.    ret
30910 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
30920 20 70 43 68 65 63 6b 2d 3e 61 6e 52 65 66 5b 69   pCheck->anRef[i
30930 50 61 67 65 5d 3d 3d 31 20 29 7b 0a 20 20 20 20  Page]==1 ){.    
30940 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
30950 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c  Check, zContext,
30960 20 22 32 6e 64 20 72 65 66 65 72 65 6e 63 65 20   "2nd reference 
30970 74 6f 20 70 61 67 65 20 25 64 22 2c 20 69 50 61  to page %d", iPa
30980 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ge);.    return 
30990 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
309a0 20 28 70 43 68 65 63 6b 2d 3e 61 6e 52 65 66 5b   (pCheck->anRef[
309b0 69 50 61 67 65 5d 2b 2b 29 3e 31 3b 0a 7d 0a 0a  iPage]++)>1;.}..
309c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
309d0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f  MIT_AUTOVACUUM./
309e0 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20  *.** Check that 
309f0 74 68 65 20 65 6e 74 72 79 20 69 6e 20 74 68 65  the entry in the
30a00 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 66 6f 72   pointer-map for
30a10 20 70 61 67 65 20 69 43 68 69 6c 64 20 6d 61 70   page iChild map
30a20 73 20 74 6f 20 0a 2a 2a 20 70 61 67 65 20 69 50  s to .** page iP
30a30 61 72 65 6e 74 2c 20 70 6f 69 6e 74 65 72 20 74  arent, pointer t
30a40 79 70 65 20 70 74 72 54 79 70 65 2e 20 49 66 20  ype ptrType. If 
30a50 6e 6f 74 2c 20 61 70 70 65 6e 64 20 61 6e 20 65  not, append an e
30a60 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20  rror message.** 
30a70 74 6f 20 70 43 68 65 63 6b 2e 0a 2a 2f 0a 73 74  to pCheck..*/.st
30a80 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50  atic void checkP
30a90 74 72 6d 61 70 28 0a 20 20 49 6e 74 65 67 72 69  trmap(.  Integri
30aa0 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20 20  tyCk *pCheck,   
30ab0 2f 2a 20 49 6e 74 65 67 72 69 74 79 20 63 68 65  /* Integrity che
30ac0 63 6b 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ck context */.  
30ad0 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20  Pgno iChild,    
30ae0 20 20 20 20 20 20 20 2f 2a 20 43 68 69 6c 64 20         /* Child 
30af0 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
30b00 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20   u8 eType,      
30b10 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63          /* Expec
30b20 74 65 64 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  ted pointer map 
30b30 74 79 70 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  type */.  Pgno i
30b40 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20 20 20  Parent,         
30b50 20 2f 2a 20 45 78 70 65 63 74 65 64 20 70 6f 69   /* Expected poi
30b60 6e 74 65 72 20 6d 61 70 20 70 61 72 65 6e 74 20  nter map parent 
30b70 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
30b80 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74 20   char *zContext 
30b90 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
30ba0 78 74 20 64 65 73 63 72 69 70 74 69 6f 6e 20 28  xt description (
30bb0 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d  used for error m
30bc0 73 67 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  sg) */.){.  int 
30bd0 72 63 3b 0a 20 20 75 38 20 65 50 74 72 6d 61 70  rc;.  u8 ePtrmap
30be0 54 79 70 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74  Type;.  Pgno iPt
30bf0 72 6d 61 70 50 61 72 65 6e 74 3b 0a 0a 20 20 72  rmapParent;..  r
30c00 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 43  c = ptrmapGet(pC
30c10 68 65 63 6b 2d 3e 70 42 74 2c 20 69 43 68 69 6c  heck->pBt, iChil
30c20 64 2c 20 26 65 50 74 72 6d 61 70 54 79 70 65 2c  d, &ePtrmapType,
30c30 20 26 69 50 74 72 6d 61 70 50 61 72 65 6e 74 29   &iPtrmapParent)
30c40 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
30c50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 68 65  TE_OK ){.    che
30c60 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
30c70 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 46  ck, zContext, "F
30c80 61 69 6c 65 64 20 74 6f 20 72 65 61 64 20 70 74  ailed to read pt
30c90 72 6d 61 70 20 6b 65 79 3d 25 64 22 2c 20 69 43  rmap key=%d", iC
30ca0 68 69 6c 64 29 3b 0a 20 20 20 20 72 65 74 75 72  hild);.    retur
30cb0 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 50  n;.  }..  if( eP
30cc0 74 72 6d 61 70 54 79 70 65 21 3d 65 54 79 70 65  trmapType!=eType
30cd0 20 7c 7c 20 69 50 74 72 6d 61 70 50 61 72 65 6e   || iPtrmapParen
30ce0 74 21 3d 69 50 61 72 65 6e 74 20 29 7b 0a 20 20  t!=iParent ){.  
30cf0 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
30d00 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78  (pCheck, zContex
30d10 74 2c 20 0a 20 20 20 20 20 20 22 42 61 64 20 70  t, .      "Bad p
30d20 74 72 20 6d 61 70 20 65 6e 74 72 79 20 6b 65 79  tr map entry key
30d30 3d 25 64 20 65 78 70 65 63 74 65 64 3d 28 25 64  =%d expected=(%d
30d40 2c 25 64 29 20 67 6f 74 3d 28 25 64 2c 25 64 29  ,%d) got=(%d,%d)
30d50 22 2c 20 0a 20 20 20 20 20 20 69 43 68 69 6c 64  ", .      iChild
30d60 2c 20 65 54 79 70 65 2c 20 69 50 61 72 65 6e 74  , eType, iParent
30d70 2c 20 65 50 74 72 6d 61 70 54 79 70 65 2c 20 69  , ePtrmapType, i
30d80 50 74 72 6d 61 70 50 61 72 65 6e 74 29 3b 0a 20  PtrmapParent);. 
30d90 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
30da0 2a 2a 20 43 68 65 63 6b 20 74 68 65 20 69 6e 74  ** Check the int
30db0 65 67 72 69 74 79 20 6f 66 20 74 68 65 20 66 72  egrity of the fr
30dc0 65 65 6c 69 73 74 20 6f 72 20 6f 66 20 61 6e 20  eelist or of an 
30dd0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6c 69  overflow page li
30de0 73 74 2e 0a 2a 2a 20 56 65 72 69 66 79 20 74 68  st..** Verify th
30df0 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  at the number of
30e00 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 6c 69   pages on the li
30e10 73 74 20 69 73 20 4e 2e 0a 2a 2f 0a 73 74 61 74  st is N..*/.stat
30e20 69 63 20 76 6f 69 64 20 63 68 65 63 6b 4c 69 73  ic void checkLis
30e30 74 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b  t(.  IntegrityCk
30e40 20 2a 70 43 68 65 63 6b 2c 20 20 2f 2a 20 49 6e   *pCheck,  /* In
30e50 74 65 67 72 69 74 79 20 63 68 65 63 6b 69 6e 67  tegrity checking
30e60 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
30e70 74 20 69 73 46 72 65 65 4c 69 73 74 2c 20 20 20  t isFreeList,   
30e80 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
30e90 61 20 66 72 65 65 6c 69 73 74 2e 20 20 46 61 6c  a freelist.  Fal
30ea0 73 65 20 66 6f 72 20 6f 76 65 72 66 6c 6f 77 20  se for overflow 
30eb0 70 61 67 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69  page list */.  i
30ec0 6e 74 20 69 50 61 67 65 2c 20 20 20 20 20 20 20  nt iPage,       
30ed0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
30ee0 62 65 72 20 66 6f 72 20 66 69 72 73 74 20 70 61  ber for first pa
30ef0 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a  ge in the list *
30f00 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20  /.  int N,      
30f10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
30f20 65 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20  ected number of 
30f30 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73  pages in the lis
30f40 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f  t */.  char *zCo
30f50 6e 74 65 78 74 20 20 20 20 20 20 20 20 2f 2a 20  ntext        /* 
30f60 43 6f 6e 74 65 78 74 20 66 6f 72 20 65 72 72 6f  Context for erro
30f70 72 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 29 7b  r messages */.){
30f80 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
30f90 65 78 70 65 63 74 65 64 20 3d 20 4e 3b 0a 20 20  expected = N;.  
30fa0 69 6e 74 20 69 46 69 72 73 74 20 3d 20 69 50 61  int iFirst = iPa
30fb0 67 65 3b 0a 20 20 77 68 69 6c 65 28 20 4e 2d 2d  ge;.  while( N--
30fc0 20 3e 20 30 20 26 26 20 70 43 68 65 63 6b 2d 3e   > 0 && pCheck->
30fd0 6d 78 45 72 72 20 29 7b 0a 20 20 20 20 44 62 50  mxErr ){.    DbP
30fe0 61 67 65 20 2a 70 4f 76 66 6c 50 61 67 65 3b 0a  age *pOvflPage;.
30ff0 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
31000 72 20 2a 70 4f 76 66 6c 44 61 74 61 3b 0a 20 20  r *pOvflData;.  
31010 20 20 69 66 28 20 69 50 61 67 65 3c 31 20 29 7b    if( iPage<1 ){
31020 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65  .      checkAppe
31030 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
31040 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20 20  ontext,.        
31050 20 22 25 64 20 6f 66 20 25 64 20 70 61 67 65 73   "%d of %d pages
31060 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 6f 76   missing from ov
31070 65 72 66 6c 6f 77 20 6c 69 73 74 20 73 74 61 72  erflow list star
31080 74 69 6e 67 20 61 74 20 25 64 22 2c 0a 20 20 20  ting at %d",.   
31090 20 20 20 20 20 20 20 4e 2b 31 2c 20 65 78 70 65         N+1, expe
310a0 63 74 65 64 2c 20 69 46 69 72 73 74 29 3b 0a 20  cted, iFirst);. 
310b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
310c0 7d 0a 20 20 20 20 69 66 28 20 63 68 65 63 6b 52  }.    if( checkR
310d0 65 66 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65  ef(pCheck, iPage
310e0 2c 20 7a 43 6f 6e 74 65 78 74 29 20 29 20 62 72  , zContext) ) br
310f0 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  eak;.    if( sql
31100 69 74 65 33 50 61 67 65 72 47 65 74 28 70 43 68  ite3PagerGet(pCh
31110 65 63 6b 2d 3e 70 50 61 67 65 72 2c 20 28 50 67  eck->pPager, (Pg
31120 6e 6f 29 69 50 61 67 65 2c 20 26 70 4f 76 66 6c  no)iPage, &pOvfl
31130 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 63  Page) ){.      c
31140 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
31150 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20  heck, zContext, 
31160 22 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 70  "failed to get p
31170 61 67 65 20 25 64 22 2c 20 69 50 61 67 65 29 3b  age %d", iPage);
31180 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
31190 20 20 7d 0a 20 20 20 20 70 4f 76 66 6c 44 61 74    }.    pOvflDat
311a0 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  a = (unsigned ch
311b0 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ar *)sqlite3Page
311c0 72 47 65 74 44 61 74 61 28 70 4f 76 66 6c 50 61  rGetData(pOvflPa
311d0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 69 73 46  ge);.    if( isF
311e0 72 65 65 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  reeList ){.     
311f0 20 69 6e 74 20 6e 20 3d 20 67 65 74 34 62 79 74   int n = get4byt
31200 65 28 26 70 4f 76 66 6c 44 61 74 61 5b 34 5d 29  e(&pOvflData[4])
31210 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
31220 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
31230 0a 20 20 20 20 20 20 69 66 28 20 70 43 68 65 63  .      if( pChec
31240 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  k->pBt->autoVacu
31250 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  um ){.        ch
31260 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b  eckPtrmap(pCheck
31270 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f  , iPage, PTRMAP_
31280 46 52 45 45 50 41 47 45 2c 20 30 2c 20 7a 43 6f  FREEPAGE, 0, zCo
31290 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a  ntext);.      }.
312a0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
312b0 20 6e 3e 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e   n>pCheck->pBt->
312c0 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 20 29  usableSize/4-8 )
312d0 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 41  {.        checkA
312e0 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
312f0 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20   zContext,.     
31300 20 20 20 20 20 20 22 66 72 65 65 6c 69 73 74 20        "freelist 
31310 6c 65 61 66 20 63 6f 75 6e 74 20 74 6f 6f 20 62  leaf count too b
31320 69 67 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 20  ig on page %d", 
31330 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  iPage);.        
31340 4e 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  N--;.      }else
31350 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  {.        for(i=
31360 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
31370 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72          Pgno iFr
31380 65 65 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  eePage = get4byt
31390 65 28 26 70 4f 76 66 6c 44 61 74 61 5b 38 2b 69  e(&pOvflData[8+i
313a0 2a 34 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  *4]);.#ifndef SQ
313b0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
313c0 43 55 55 4d 0a 20 20 20 20 20 20 20 20 20 20 69  CUUM.          i
313d0 66 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e  f( pCheck->pBt->
313e0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
313f0 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 50            checkP
31400 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 46  trmap(pCheck, iF
31410 72 65 65 50 61 67 65 2c 20 50 54 52 4d 41 50 5f  reePage, PTRMAP_
31420 46 52 45 45 50 41 47 45 2c 20 30 2c 20 7a 43 6f  FREEPAGE, 0, zCo
31430 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20  ntext);.        
31440 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
31450 20 20 20 20 20 63 68 65 63 6b 52 65 66 28 70 43       checkRef(pC
31460 68 65 63 6b 2c 20 69 46 72 65 65 50 61 67 65 2c  heck, iFreePage,
31470 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   zContext);.    
31480 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 4e 20      }.        N 
31490 2d 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  -= n;.      }.  
314a0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
314b0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
314c0 55 4d 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20  UM.    else{.   
314d0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61     /* If this da
314e0 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
314f0 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 6e 64 20  auto-vacuum and 
31500 69 50 61 67 65 20 69 73 20 6e 6f 74 20 74 68 65  iPage is not the
31510 20 6c 61 73 74 0a 20 20 20 20 20 20 2a 2a 20 70   last.      ** p
31520 61 67 65 20 69 6e 20 74 68 69 73 20 6f 76 65 72  age in this over
31530 66 6c 6f 77 20 6c 69 73 74 2c 20 63 68 65 63 6b  flow list, check
31540 20 74 68 61 74 20 74 68 65 20 70 6f 69 6e 74 65   that the pointe
31550 72 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a  r-map entry for.
31560 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c        ** the fol
31570 6c 6f 77 69 6e 67 20 70 61 67 65 20 6d 61 74 63  lowing page matc
31580 68 65 73 20 69 50 61 67 65 2e 0a 20 20 20 20 20  hes iPage..     
31590 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43   */.      if( pC
315a0 68 65 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56  heck->pBt->autoV
315b0 61 63 75 75 6d 20 26 26 20 4e 3e 30 20 29 7b 0a  acuum && N>0 ){.
315c0 20 20 20 20 20 20 20 20 69 20 3d 20 67 65 74 34          i = get4
315d0 62 79 74 65 28 70 4f 76 66 6c 44 61 74 61 29 3b  byte(pOvflData);
315e0 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74  .        checkPt
315f0 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 2c 20  rmap(pCheck, i, 
31600 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
31610 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78  , iPage, zContex
31620 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
31630 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 50 61  }.#endif.    iPa
31640 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 70 4f  ge = get4byte(pO
31650 76 66 6c 44 61 74 61 29 3b 0a 20 20 20 20 73 71  vflData);.    sq
31660 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
31670 70 4f 76 66 6c 50 61 67 65 29 3b 0a 20 20 7d 0a  pOvflPage);.  }.
31680 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
31690 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54  TE_OMIT_INTEGRIT
316a0 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e  Y_CHECK */..#ifn
316b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
316c0 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a  INTEGRITY_CHECK.
316d0 2f 2a 0a 2a 2a 20 44 6f 20 76 61 72 69 6f 75 73  /*.** Do various
316e0 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 20 6f   sanity checks o
316f0 6e 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  n a single page 
31700 6f 66 20 61 20 74 72 65 65 2e 20 20 52 65 74 75  of a tree.  Retu
31710 72 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 64  rn.** the tree d
31720 65 70 74 68 2e 20 20 52 6f 6f 74 20 70 61 67 65  epth.  Root page
31730 73 20 72 65 74 75 72 6e 20 30 2e 20 20 50 61 72  s return 0.  Par
31740 65 6e 74 73 20 6f 66 20 72 6f 6f 74 20 70 61 67  ents of root pag
31750 65 73 0a 2a 2a 20 72 65 74 75 72 6e 20 31 2c 20  es.** return 1, 
31760 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a  and so forth..**
31770 20 0a 2a 2a 20 54 68 65 73 65 20 63 68 65 63 6b   .** These check
31780 73 20 61 72 65 20 64 6f 6e 65 3a 0a 2a 2a 0a 2a  s are done:.**.*
31790 2a 20 20 20 20 20 20 31 2e 20 20 4d 61 6b 65 20  *      1.  Make 
317a0 73 75 72 65 20 74 68 61 74 20 63 65 6c 6c 73 20  sure that cells 
317b0 61 6e 64 20 66 72 65 65 62 6c 6f 63 6b 73 20 64  and freeblocks d
317c0 6f 20 6e 6f 74 20 6f 76 65 72 6c 61 70 0a 2a 2a  o not overlap.**
317d0 20 20 20 20 20 20 20 20 20 20 62 75 74 20 63 6f            but co
317e0 6d 62 69 6e 65 20 74 6f 20 63 6f 6d 70 6c 65 74  mbine to complet
317f0 65 6c 79 20 63 6f 76 65 72 20 74 68 65 20 70 61  ely cover the pa
31800 67 65 2e 0a 2a 2a 20 20 4e 4f 20 20 32 2e 20 20  ge..**  NO  2.  
31810 4d 61 6b 65 20 73 75 72 65 20 63 65 6c 6c 20 6b  Make sure cell k
31820 65 79 73 20 61 72 65 20 69 6e 20 6f 72 64 65 72  eys are in order
31830 2e 0a 2a 2a 20 20 4e 4f 20 20 33 2e 20 20 4d 61  ..**  NO  3.  Ma
31840 6b 65 20 73 75 72 65 20 6e 6f 20 6b 65 79 20 69  ke sure no key i
31850 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
31860 71 75 61 6c 20 74 6f 20 7a 4c 6f 77 65 72 42 6f  qual to zLowerBo
31870 75 6e 64 2e 0a 2a 2a 20 20 4e 4f 20 20 34 2e 20  und..**  NO  4. 
31880 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 6b 65   Make sure no ke
31890 79 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  y is greater tha
318a0 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 55  n or equal to zU
318b0 70 70 65 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20 20  pperBound..**   
318c0 20 20 20 35 2e 20 20 43 68 65 63 6b 20 74 68 65     5.  Check the
318d0 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 6f 76   integrity of ov
318e0 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a  erflow pages..**
318f0 20 20 20 20 20 20 36 2e 20 20 52 65 63 75 72 73        6.  Recurs
31900 69 76 65 6c 79 20 63 61 6c 6c 20 63 68 65 63 6b  ively call check
31910 54 72 65 65 50 61 67 65 20 6f 6e 20 61 6c 6c 20  TreePage on all 
31920 63 68 69 6c 64 72 65 6e 2e 0a 2a 2a 20 20 20 20  children..**    
31930 20 20 37 2e 20 20 56 65 72 69 66 79 20 74 68 61    7.  Verify tha
31940 74 20 74 68 65 20 64 65 70 74 68 20 6f 66 20 61  t the depth of a
31950 6c 6c 20 63 68 69 6c 64 72 65 6e 20 69 73 20 74  ll children is t
31960 68 65 20 73 61 6d 65 2e 0a 2a 2a 20 20 20 20 20  he same..**     
31970 20 38 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74   8.  Make sure t
31980 68 69 73 20 70 61 67 65 20 69 73 20 61 74 20 6c  his page is at l
31990 65 61 73 74 20 33 33 25 20 66 75 6c 6c 20 6f 72  east 33% full or
319a0 20 65 6c 73 65 20 69 74 20 69 73 0a 2a 2a 20 20   else it is.**  
319b0 20 20 20 20 20 20 20 20 74 68 65 20 72 6f 6f 74          the root
319c0 20 6f 66 20 74 68 65 20 74 72 65 65 2e 0a 2a 2f   of the tree..*/
319d0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63  .static int chec
319e0 6b 54 72 65 65 50 61 67 65 28 0a 20 20 49 6e 74  kTreePage(.  Int
319f0 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b  egrityCk *pCheck
31a00 2c 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f  ,  /* Context fo
31a10 72 20 74 68 65 20 73 61 6e 69 74 79 20 63 68 65  r the sanity che
31a20 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 67  ck */.  int iPag
31a30 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
31a40 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
31a50 74 68 65 20 70 61 67 65 20 74 6f 20 63 68 65 63  the page to chec
31a60 6b 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  k */.  MemPage *
31a70 70 50 61 72 65 6e 74 2c 20 20 20 20 20 2f 2a 20  pParent,     /* 
31a80 50 61 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20  Parent page */. 
31a90 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 43 6f   char *zParentCo
31aa0 6e 74 65 78 74 20 20 2f 2a 20 50 61 72 65 6e 74  ntext  /* Parent
31ab0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20   context */.){. 
31ac0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
31ad0 0a 20 20 69 6e 74 20 69 2c 20 72 63 2c 20 64 65  .  int i, rc, de
31ae0 70 74 68 2c 20 64 32 2c 20 70 67 6e 6f 2c 20 63  pth, d2, pgno, c
31af0 6e 74 3b 0a 20 20 69 6e 74 20 68 64 72 2c 20 63  nt;.  int hdr, c
31b00 65 6c 6c 53 74 61 72 74 3b 0a 20 20 69 6e 74 20  ellStart;.  int 
31b10 6e 43 65 6c 6c 3b 0a 20 20 75 38 20 2a 64 61 74  nCell;.  u8 *dat
31b20 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  a;.  BtShared *p
31b30 42 74 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c 65  Bt;.  int usable
31b40 53 69 7a 65 3b 0a 20 20 63 68 61 72 20 7a 43 6f  Size;.  char zCo
31b50 6e 74 65 78 74 5b 31 30 30 5d 3b 0a 20 20 63 68  ntext[100];.  ch
31b60 61 72 20 2a 68 69 74 3b 0a 0a 20 20 73 70 72 69  ar *hit;..  spri
31b70 6e 74 66 28 7a 43 6f 6e 74 65 78 74 2c 20 22 50  ntf(zContext, "P
31b80 61 67 65 20 25 64 3a 20 22 2c 20 69 50 61 67 65  age %d: ", iPage
31b90 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
31ba0 68 61 74 20 74 68 65 20 70 61 67 65 20 65 78 69  hat the page exi
31bb0 73 74 73 0a 20 20 2a 2f 0a 20 20 70 42 74 20 3d  sts.  */.  pBt =
31bc0 20 70 43 68 65 63 6b 2d 3e 70 42 74 3b 0a 20 20   pCheck->pBt;.  
31bd0 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
31be0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
31bf0 69 66 28 20 69 50 61 67 65 3d 3d 30 20 29 20 72  if( iPage==0 ) r
31c00 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 63  eturn 0;.  if( c
31c10 68 65 63 6b 52 65 66 28 70 43 68 65 63 6b 2c 20  heckRef(pCheck, 
31c20 69 50 61 67 65 2c 20 7a 50 61 72 65 6e 74 43 6f  iPage, zParentCo
31c30 6e 74 65 78 74 29 20 29 20 72 65 74 75 72 6e 20  ntext) ) return 
31c40 30 3b 0a 20 20 69 66 28 20 28 72 63 20 3d 20 67  0;.  if( (rc = g
31c50 65 74 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e  etPage(pBt, (Pgn
31c60 6f 29 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c  o)iPage, &pPage,
31c70 20 30 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 63   0))!=0 ){.    c
31c80 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
31c90 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a  heck, zContext,.
31ca0 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74         "unable t
31cb0 6f 20 67 65 74 20 74 68 65 20 70 61 67 65 2e 20  o get the page. 
31cc0 65 72 72 6f 72 20 63 6f 64 65 3d 25 64 22 2c 20  error code=%d", 
31cd0 72 63 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  rc);.    return 
31ce0 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 72 63  0;.  }.  if( (rc
31cf0 20 3d 20 69 6e 69 74 50 61 67 65 28 70 50 61 67   = initPage(pPag
31d00 65 2c 20 70 50 61 72 65 6e 74 29 29 21 3d 30 20  e, pParent))!=0 
31d10 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65  ){.    checkAppe
31d20 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
31d30 6f 6e 74 65 78 74 2c 20 22 69 6e 69 74 50 61 67  ontext, "initPag
31d40 65 28 29 20 72 65 74 75 72 6e 73 20 65 72 72 6f  e() returns erro
31d50 72 20 63 6f 64 65 20 25 64 22 2c 20 72 63 29 3b  r code %d", rc);
31d60 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
31d70 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74  (pPage);.    ret
31d80 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
31d90 20 43 68 65 63 6b 20 6f 75 74 20 61 6c 6c 20 74   Check out all t
31da0 68 65 20 63 65 6c 6c 73 2e 0a 20 20 2a 2f 0a 20  he cells..  */. 
31db0 20 64 65 70 74 68 20 3d 20 30 3b 0a 20 20 66 6f   depth = 0;.  fo
31dc0 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e  r(i=0; i<pPage->
31dd0 6e 43 65 6c 6c 20 26 26 20 70 43 68 65 63 6b 2d  nCell && pCheck-
31de0 3e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a 20 20  >mxErr; i++){.  
31df0 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20    u8 *pCell;.   
31e00 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20 43 65 6c   int sz;.    Cel
31e10 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 20  lInfo info;..   
31e20 20 2f 2a 20 43 68 65 63 6b 20 70 61 79 6c 6f 61   /* Check payloa
31e30 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  d overflow pages
31e40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 70 72 69  .    */.    spri
31e50 6e 74 66 28 7a 43 6f 6e 74 65 78 74 2c 20 22 4f  ntf(zContext, "O
31e60 6e 20 74 72 65 65 20 70 61 67 65 20 25 64 20 63  n tree page %d c
31e70 65 6c 6c 20 25 64 3a 20 22 2c 20 69 50 61 67 65  ell %d: ", iPage
31e80 2c 20 69 29 3b 0a 20 20 20 20 70 43 65 6c 6c 20  , i);.    pCell 
31e90 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
31ea0 2c 69 29 3b 0a 20 20 20 20 70 61 72 73 65 43 65  ,i);.    parseCe
31eb0 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
31ec0 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  ll, &info);.    
31ed0 73 7a 20 3d 20 69 6e 66 6f 2e 6e 44 61 74 61 3b  sz = info.nData;
31ee0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
31ef0 3e 69 6e 74 4b 65 79 20 29 20 73 7a 20 2b 3d 20  >intKey ) sz += 
31f00 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 61  info.nKey;.    a
31f10 73 73 65 72 74 28 20 73 7a 3d 3d 69 6e 66 6f 2e  ssert( sz==info.
31f20 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20  nPayload );.    
31f30 69 66 28 20 73 7a 3e 69 6e 66 6f 2e 6e 4c 6f 63  if( sz>info.nLoc
31f40 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  al ){.      int 
31f50 6e 50 61 67 65 20 3d 20 28 73 7a 20 2d 20 69 6e  nPage = (sz - in
31f60 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 75 73 61 62  fo.nLocal + usab
31f70 6c 65 53 69 7a 65 20 2d 20 35 29 2f 28 75 73 61  leSize - 5)/(usa
31f80 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
31f90 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66      Pgno pgnoOvf
31fa0 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43  l = get4byte(&pC
31fb0 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
31fc0 6f 77 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ow]);.#ifndef SQ
31fd0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
31fe0 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 70  CUUM.      if( p
31ff0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
32000 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 50  {.        checkP
32010 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 70 67  trmap(pCheck, pg
32020 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f  noOvfl, PTRMAP_O
32030 56 45 52 46 4c 4f 57 31 2c 20 69 50 61 67 65 2c  VERFLOW1, iPage,
32040 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   zContext);.    
32050 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
32060 20 63 68 65 63 6b 4c 69 73 74 28 70 43 68 65 63   checkList(pChec
32070 6b 2c 20 30 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  k, 0, pgnoOvfl, 
32080 6e 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29  nPage, zContext)
32090 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
320a0 43 68 65 63 6b 20 73 61 6e 69 74 79 20 6f 66 20  Check sanity of 
320b0 6c 65 66 74 20 63 68 69 6c 64 20 70 61 67 65 2e  left child page.
320c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
320d0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
320e0 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74        pgno = get
320f0 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 23 69  4byte(pCell);.#i
32100 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
32110 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
32120 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
32130 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
32140 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43    checkPtrmap(pC
32150 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 50 54 52 4d  heck, pgno, PTRM
32160 41 50 5f 42 54 52 45 45 2c 20 69 50 61 67 65 2c  AP_BTREE, iPage,
32170 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   zContext);.    
32180 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
32190 20 64 32 20 3d 20 63 68 65 63 6b 54 72 65 65 50   d2 = checkTreeP
321a0 61 67 65 28 70 43 68 65 63 6b 2c 70 67 6e 6f 2c  age(pCheck,pgno,
321b0 70 50 61 67 65 2c 7a 43 6f 6e 74 65 78 74 29 3b  pPage,zContext);
321c0 0a 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26  .      if( i>0 &
321d0 26 20 64 32 21 3d 64 65 70 74 68 20 29 7b 0a 20  & d2!=depth ){. 
321e0 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65         checkAppe
321f0 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
32200 6f 6e 74 65 78 74 2c 20 22 43 68 69 6c 64 20 70  ontext, "Child p
32210 61 67 65 20 64 65 70 74 68 20 64 69 66 66 65 72  age depth differ
32220 73 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  s");.      }.   
32230 20 20 20 64 65 70 74 68 20 3d 20 64 32 3b 0a 20     depth = d2;. 
32240 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21     }.  }.  if( !
32250 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
32260 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
32270 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
32280 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
32290 74 2b 38 5d 29 3b 0a 20 20 20 20 73 70 72 69 6e  t+8]);.    sprin
322a0 74 66 28 7a 43 6f 6e 74 65 78 74 2c 20 22 4f 6e  tf(zContext, "On
322b0 20 70 61 67 65 20 25 64 20 61 74 20 72 69 67 68   page %d at righ
322c0 74 20 63 68 69 6c 64 3a 20 22 2c 20 69 50 61 67  t child: ", iPag
322d0 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e);.#ifndef SQLI
322e0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
322f0 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  UM.    if( pBt->
32300 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
32310 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28      checkPtrmap(
32320 70 43 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 50 54  pCheck, pgno, PT
32330 52 4d 41 50 5f 42 54 52 45 45 2c 20 69 50 61 67  RMAP_BTREE, iPag
32340 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  e, 0);.    }.#en
32350 64 69 66 0a 20 20 20 20 63 68 65 63 6b 54 72 65  dif.    checkTre
32360 65 50 61 67 65 28 70 43 68 65 63 6b 2c 20 70 67  ePage(pCheck, pg
32370 6e 6f 2c 20 70 50 61 67 65 2c 20 7a 43 6f 6e 74  no, pPage, zCont
32380 65 78 74 29 3b 0a 20 20 7d 0a 20 0a 20 20 2f 2a  ext);.  }. .  /*
32390 20 43 68 65 63 6b 20 66 6f 72 20 63 6f 6d 70 6c   Check for compl
323a0 65 74 65 20 63 6f 76 65 72 61 67 65 20 6f 66 20  ete coverage of 
323b0 74 68 65 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20  the page.  */.  
323c0 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
323d0 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  ata;.  hdr = pPa
323e0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
323f0 20 68 69 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c   hit = sqliteMal
32400 6c 6f 63 28 20 75 73 61 62 6c 65 53 69 7a 65 20  loc( usableSize 
32410 29 3b 0a 20 20 69 66 28 20 68 69 74 20 29 7b 0a  );.  if( hit ){.
32420 20 20 20 20 6d 65 6d 73 65 74 28 68 69 74 2c 20      memset(hit, 
32430 31 2c 20 67 65 74 32 62 79 74 65 28 26 64 61 74  1, get2byte(&dat
32440 61 5b 68 64 72 2b 35 5d 29 29 3b 0a 20 20 20 20  a[hdr+5]));.    
32450 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65  nCell = get2byte
32460 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a  (&data[hdr+3]);.
32470 20 20 20 20 63 65 6c 6c 53 74 61 72 74 20 3d 20      cellStart = 
32480 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61  hdr + 12 - 4*pPa
32490 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 66 6f  ge->leaf;.    fo
324a0 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
324b0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
324c0 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
324d0 61 74 61 5b 63 65 6c 6c 53 74 61 72 74 2b 69 2a  ata[cellStart+i*
324e0 32 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 73  2]);.      int s
324f0 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ize = cellSizePt
32500 72 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70  r(pPage, &data[p
32510 63 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  c]);.      int j
32520 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 63 2b  ;.      if( (pc+
32530 73 69 7a 65 2d 31 29 3e 3d 75 73 61 62 6c 65 53  size-1)>=usableS
32540 69 7a 65 20 7c 7c 20 70 63 3c 30 20 29 7b 0a 20  ize || pc<0 ){. 
32550 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65         checkAppe
32560 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c  ndMsg(pCheck, 0,
32570 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43   .            "C
32580 6f 72 72 75 70 74 69 6f 6e 20 64 65 74 65 63 74  orruption detect
32590 65 64 20 69 6e 20 63 65 6c 6c 20 25 64 20 6f 6e  ed in cell %d on
325a0 20 70 61 67 65 20 25 64 22 2c 69 2c 69 50 61 67   page %d",i,iPag
325b0 65 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  e,0);.      }els
325c0 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  e{.        for(j
325d0 3d 70 63 2b 73 69 7a 65 2d 31 3b 20 6a 3e 3d 70  =pc+size-1; j>=p
325e0 63 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b 2b  c; j--) hit[j]++
325f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
32600 20 20 20 20 66 6f 72 28 63 6e 74 3d 30 2c 20 69      for(cnt=0, i
32610 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  =get2byte(&data[
32620 68 64 72 2b 31 5d 29 3b 20 69 3e 30 20 26 26 20  hdr+1]); i>0 && 
32630 69 3c 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20  i<usableSize && 
32640 63 6e 74 3c 31 30 30 30 30 3b 20 0a 20 20 20 20  cnt<10000; .    
32650 20 20 20 20 20 20 20 63 6e 74 2b 2b 29 7b 0a 20         cnt++){. 
32660 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20       int size = 
32670 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
32680 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  +2]);.      int 
32690 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 2b  j;.      if( (i+
326a0 73 69 7a 65 2d 31 29 3e 3d 75 73 61 62 6c 65 53  size-1)>=usableS
326b0 69 7a 65 20 7c 7c 20 69 3c 30 20 29 7b 0a 20 20  ize || i<0 ){.  
326c0 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
326d0 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 20  dMsg(pCheck, 0, 
326e0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43   .            "C
326f0 6f 72 72 75 70 74 69 6f 6e 20 64 65 74 65 63 74  orruption detect
32700 65 64 20 69 6e 20 63 65 6c 6c 20 25 64 20 6f 6e  ed in cell %d on
32710 20 70 61 67 65 20 25 64 22 2c 69 2c 69 50 61 67   page %d",i,iPag
32720 65 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  e,0);.      }els
32730 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  e{.        for(j
32740 3d 69 2b 73 69 7a 65 2d 31 3b 20 6a 3e 3d 69 3b  =i+size-1; j>=i;
32750 20 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b 2b 3b 0a   j--) hit[j]++;.
32760 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 20        }.      i 
32770 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
32780 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [i]);.    }.    
32790 66 6f 72 28 69 3d 63 6e 74 3d 30 3b 20 69 3c 75  for(i=cnt=0; i<u
327a0 73 61 62 6c 65 53 69 7a 65 3b 20 69 2b 2b 29 7b  sableSize; i++){
327b0 0a 20 20 20 20 20 20 69 66 28 20 68 69 74 5b 69  .      if( hit[i
327c0 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
327d0 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c  cnt++;.      }el
327e0 73 65 20 69 66 28 20 68 69 74 5b 69 5d 3e 31 20  se if( hit[i]>1 
327f0 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  ){.        check
32800 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
32810 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 22  , 0,.          "
32820 4d 75 6c 74 69 70 6c 65 20 75 73 65 73 20 66 6f  Multiple uses fo
32830 72 20 62 79 74 65 20 25 64 20 6f 66 20 70 61 67  r byte %d of pag
32840 65 20 25 64 22 2c 20 69 2c 20 69 50 61 67 65 29  e %d", i, iPage)
32850 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
32860 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
32870 20 20 20 69 66 28 20 63 6e 74 21 3d 64 61 74 61     if( cnt!=data
32880 5b 68 64 72 2b 37 5d 20 29 7b 0a 20 20 20 20 20  [hdr+7] ){.     
32890 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
328a0 70 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20  pCheck, 0, .    
328b0 20 20 20 20 20 20 22 46 72 61 67 6d 65 6e 74 65        "Fragmente
328c0 64 20 73 70 61 63 65 20 69 73 20 25 64 20 62 79  d space is %d by
328d0 74 65 20 72 65 70 6f 72 74 65 64 20 61 73 20 25  te reported as %
328e0 64 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 0a 20  d on page %d",. 
328f0 20 20 20 20 20 20 20 20 20 63 6e 74 2c 20 64 61           cnt, da
32900 74 61 5b 68 64 72 2b 37 5d 2c 20 69 50 61 67 65  ta[hdr+7], iPage
32910 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
32920 71 6c 69 74 65 46 72 65 65 28 68 69 74 29 3b 0a  qliteFree(hit);.
32930 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
32940 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Page);.  return 
32950 64 65 70 74 68 2b 31 3b 0a 7d 0a 23 65 6e 64 69  depth+1;.}.#endi
32960 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
32970 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
32980 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
32990 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49  ITE_OMIT_INTEGRI
329a0 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 54  TY_CHECK./*.** T
329b0 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
329c0 20 61 20 63 6f 6d 70 6c 65 74 65 20 63 68 65 63   a complete chec
329d0 6b 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 42  k of the given B
329e0 54 72 65 65 20 66 69 6c 65 2e 20 20 61 52 6f 6f  Tree file.  aRoo
329f0 74 5b 5d 20 69 73 0a 2a 2a 20 61 6e 20 61 72 72  t[] is.** an arr
32a00 61 79 20 6f 66 20 70 61 67 65 73 20 6e 75 6d 62  ay of pages numb
32a10 65 72 73 20 77 65 72 65 20 65 61 63 68 20 70 61  ers were each pa
32a20 67 65 20 6e 75 6d 62 65 72 20 69 73 20 74 68 65  ge number is the
32a30 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a   root page of.**
32a40 20 61 20 74 61 62 6c 65 2e 20 20 6e 52 6f 6f 74   a table.  nRoot
32a50 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
32a60 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 52 6f  f entries in aRo
32a70 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65  ot..**.** If eve
32a80 72 79 74 68 69 6e 67 20 63 68 65 63 6b 73 20 6f  rything checks o
32a90 75 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ut, this routine
32aa0 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 20 20   returns NULL.  
32ab0 49 66 20 73 6f 6d 65 74 68 69 6e 67 20 69 73 0a  If something is.
32ac0 2a 2a 20 61 6d 69 73 73 2c 20 61 6e 20 65 72 72  ** amiss, an err
32ad0 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 77 72  or message is wr
32ae0 69 74 74 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72  itten into memor
32af0 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
32b00 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 61 6e 64 20  malloc().** and 
32b10 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 61  a pointer to tha
32b20 74 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  t error message 
32b30 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 54 68  is returned.  Th
32b40 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
32b50 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73  on.** is respons
32b60 69 62 6c 65 20 66 6f 72 20 66 72 65 65 69 6e 67  ible for freeing
32b70 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
32b80 67 65 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f  ge when it is do
32b90 6e 65 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  ne..*/.char *sql
32ba0 69 74 65 33 42 74 72 65 65 49 6e 74 65 67 72 69  ite3BtreeIntegri
32bb0 74 79 43 68 65 63 6b 28 0a 20 20 42 74 72 65 65  tyCheck(.  Btree
32bc0 20 2a 70 2c 20 20 20 20 20 2f 2a 20 54 68 65 20   *p,     /* The 
32bd0 62 74 72 65 65 20 74 6f 20 62 65 20 63 68 65 63  btree to be chec
32be0 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 52  ked */.  int *aR
32bf0 6f 6f 74 2c 20 20 20 2f 2a 20 41 6e 20 61 72 72  oot,   /* An arr
32c00 61 79 20 6f 66 20 72 6f 6f 74 20 70 61 67 65 73  ay of root pages
32c10 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 69 6e 64   numbers for ind
32c20 69 76 69 64 75 61 6c 20 74 72 65 65 73 20 2a 2f  ividual trees */
32c30 0a 20 20 69 6e 74 20 6e 52 6f 6f 74 2c 20 20 20  .  int nRoot,   
32c40 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
32c50 74 72 69 65 73 20 69 6e 20 61 52 6f 6f 74 5b 5d  tries in aRoot[]
32c60 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 45 72 72 2c   */.  int mxErr,
32c70 20 20 20 20 2f 2a 20 53 74 6f 70 20 72 65 70 6f      /* Stop repo
32c80 72 74 69 6e 67 20 65 72 72 6f 72 73 20 61 66 74  rting errors aft
32c90 65 72 20 74 68 69 73 20 6d 61 6e 79 20 2a 2f 0a  er this many */.
32ca0 20 20 69 6e 74 20 2a 70 6e 45 72 72 20 20 20 20    int *pnErr    
32cb0 2f 2a 20 57 72 69 74 65 20 6e 75 6d 62 65 72 20  /* Write number 
32cc0 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e 20 74  of errors seen t
32cd0 6f 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 20  o this variable 
32ce0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
32cf0 20 69 6e 74 20 6e 52 65 66 3b 0a 20 20 49 6e 74   int nRef;.  Int
32d00 65 67 72 69 74 79 43 6b 20 73 43 68 65 63 6b 3b  egrityCk sCheck;
32d10 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
32d20 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 6e 52   = p->pBt;..  nR
32d30 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ef = sqlite3Page
32d40 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70  rRefcount(pBt->p
32d50 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 6c 6f  Pager);.  if( lo
32d60 63 6b 42 74 72 65 65 57 69 74 68 52 65 74 72 79  ckBtreeWithRetry
32d70 28 70 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  (p)!=SQLITE_OK )
32d80 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  {.    return sql
32d90 69 74 65 53 74 72 44 75 70 28 22 55 6e 61 62 6c  iteStrDup("Unabl
32da0 65 20 74 6f 20 61 63 71 75 69 72 65 20 61 20 72  e to acquire a r
32db0 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead lock on the 
32dc0 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20 7d 0a  database");.  }.
32dd0 20 20 73 43 68 65 63 6b 2e 70 42 74 20 3d 20 70    sCheck.pBt = p
32de0 42 74 3b 0a 20 20 73 43 68 65 63 6b 2e 70 50 61  Bt;.  sCheck.pPa
32df0 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
32e00 72 3b 0a 20 20 73 43 68 65 63 6b 2e 6e 50 61 67  r;.  sCheck.nPag
32e10 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  e = sqlite3Pager
32e20 50 61 67 65 63 6f 75 6e 74 28 73 43 68 65 63 6b  Pagecount(sCheck
32e30 2e 70 50 61 67 65 72 29 3b 0a 20 20 73 43 68 65  .pPager);.  sChe
32e40 63 6b 2e 6d 78 45 72 72 20 3d 20 6d 78 45 72 72  ck.mxErr = mxErr
32e50 3b 0a 20 20 73 43 68 65 63 6b 2e 6e 45 72 72 20  ;.  sCheck.nErr 
32e60 3d 20 30 3b 0a 20 20 2a 70 6e 45 72 72 20 3d 20  = 0;.  *pnErr = 
32e70 30 3b 0a 20 20 69 66 28 20 73 43 68 65 63 6b 2e  0;.  if( sCheck.
32e80 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nPage==0 ){.    
32e90 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
32ea0 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 72 65  sed(pBt);.    re
32eb0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 43  turn 0;.  }.  sC
32ec0 68 65 63 6b 2e 61 6e 52 65 66 20 3d 20 73 71 6c  heck.anRef = sql
32ed0 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 28 73  iteMallocRaw( (s
32ee0 43 68 65 63 6b 2e 6e 50 61 67 65 2b 31 29 2a 73  Check.nPage+1)*s
32ef0 69 7a 65 6f 66 28 73 43 68 65 63 6b 2e 61 6e 52  izeof(sCheck.anR
32f00 65 66 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20  ef[0]) );.  if( 
32f10 21 73 43 68 65 63 6b 2e 61 6e 52 65 66 20 29 7b  !sCheck.anRef ){
32f20 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  .    unlockBtree
32f30 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
32f40 20 20 20 2a 70 6e 45 72 72 20 3d 20 31 3b 0a 20     *pnErr = 1;. 
32f50 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
32f60 33 4d 50 72 69 6e 74 66 28 22 55 6e 61 62 6c 65  3MPrintf("Unable
32f70 20 74 6f 20 6d 61 6c 6c 6f 63 20 25 64 20 62 79   to malloc %d by
32f80 74 65 73 22 2c 20 0a 20 20 20 20 20 20 20 20 28  tes", .        (
32f90 73 43 68 65 63 6b 2e 6e 50 61 67 65 2b 31 29 2a  sCheck.nPage+1)*
32fa0 73 69 7a 65 6f 66 28 73 43 68 65 63 6b 2e 61 6e  sizeof(sCheck.an
32fb0 52 65 66 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20  Ref[0]));.  }.  
32fc0 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 73 43 68 65  for(i=0; i<=sChe
32fd0 63 6b 2e 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 20  ck.nPage; i++){ 
32fe0 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 20  sCheck.anRef[i] 
32ff0 3d 20 30 3b 20 7d 0a 20 20 69 20 3d 20 50 45 4e  = 0; }.  i = PEN
33000 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
33010 42 74 29 3b 0a 20 20 69 66 28 20 69 3c 3d 73 43  Bt);.  if( i<=sC
33020 68 65 63 6b 2e 6e 50 61 67 65 20 29 7b 0a 20 20  heck.nPage ){.  
33030 20 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69    sCheck.anRef[i
33040 5d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 43 68  ] = 1;.  }.  sCh
33050 65 63 6b 2e 7a 45 72 72 4d 73 67 20 3d 20 30 3b  eck.zErrMsg = 0;
33060 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65  ..  /* Check the
33070 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68   integrity of th
33080 65 20 66 72 65 65 6c 69 73 74 0a 20 20 2a 2f 0a  e freelist.  */.
33090 20 20 63 68 65 63 6b 4c 69 73 74 28 26 73 43 68    checkList(&sCh
330a0 65 63 6b 2c 20 31 2c 20 67 65 74 34 62 79 74 65  eck, 1, get4byte
330b0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
330c0 44 61 74 61 5b 33 32 5d 29 2c 0a 20 20 20 20 20  Data[32]),.     
330d0 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28         get4byte(
330e0 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
330f0 61 74 61 5b 33 36 5d 29 2c 20 22 4d 61 69 6e 20  ata[36]), "Main 
33100 66 72 65 65 6c 69 73 74 3a 20 22 29 3b 0a 0a 20  freelist: ");.. 
33110 20 2f 2a 20 43 68 65 63 6b 20 61 6c 6c 20 74 68   /* Check all th
33120 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  e tables..  */. 
33130 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 6f 6f   for(i=0; i<nRoo
33140 74 20 26 26 20 73 43 68 65 63 6b 2e 6d 78 45 72  t && sCheck.mxEr
33150 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  r; i++){.    if(
33160 20 61 52 6f 6f 74 5b 69 5d 3d 3d 30 20 29 20 63   aRoot[i]==0 ) c
33170 6f 6e 74 69 6e 75 65 3b 0a 23 69 66 6e 64 65 66  ontinue;.#ifndef
33180 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
33190 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
331a0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
331b0 26 26 20 61 52 6f 6f 74 5b 69 5d 3e 31 20 29 7b  && aRoot[i]>1 ){
331c0 0a 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d  .      checkPtrm
331d0 61 70 28 26 73 43 68 65 63 6b 2c 20 61 52 6f 6f  ap(&sCheck, aRoo
331e0 74 5b 69 5d 2c 20 50 54 52 4d 41 50 5f 52 4f 4f  t[i], PTRMAP_ROO
331f0 54 50 41 47 45 2c 20 30 2c 20 30 29 3b 0a 20 20  TPAGE, 0, 0);.  
33200 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
33210 68 65 63 6b 54 72 65 65 50 61 67 65 28 26 73 43  heckTreePage(&sC
33220 68 65 63 6b 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20  heck, aRoot[i], 
33230 30 2c 20 22 4c 69 73 74 20 6f 66 20 74 72 65 65  0, "List of tree
33240 20 72 6f 6f 74 73 3a 20 22 29 3b 0a 20 20 7d 0a   roots: ");.  }.
33250 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
33260 65 76 65 72 79 20 70 61 67 65 20 69 6e 20 74 68  every page in th
33270 65 20 66 69 6c 65 20 69 73 20 72 65 66 65 72 65  e file is refere
33280 6e 63 65 64 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  nced.  */.  for(
33290 69 3d 31 3b 20 69 3c 3d 73 43 68 65 63 6b 2e 6e  i=1; i<=sCheck.n
332a0 50 61 67 65 20 26 26 20 73 43 68 65 63 6b 2e 6d  Page && sCheck.m
332b0 78 45 72 72 3b 20 69 2b 2b 29 7b 0a 23 69 66 64  xErr; i++){.#ifd
332c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
332d0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
332e0 28 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69  ( sCheck.anRef[i
332f0 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68  ]==0 ){.      ch
33300 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43  eckAppendMsg(&sC
33310 68 65 63 6b 2c 20 30 2c 20 22 50 61 67 65 20 25  heck, 0, "Page %
33320 64 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 22  d is never used"
33330 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 23 65 6c 73  , i);.    }.#els
33340 65 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  e.    /* If the 
33350 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74  database support
33360 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 6d  s auto-vacuum, m
33370 61 6b 65 20 73 75 72 65 20 6e 6f 20 74 61 62 6c  ake sure no tabl
33380 65 73 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a  es contain.    *
33390 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  * references to 
333a0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
333b0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
333c0 28 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69  ( sCheck.anRef[i
333d0 5d 3d 3d 30 20 26 26 20 0a 20 20 20 20 20 20 20  ]==0 && .       
333e0 28 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70  (PTRMAP_PAGENO(p
333f0 42 74 2c 20 69 29 21 3d 69 20 7c 7c 20 21 70 42  Bt, i)!=i || !pB
33400 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 20 29  t->autoVacuum) )
33410 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70  {.      checkApp
33420 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20  endMsg(&sCheck, 
33430 30 2c 20 22 50 61 67 65 20 25 64 20 69 73 20 6e  0, "Page %d is n
33440 65 76 65 72 20 75 73 65 64 22 2c 20 69 29 3b 0a  ever used", i);.
33450 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 43      }.    if( sC
33460 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 21 3d 30  heck.anRef[i]!=0
33470 20 26 26 20 0a 20 20 20 20 20 20 20 28 50 54 52   && .       (PTR
33480 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
33490 69 29 3d 3d 69 20 26 26 20 70 42 74 2d 3e 61 75  i)==i && pBt->au
334a0 74 6f 56 61 63 75 75 6d 29 20 29 7b 0a 20 20 20  toVacuum) ){.   
334b0 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
334c0 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 22 50  g(&sCheck, 0, "P
334d0 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
334e0 25 64 20 69 73 20 72 65 66 65 72 65 6e 63 65 64  %d is referenced
334f0 22 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  ", i);.    }.#en
33500 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  dif.  }..  /* Ma
33510 6b 65 20 73 75 72 65 20 74 68 69 73 20 61 6e 61  ke sure this ana
33520 6c 79 73 69 73 20 64 69 64 20 6e 6f 74 20 6c 65  lysis did not le
33530 61 76 65 20 61 6e 79 20 75 6e 72 65 66 28 29 20  ave any unref() 
33540 70 61 67 65 73 0a 20 20 2a 2f 0a 20 20 75 6e 6c  pages.  */.  unl
33550 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
33560 28 70 42 74 29 3b 0a 20 20 69 66 28 20 6e 52 65  (pBt);.  if( nRe
33570 66 20 21 3d 20 73 71 6c 69 74 65 33 50 61 67 65  f != sqlite3Page
33580 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70  rRefcount(pBt->p
33590 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 63 68  Pager) ){.    ch
335a0 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43  eckAppendMsg(&sC
335b0 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20  heck, 0, .      
335c0 22 4f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67  "Outstanding pag
335d0 65 20 63 6f 75 6e 74 20 67 6f 65 73 20 66 72 6f  e count goes fro
335e0 6d 20 25 64 20 74 6f 20 25 64 20 64 75 72 69 6e  m %d to %d durin
335f0 67 20 74 68 69 73 20 61 6e 61 6c 79 73 69 73 22  g this analysis"
33600 2c 0a 20 20 20 20 20 20 6e 52 65 66 2c 20 73 71  ,.      nRef, sq
33610 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
33620 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 0a  nt(pBt->pPager).
33630 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a      );.  }..  /*
33640 20 43 6c 65 61 6e 20 20 75 70 20 61 6e 64 20 72   Clean  up and r
33650 65 70 6f 72 74 20 65 72 72 6f 72 73 2e 0a 20 20  eport errors..  
33660 2a 2f 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  */.  sqliteFree(
33670 73 43 68 65 63 6b 2e 61 6e 52 65 66 29 3b 0a 20  sCheck.anRef);. 
33680 20 2a 70 6e 45 72 72 20 3d 20 73 43 68 65 63 6b   *pnErr = sCheck
33690 2e 6e 45 72 72 3b 0a 20 20 72 65 74 75 72 6e 20  .nErr;.  return 
336a0 73 43 68 65 63 6b 2e 7a 45 72 72 4d 73 67 3b 0a  sCheck.zErrMsg;.
336b0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
336c0 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54  TE_OMIT_INTEGRIT
336d0 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 2f 2a 0a 2a  Y_CHECK */../*.*
336e0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c  * Return the ful
336f0 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  l pathname of th
33700 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74  e underlying dat
33710 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63  abase file..*/.c
33720 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
33730 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
33740 6d 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  me(Btree *p){.  
33750 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e  assert( p->pBt->
33760 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 72  pPager!=0 );.  r
33770 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 61 67  eturn sqlite3Pag
33780 65 72 46 69 6c 65 6e 61 6d 65 28 70 2d 3e 70 42  erFilename(p->pB
33790 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f  t->pPager);.}../
337a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
337b0 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20  pathname of the 
337c0 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63  directory that c
337d0 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61  ontains the data
337e0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  base file..*/.co
337f0 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
33800 33 42 74 72 65 65 47 65 74 44 69 72 6e 61 6d 65  3BtreeGetDirname
33810 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73  (Btree *p){.  as
33820 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 70 50  sert( p->pBt->pP
33830 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 72 65 74  ager!=0 );.  ret
33840 75 72 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72  urn sqlite3Pager
33850 44 69 72 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e  Dirname(p->pBt->
33860 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pPager);.}../*.*
33870 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 74  * Return the pat
33880 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75  hname of the jou
33890 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 74 68  rnal file for th
338a0 69 73 20 64 61 74 61 62 61 73 65 2e 20 54 68 65  is database. The
338b0 20 72 65 74 75 72 6e 0a 2a 2a 20 76 61 6c 75 65   return.** value
338c0 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
338d0 20 69 73 20 74 68 65 20 73 61 6d 65 20 72 65 67   is the same reg
338e0 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
338f0 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  er the journal f
33900 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ile.** has been 
33910 63 72 65 61 74 65 64 20 6f 72 20 6e 6f 74 2e 0a  created or not..
33920 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
33930 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f  qlite3BtreeGetJo
33940 75 72 6e 61 6c 6e 61 6d 65 28 42 74 72 65 65 20  urnalname(Btree 
33950 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
33960 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30  ->pBt->pPager!=0
33970 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   );.  return sql
33980 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c  ite3PagerJournal
33990 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61  name(p->pBt->pPa
339a0 67 65 72 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  ger);.}..#ifndef
339b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43   SQLITE_OMIT_VAC
339c0 55 55 4d 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74  UUM./*.** Copy t
339d0 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74  he complete cont
339e0 65 6e 74 20 6f 66 20 70 42 74 46 72 6f 6d 20 69  ent of pBtFrom i
339f0 6e 74 6f 20 70 42 74 54 6f 2e 20 20 41 20 74 72  nto pBtTo.  A tr
33a00 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73  ansaction.** mus
33a10 74 20 62 65 20 61 63 74 69 76 65 20 66 6f 72 20  t be active for 
33a20 62 6f 74 68 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  both files..**.*
33a30 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 66 69  * The size of fi
33a40 6c 65 20 70 42 74 46 72 6f 6d 20 6d 61 79 20 62  le pBtFrom may b
33a50 65 20 72 65 64 75 63 65 64 20 62 79 20 74 68 69  e reduced by thi
33a60 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20  s operation..** 
33a70 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  If anything goes
33a80 20 77 72 6f 6e 67 2c 20 74 68 65 20 74 72 61 6e   wrong, the tran
33a90 73 61 63 74 69 6f 6e 20 6f 6e 20 70 42 74 46 72  saction on pBtFr
33aa0 6f 6d 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  om is rolled bac
33ab0 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
33ac0 33 42 74 72 65 65 43 6f 70 79 46 69 6c 65 28 42  3BtreeCopyFile(B
33ad0 74 72 65 65 20 2a 70 54 6f 2c 20 42 74 72 65 65  tree *pTo, Btree
33ae0 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 6e 74 20   *pFrom){.  int 
33af0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
33b00 20 20 50 67 6e 6f 20 69 2c 20 6e 50 61 67 65 2c    Pgno i, nPage,
33b10 20 6e 54 6f 50 61 67 65 2c 20 69 53 6b 69 70 3b   nToPage, iSkip;
33b20 0a 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ..  BtShared *pB
33b30 74 54 6f 20 3d 20 70 54 6f 2d 3e 70 42 74 3b 0a  tTo = pTo->pBt;.
33b40 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 46    BtShared *pBtF
33b50 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e 70 42 74  rom = pFrom->pBt
33b60 3b 0a 0a 20 20 69 66 28 20 70 54 6f 2d 3e 69 6e  ;..  if( pTo->in
33b70 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49  Trans!=TRANS_WRI
33b80 54 45 20 7c 7c 20 70 46 72 6f 6d 2d 3e 69 6e 54  TE || pFrom->inT
33b90 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54  rans!=TRANS_WRIT
33ba0 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  E ){.    return 
33bb0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
33bc0 7d 0a 20 20 69 66 28 20 70 42 74 54 6f 2d 3e 70  }.  if( pBtTo->p
33bd0 43 75 72 73 6f 72 20 29 20 72 65 74 75 72 6e 20  Cursor ) return 
33be0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 6e  SQLITE_BUSY;.  n
33bf0 54 6f 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33  ToPage = sqlite3
33c00 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
33c10 42 74 54 6f 2d 3e 70 50 61 67 65 72 29 3b 0a 20  BtTo->pPager);. 
33c20 20 6e 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33   nPage = sqlite3
33c30 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
33c40 42 74 46 72 6f 6d 2d 3e 70 50 61 67 65 72 29 3b  BtFrom->pPager);
33c50 0a 20 20 69 53 6b 69 70 20 3d 20 50 45 4e 44 49  .  iSkip = PENDI
33c60 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
33c70 54 6f 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20  To);.  for(i=1; 
33c80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
33c90 20 69 3c 3d 6e 50 61 67 65 3b 20 69 2b 2b 29 7b   i<=nPage; i++){
33ca0 0a 20 20 20 20 44 62 50 61 67 65 20 2a 70 44 62  .    DbPage *pDb
33cb0 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20 69 3d  Page;.    if( i=
33cc0 3d 69 53 6b 69 70 20 29 20 63 6f 6e 74 69 6e 75  =iSkip ) continu
33cd0 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e;.    rc = sqli
33ce0 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 46  te3PagerGet(pBtF
33cf0 72 6f 6d 2d 3e 70 50 61 67 65 72 2c 20 69 2c 20  rom->pPager, i, 
33d00 26 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  &pDbPage);.    i
33d10 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20  f( rc ) break;. 
33d20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
33d30 61 67 65 72 4f 76 65 72 77 72 69 74 65 28 70 42  agerOverwrite(pB
33d40 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20 69 2c 20  tTo->pPager, i, 
33d50 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
33d60 61 74 61 28 70 44 62 50 61 67 65 29 29 3b 0a 20  ata(pDbPage));. 
33d70 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
33d80 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
33d90 20 7d 0a 20 20 66 6f 72 28 69 3d 6e 50 61 67 65   }.  for(i=nPage
33da0 2b 31 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  +1; rc==SQLITE_O
33db0 4b 20 26 26 20 69 3c 3d 6e 54 6f 50 61 67 65 3b  K && i<=nToPage;
33dc0 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 50 61 67   i++){.    DbPag
33dd0 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20  e *pDbPage;.    
33de0 69 66 28 20 69 3d 3d 69 53 6b 69 70 20 29 20 63  if( i==iSkip ) c
33df0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 72 63 20  ontinue;.    rc 
33e00 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
33e10 74 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c  t(pBtTo->pPager,
33e20 20 69 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20   i, &pDbPage);. 
33e30 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61     if( rc ) brea
33e40 6b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  k;.    rc = sqli
33e50 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44  te3PagerWrite(pD
33e60 62 50 61 67 65 29 3b 0a 20 20 20 20 73 71 6c 69  bPage);.    sqli
33e70 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
33e80 62 50 61 67 65 29 3b 0a 20 20 20 20 73 71 6c 69  bPage);.    sqli
33e90 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
33ea0 65 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c  e(pBtTo->pPager,
33eb0 20 69 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21   i);.  }.  if( !
33ec0 72 63 20 26 26 20 6e 50 61 67 65 3c 6e 54 6f 50  rc && nPage<nToP
33ed0 61 67 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  age ){.    rc = 
33ee0 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
33ef0 63 61 74 65 28 70 42 74 54 6f 2d 3e 70 50 61 67  cate(pBtTo->pPag
33f00 65 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20 7d 0a  er, nPage);.  }.
33f10 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
33f20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
33f30 62 61 63 6b 28 70 54 6f 29 3b 0a 20 20 7d 0a 20  back(pTo);.  }. 
33f40 20 72 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a   return rc;  .}.
33f50 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
33f60 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 20 2a 2f 0a  _OMIT_VACUUM */.
33f70 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f  ./*.** Return no
33f80 6e 2d 7a 65 72 6f 20 69 66 20 61 20 74 72 61 6e  n-zero if a tran
33f90 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
33fa0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
33fb0 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28  3BtreeIsInTrans(
33fc0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74  Btree *p){.  ret
33fd0 75 72 6e 20 28 70 20 26 26 20 28 70 2d 3e 69 6e  urn (p && (p->in
33fe0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
33ff0 54 45 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  TE));.}../*.** R
34000 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
34010 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  f a statement tr
34020 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
34030 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ive..*/.int sqli
34040 74 65 33 42 74 72 65 65 49 73 49 6e 53 74 6d 74  te3BtreeIsInStmt
34050 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65  (Btree *p){.  re
34060 74 75 72 6e 20 28 70 2d 3e 70 42 74 20 26 26 20  turn (p->pBt && 
34070 70 2d 3e 70 42 74 2d 3e 69 6e 53 74 6d 74 29 3b  p->pBt->inStmt);
34080 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
34090 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 61 20 72   non-zero if a r
340a0 65 61 64 20 28 6f 72 20 77 72 69 74 65 29 20 74  ead (or write) t
340b0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
340c0 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tive..*/.int sql
340d0 69 74 65 33 42 74 72 65 65 49 73 49 6e 52 65 61  ite3BtreeIsInRea
340e0 64 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70 29  dTrans(Btree *p)
340f0 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 20 26 26  {.  return (p &&
34100 20 28 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52   (p->inTrans!=TR
34110 41 4e 53 5f 4e 4f 4e 45 29 29 3b 0a 7d 0a 0a 2f  ANS_NONE));.}../
34120 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
34130 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  on returns a poi
34140 6e 74 65 72 20 74 6f 20 61 20 62 6c 6f 62 20 6f  nter to a blob o
34150 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  f memory associa
34160 74 65 64 20 77 69 74 68 0a 2a 2a 20 61 20 73 69  ted with.** a si
34170 6e 67 6c 65 20 73 68 61 72 65 64 2d 62 74 72 65  ngle shared-btre
34180 65 2e 20 54 68 65 20 6d 65 6d 6f 72 79 20 69 73  e. The memory is
34190 20 75 73 65 64 20 62 79 20 63 6c 69 65 6e 74 20   used by client 
341a0 63 6f 64 65 20 66 6f 72 20 69 74 27 73 20 6f 77  code for it's ow
341b0 6e 0a 2a 2a 20 70 75 72 70 6f 73 65 73 20 28 66  n.** purposes (f
341c0 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 6f 20 73  or example, to s
341d0 74 6f 72 65 20 61 20 68 69 67 68 2d 6c 65 76 65  tore a high-leve
341e0 6c 20 73 63 68 65 6d 61 20 61 73 73 6f 63 69 61  l schema associa
341f0 74 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65  ted with .** the
34200 20 73 68 61 72 65 64 2d 62 74 72 65 65 29 2e 20   shared-btree). 
34210 54 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 20  The btree layer 
34220 6d 61 6e 61 67 65 73 20 72 65 66 65 72 65 6e 63  manages referenc
34230 65 20 63 6f 75 6e 74 69 6e 67 20 69 73 73 75 65  e counting issue
34240 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  s..**.** The fir
34250 73 74 20 74 69 6d 65 20 74 68 69 73 20 69 73 20  st time this is 
34260 63 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72  called on a shar
34270 65 64 2d 62 74 72 65 65 2c 20 6e 42 79 74 65 73  ed-btree, nBytes
34280 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
34290 0a 2a 2a 20 61 72 65 20 61 6c 6c 6f 63 61 74 65  .** are allocate
342a0 64 2c 20 7a 65 72 6f 65 64 2c 20 61 6e 64 20 72  d, zeroed, and r
342b0 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
342c0 61 6c 6c 65 72 2e 20 46 6f 72 20 65 61 63 68 20  aller. For each 
342d0 73 75 62 73 65 71 75 65 6e 74 20 0a 2a 2a 20 63  subsequent .** c
342e0 61 6c 6c 20 74 68 65 20 6e 42 79 74 65 73 20 70  all the nBytes p
342f0 61 72 61 6d 65 74 65 72 20 69 73 20 69 67 6e 6f  arameter is igno
34300 72 65 64 20 61 6e 64 20 61 20 70 6f 69 6e 74 65  red and a pointe
34310 72 20 74 6f 20 74 68 65 20 73 61 6d 65 20 62 6c  r to the same bl
34320 6f 62 0a 2a 2a 20 6f 66 20 6d 65 6d 6f 72 79 20  ob.** of memory 
34330 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 0a 2a 2a  returned. .**.**
34340 20 4a 75 73 74 20 62 65 66 6f 72 65 20 74 68 65   Just before the
34350 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 69 73   shared-btree is
34360 20 63 6c 6f 73 65 64 2c 20 74 68 65 20 66 75 6e   closed, the fun
34370 63 74 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20  ction passed as 
34380 74 68 65 20 0a 2a 2a 20 78 46 72 65 65 20 61 72  the .** xFree ar
34390 67 75 6d 65 6e 74 20 77 68 65 6e 20 74 68 65 20  gument when the 
343a0 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
343b0 6e 20 77 61 73 20 6d 61 64 65 20 69 73 20 69 6e  n was made is in
343c0 76 6f 6b 65 64 20 6f 6e 20 74 68 65 20 0a 2a 2a  voked on the .**
343d0 20 62 6c 6f 62 20 6f 66 20 61 6c 6c 6f 63 61 74   blob of allocat
343e0 65 64 20 6d 65 6d 6f 72 79 2e 20 54 68 69 73 20  ed memory. This 
343f0 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
34400 6e 6f 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 46  not call sqliteF
34410 72 65 65 28 29 0a 2a 2a 20 6f 6e 20 74 68 65 20  ree().** on the 
34420 6d 65 6d 6f 72 79 2c 20 74 68 65 20 62 74 72 65  memory, the btre
34430 65 20 6c 61 79 65 72 20 64 6f 65 73 20 74 68 61  e layer does tha
34440 74 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  t..*/.void *sqli
34450 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 42  te3BtreeSchema(B
34460 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e 42 79  tree *p, int nBy
34470 74 65 73 2c 20 76 6f 69 64 28 2a 78 46 72 65 65  tes, void(*xFree
34480 29 28 76 6f 69 64 20 2a 29 29 7b 0a 20 20 42 74  )(void *)){.  Bt
34490 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
344a0 3e 70 42 74 3b 0a 20 20 69 66 28 20 21 70 42 74  >pBt;.  if( !pBt
344b0 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
344c0 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 3d 20   pBt->pSchema = 
344d0 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e 42 79  sqliteMalloc(nBy
344e0 74 65 73 29 3b 0a 20 20 20 20 70 42 74 2d 3e 78  tes);.    pBt->x
344f0 46 72 65 65 53 63 68 65 6d 61 20 3d 20 78 46 72  FreeSchema = xFr
34500 65 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ee;.  }.  return
34510 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 7d   pBt->pSchema;.}
34520 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
34530 72 75 65 20 69 66 20 61 6e 6f 74 68 65 72 20 75  rue if another u
34540 73 65 72 20 6f 66 20 74 68 65 20 73 61 6d 65 20  ser of the same 
34550 73 68 61 72 65 64 20 62 74 72 65 65 20 61 73 20  shared btree as 
34560 74 68 65 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  the argument.** 
34570 68 61 6e 64 6c 65 20 68 6f 6c 64 73 20 61 6e 20  handle holds an 
34580 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f  exclusive lock o
34590 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
345a0 74 65 72 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e  ter table..*/.in
345b0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 63  t sqlite3BtreeSc
345c0 68 65 6d 61 4c 6f 63 6b 65 64 28 42 74 72 65 65  hemaLocked(Btree
345d0 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 28   *p){.  return (
345e0 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70  queryTableLock(p
345f0 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52  , MASTER_ROOT, R
34600 45 41 44 5f 4c 4f 43 4b 29 21 3d 53 51 4c 49 54  EAD_LOCK)!=SQLIT
34610 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64  E_OK);.}...#ifnd
34620 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
34630 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
34640 2a 20 4f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  * Obtain a lock 
34650 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77 68 6f  on the table who
34660 73 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  se root page is 
34670 69 54 61 62 2e 20 20 54 68 65 0a 2a 2a 20 6c 6f  iTab.  The.** lo
34680 63 6b 20 69 73 20 61 20 77 72 69 74 65 20 6c 6f  ck is a write lo
34690 63 6b 20 69 66 20 69 73 57 72 69 74 65 6c 6f 63  ck if isWriteloc
346a0 6b 20 69 73 20 74 72 75 65 20 6f 72 20 61 20 72  k is true or a r
346b0 65 61 64 20 6c 6f 63 6b 0a 2a 2a 20 69 66 20 69  ead lock.** if i
346c0 74 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2f 0a 69  t is false..*/.i
346d0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  nt sqlite3BtreeL
346e0 6f 63 6b 54 61 62 6c 65 28 42 74 72 65 65 20 2a  ockTable(Btree *
346f0 70 2c 20 69 6e 74 20 69 54 61 62 2c 20 75 38 20  p, int iTab, u8 
34700 69 73 57 72 69 74 65 4c 6f 63 6b 29 7b 0a 20 20  isWriteLock){.  
34710 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
34720 4f 4b 3b 0a 20 20 75 38 20 6c 6f 63 6b 54 79 70  OK;.  u8 lockTyp
34730 65 20 3d 20 28 69 73 57 72 69 74 65 4c 6f 63 6b  e = (isWriteLock
34740 3f 57 52 49 54 45 5f 4c 4f 43 4b 3a 52 45 41 44  ?WRITE_LOCK:READ
34750 5f 4c 4f 43 4b 29 3b 0a 20 20 72 63 20 3d 20 71  _LOCK);.  rc = q
34760 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  ueryTableLock(p,
34770 20 69 54 61 62 2c 20 6c 6f 63 6b 54 79 70 65 29   iTab, lockType)
34780 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
34790 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
347a0 3d 20 6c 6f 63 6b 54 61 62 6c 65 28 70 2c 20 69  = lockTable(p, i
347b0 54 61 62 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a  Tab, lockType);.
347c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
347d0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
347e0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64   The following d
347f0 65 62 75 67 67 69 6e 67 20 69 6e 74 65 72 66 61  ebugging interfa
34800 63 65 20 68 61 73 20 74 6f 20 62 65 20 69 6e 20  ce has to be in 
34810 74 68 69 73 20 66 69 6c 65 20 28 72 61 74 68 65  this file (rathe
34820 72 0a 2a 2a 20 74 68 61 6e 20 69 6e 2c 20 66 6f  r.** than in, fo
34830 72 20 65 78 61 6d 70 6c 65 2c 20 74 65 73 74 31  r example, test1
34840 2e 63 29 20 73 6f 20 74 68 61 74 20 69 74 20 63  .c) so that it c
34850 61 6e 20 67 65 74 20 61 63 63 65 73 73 20 74 6f  an get access to
34860 0a 2a 2a 20 74 68 65 20 64 65 66 69 6e 69 74 69  .** the definiti
34870 6f 6e 20 6f 66 20 42 74 53 68 61 72 65 64 2e 0a  on of BtShared..
34880 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
34890 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20  QLITE_DEBUG) && 
348a0 64 65 66 69 6e 65 64 28 54 43 4c 53 48 29 0a 23  defined(TCLSH).#
348b0 69 6e 63 6c 75 64 65 20 3c 74 63 6c 2e 68 3e 0a  include <tcl.h>.
348c0 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 68 61 72  int sqlite3_shar
348d0 65 64 5f 63 61 63 68 65 5f 72 65 70 6f 72 74 28  ed_cache_report(
348e0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
348f0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
34900 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
34910 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
34920 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
34930 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
34940 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
34950 43 48 45 0a 20 20 63 6f 6e 73 74 20 54 68 72 65  CHE.  const Thre
34960 61 64 44 61 74 61 20 2a 70 54 64 20 3d 20 73 71  adData *pTd = sq
34970 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61 52  lite3ThreadDataR
34980 65 61 64 4f 6e 6c 79 28 29 3b 0a 20 20 69 66 28  eadOnly();.  if(
34990 20 70 54 64 2d 3e 75 73 65 53 68 61 72 65 64 44   pTd->useSharedD
349a0 61 74 61 20 29 7b 0a 20 20 20 20 42 74 53 68 61  ata ){.    BtSha
349b0 72 65 64 20 2a 70 42 74 3b 0a 20 20 20 20 54 63  red *pBt;.    Tc
349c0 6c 5f 4f 62 6a 20 2a 70 52 65 74 20 3d 20 54 63  l_Obj *pRet = Tc
349d0 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20  l_NewObj();.    
349e0 66 6f 72 28 70 42 74 3d 70 54 64 2d 3e 70 42 74  for(pBt=pTd->pBt
349f0 72 65 65 3b 20 70 42 74 3b 20 70 42 74 3d 70 42  ree; pBt; pBt=pB
34a00 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  t->pNext){.     
34a10 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
34a20 6c 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  le = sqlite3Page
34a30 72 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70  rFilename(pBt->p
34a40 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 54 63  Pager);.      Tc
34a50 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
34a60 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
34a70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ret, Tcl_NewStri
34a80 6e 67 4f 62 6a 28 7a 46 69 6c 65 2c 20 2d 31 29  ngObj(zFile, -1)
34a90 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73  );.      Tcl_Lis
34aa0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
34ab0 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20  t(interp, pRet, 
34ac0 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 70 42  Tcl_NewIntObj(pB
34ad0 74 2d 3e 6e 52 65 66 29 29 3b 0a 20 20 20 20 7d  t->nRef));.    }
34ae0 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
34af0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52  esult(interp, pR
34b00 65 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  et);.  }.#endif.
34b10 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
34b20 0a 7d 0a 23 65 6e 64 69 66 0a                    .}.#endif.