/ Hex Artifact Content
Login

Artifact 16119ce57ff10217f15b0b4c86d176ee5335a94f:


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 37 20 32 30 30 37 2f 30  c,v 1.357 2007/0
0190: 34 2f 32 34 20 31 37 3a 32 37 3a 35 31 20 64 72  4/24 17:27:51 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 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 43  **.** If the noC
c5e0: 6f 6e 74 65 6e 74 20 66 6c 61 67 20 69 73 20 73  ontent flag is s
c5f0: 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  et, it means tha
c600: 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  t we do not care
c610: 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f   about.** the co
c620: 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
c630: 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20  e at this time. 
c640: 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f   So do not go to
c650: 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20   the disk.** to 
c660: 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e  fetch the conten
c670: 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e  t.  Just fill in
c680: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74   the content wit
c690: 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e  h zeros for now.
c6a0: 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75  .** If in the fu
c6b0: 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c  ture we call sql
c6c0: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
c6d0: 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74   on this page, t
c6e0: 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20  hat.** means we 
c6f0: 68 61 76 65 20 73 74 61 72 74 65 64 20 74 6f 20  have started to 
c700: 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f  be concerned abo
c710: 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74  ut content and t
c720: 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20  he disk.** read 
c730: 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20  should occur at 
c740: 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73  that point..*/.s
c750: 74 61 74 69 63 20 69 6e 74 20 67 65 74 50 61 67  tatic int getPag
c760: 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  e(BtShared *pBt,
c770: 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 4d 65 6d 50   Pgno pgno, MemP
c780: 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 69 6e  age **ppPage, in
c790: 74 20 6e 6f 43 6f 6e 74 65 6e 74 29 7b 0a 20 20  t noContent){.  
c7a0: 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67  int rc;.  MemPag
c7b0: 65 20 2a 70 50 61 67 65 3b 0a 20 20 44 62 50 61  e *pPage;.  DbPa
c7c0: 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20  ge *pDbPage;..  
c7d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
c7e0: 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50  rAcquire(pBt->pP
c7f0: 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50  ager, pgno, (DbP
c800: 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20  age**)&pDbPage, 
c810: 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 69 66  noContent);.  if
c820: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
c830: 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d  ;.  pPage = (Mem
c840: 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61  Page *)sqlite3Pa
c850: 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62 50  gerGetExtra(pDbP
c860: 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61  age);.  pPage->a
c870: 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61  Data = sqlite3Pa
c880: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
c890: 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44  ge);.  pPage->pD
c8a0: 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 3b  bPage = pDbPage;
c8b0: 0a 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20  .  pPage->pBt = 
c8c0: 70 42 74 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67  pBt;.  pPage->pg
c8d0: 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61  no = pgno;.  pPa
c8e0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20  ge->hdrOffset = 
c8f0: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f  pPage->pgno==1 ?
c900: 20 31 30 30 20 3a 20 30 3b 0a 20 20 2a 70 70 50   100 : 0;.  *ppP
c910: 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 72  age = pPage;.  r
c920: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
c930: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  .}../*.** Get a 
c940: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
c950: 67 65 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ger and initiali
c960: 7a 65 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75  ze it.  This rou
c970: 74 69 6e 65 0a 2a 2a 20 69 73 20 6a 75 73 74 20  tine.** is just 
c980: 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72  a convenience wr
c990: 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 65 70  apper around sep
c9a0: 61 72 61 74 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  arate calls to.*
c9b0: 2a 20 67 65 74 50 61 67 65 28 29 20 61 6e 64 20  * getPage() and 
c9c0: 69 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2f 0a 73  initPage()..*/.s
c9d0: 74 61 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64  tatic int getAnd
c9e0: 49 6e 69 74 50 61 67 65 28 0a 20 20 42 74 53 68  InitPage(.  BtSh
c9f0: 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
ca00: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
ca10: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
ca20: 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
ca30: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
ca40: 74 68 65 20 70 61 67 65 20 74 6f 20 67 65 74 20  the page to get 
ca50: 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
ca60: 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69  pPage,    /* Wri
ca70: 74 65 20 74 68 65 20 70 61 67 65 20 70 6f 69 6e  te the page poin
ca80: 74 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 4d 65  ter here */.  Me
ca90: 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 20 20  mPage *pParent  
caa0: 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 6f 66 20     /* Parent of 
cab0: 74 68 65 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20  the page */.){. 
cac0: 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70   int rc;.  if( p
cad0: 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  gno==0 ){.    re
cae0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
caf0: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 7d 0a 20  UPT_BKPT; .  }. 
cb00: 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70 42   rc = getPage(pB
cb10: 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c  t, pgno, ppPage,
cb20: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
cb30: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 2a 70 70  QLITE_OK && (*pp
cb40: 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30  Page)->isInit==0
cb50: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 69 6e 69   ){.    rc = ini
cb60: 74 50 61 67 65 28 2a 70 70 50 61 67 65 2c 20 70  tPage(*ppPage, p
cb70: 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 72  Parent);.  }.  r
cb80: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
cb90: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d  ** Release a Mem
cba0: 50 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75  Page.  This shou
cbb0: 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63  ld be called onc
cbc0: 65 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72  e for each prior
cbd0: 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 67 65 74 50  .** call to getP
cbe0: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
cbf0: 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28  oid releasePage(
cc00: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
cc10: 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a  .  if( pPage ){.
cc20: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
cc30: 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20  e->aData );.    
cc40: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
cc50: 42 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Bt );.    assert
cc60: 28 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  ( &pPage->aData[
cc70: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65  pPage->pBt->page
cc80: 53 69 7a 65 5d 3d 3d 28 75 6e 73 69 67 6e 65 64  Size]==(unsigned
cc90: 20 63 68 61 72 2a 29 70 50 61 67 65 20 29 3b 0a   char*)pPage );.
cca0: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
ccb0: 55 6e 72 65 66 28 70 50 61 67 65 2d 3e 70 44 62  Unref(pPage->pDb
ccc0: 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Page);.  }.}../*
ccd0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
cce0: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
ccf0: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
cd00: 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65 0a 2a  unt for a page.*
cd10: 2a 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20  * reaches zero. 
cd20: 20 57 65 20 6e 65 65 64 20 74 6f 20 75 6e 72 65   We need to unre
cd30: 66 20 74 68 65 20 70 50 61 72 65 6e 74 20 70 6f  f the pParent po
cd40: 69 6e 74 65 72 20 77 68 65 6e 20 74 68 61 74 0a  inter when that.
cd50: 2a 2a 20 68 61 70 70 65 6e 73 2e 0a 2a 2f 0a 73  ** happens..*/.s
cd60: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 44  tatic void pageD
cd70: 65 73 74 72 75 63 74 6f 72 28 44 62 50 61 67 65  estructor(DbPage
cd80: 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 70 61 67   *pData, int pag
cd90: 65 53 69 7a 65 29 7b 0a 20 20 4d 65 6d 50 61 67  eSize){.  MemPag
cda0: 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73 65  e *pPage;.  asse
cdb0: 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20  rt( (pageSize & 
cdc0: 37 29 3d 3d 30 20 29 3b 0a 20 20 70 50 61 67 65  7)==0 );.  pPage
cdd0: 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71   = (MemPage *)sq
cde0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
cdf0: 72 61 28 70 44 61 74 61 29 3b 0a 20 20 69 66 28  ra(pData);.  if(
ce00: 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20   pPage->pParent 
ce10: 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  ){.    MemPage *
ce20: 70 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d  pParent = pPage-
ce30: 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 70 50  >pParent;.    pP
ce40: 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 30  age->pParent = 0
ce50: 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
ce60: 65 28 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a  e(pParent);.  }.
ce70: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
ce80: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75  = 0;.}../*.** Du
ce90: 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c  ring a rollback,
cea0: 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   when the pager 
ceb0: 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74  reloads informat
cec0: 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63  ion into the cac
ced0: 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68  he.** so that th
cee0: 65 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f  e cache is resto
cef0: 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69  red to its origi
cf00: 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74 68 65  nal state at the
cf10: 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65   start of.** the
cf20: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f   transaction, fo
cf30: 72 20 65 61 63 68 20 70 61 67 65 20 72 65 73 74  r each page rest
cf40: 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e  ored this routin
cf50: 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  e is called..**.
cf60: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
cf70: 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74 20 74  needs to reset t
cf80: 68 65 20 65 78 74 72 61 20 64 61 74 61 20 73 65  he extra data se
cf90: 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64  ction at the end
cfa0: 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   of the.** page 
cfb0: 74 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68  to agree with th
cfc0: 65 20 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e  e restored data.
cfd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
cfe0: 70 61 67 65 52 65 69 6e 69 74 28 44 62 50 61 67  pageReinit(DbPag
cff0: 65 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 70 61  e *pData, int pa
d000: 67 65 53 69 7a 65 29 7b 0a 20 20 4d 65 6d 50 61  geSize){.  MemPa
d010: 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73  ge *pPage;.  ass
d020: 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26  ert( (pageSize &
d030: 20 37 29 3d 3d 30 20 29 3b 0a 20 20 70 50 61 67   7)==0 );.  pPag
d040: 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73  e = (MemPage *)s
d050: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
d060: 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20 69 66  tra(pData);.  if
d070: 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
d080: 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  ){.    pPage->is
d090: 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  Init = 0;.    in
d0a0: 69 74 50 61 67 65 28 70 50 61 67 65 2c 20 70 50  itPage(pPage, pP
d0b0: 61 67 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20  age->pParent);. 
d0c0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e   }.}../*.** Open
d0d0: 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
d0e0: 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61  ..** .** zFilena
d0f0: 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  me is the name o
d100: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
d110: 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61  ile.  If zFilena
d120: 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 61 20  me is NULL.** a 
d130: 6e 65 77 20 64 61 74 61 62 61 73 65 20 77 69 74  new database wit
d140: 68 20 61 20 72 61 6e 64 6f 6d 20 6e 61 6d 65 20  h a random name 
d150: 69 73 20 63 72 65 61 74 65 64 2e 20 20 54 68 69  is created.  Thi
d160: 73 20 72 61 6e 64 6f 6d 6c 79 20 6e 61 6d 65 64  s randomly named
d170: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
d180: 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65  e will be delete
d190: 64 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74  d when sqlite3Bt
d1a0: 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61  reeClose() is ca
d1b0: 6c 6c 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lled..*/.int sql
d1c0: 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20  ite3BtreeOpen(. 
d1d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
d1e0: 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65  lename,  /* Name
d1f0: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e   of the file con
d200: 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65  taining the BTre
d210: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
d220: 73 71 6c 69 74 65 33 20 2a 70 53 71 6c 69 74 65  sqlite3 *pSqlite
d230: 2c 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63  ,       /* Assoc
d240: 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20 68  iated database h
d250: 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65  andle */.  Btree
d260: 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20   **ppBtree,     
d270: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
d280: 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63   new Btree objec
d290: 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a  t written here *
d2a0: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
d2b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
d2c0: 70 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 42  ptions */.){.  B
d2d0: 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
d2e0: 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
d2f0: 20 70 61 72 74 20 6f 66 20 62 74 72 65 65 20 73   part of btree s
d300: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 42 74  tructure */.  Bt
d310: 72 65 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20  ree *p;         
d320: 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
d330: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  to return */.  i
d340: 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 52 65  nt rc;.  int nRe
d350: 73 65 72 76 65 3b 0a 20 20 75 6e 73 69 67 6e 65  serve;.  unsigne
d360: 64 20 63 68 61 72 20 7a 44 62 48 65 61 64 65 72  d char zDbHeader
d370: 5b 31 30 30 5d 3b 0a 23 69 66 20 21 64 65 66 69  [100];.#if !defi
d380: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
d390: 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
d3a0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
d3b0: 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20  _OMIT_DISKIO).  
d3c0: 63 6f 6e 73 74 20 54 68 72 65 61 64 44 61 74 61  const ThreadData
d3d0: 20 2a 70 54 73 64 72 6f 3b 0a 23 65 6e 64 69 66   *pTsdro;.#endif
d3e0: 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76  ..  /* Set the v
d3f0: 61 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20  ariable isMemdb 
d400: 74 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69  to true for an i
d410: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
d420: 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73  e, or .  ** fals
d430: 65 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73  e for a file-bas
d440: 65 64 20 64 61 74 61 62 61 73 65 2e 20 54 68 69  ed database. Thi
d450: 73 20 73 79 6d 62 6f 6c 20 69 73 20 6f 6e 6c 79  s symbol is only
d460: 20 72 65 71 75 69 72 65 64 20 69 66 0a 20 20 2a   required if.  *
d470: 2a 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  * either of the 
d480: 73 68 61 72 65 64 2d 64 61 74 61 20 6f 72 20 61  shared-data or a
d490: 75 74 6f 76 61 63 75 75 6d 20 66 65 61 74 75 72  utovacuum featur
d4a0: 65 73 20 61 72 65 20 63 6f 6d 70 69 6c 65 64 20  es are compiled 
d4b0: 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c  .  ** into the l
d4c0: 69 62 72 61 72 79 2e 0a 20 20 2a 2f 0a 23 69 66  ibrary..  */.#if
d4d0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
d4e0: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
d4f0: 48 45 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  HE) || !defined(
d500: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
d510: 56 41 43 55 55 4d 29 0a 20 20 23 69 66 64 65 66  VACUUM).  #ifdef
d520: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
d530: 4f 52 59 44 42 0a 20 20 20 20 63 6f 6e 73 74 20  ORYDB.    const 
d540: 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b  int isMemdb = 0;
d550: 0a 20 20 23 65 6c 73 65 0a 20 20 20 20 63 6f 6e  .  #else.    con
d560: 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d  st int isMemdb =
d570: 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 73   zFilename && !s
d580: 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c  trcmp(zFilename,
d590: 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3b 0a 20 20   ":memory:");.  
d5a0: 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20  #endif.#endif.. 
d5b0: 20 70 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f   p = sqliteMallo
d5c0: 63 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29  c(sizeof(Btree))
d5d0: 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ;.  if( !p ){.  
d5e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d5f0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e  NOMEM;.  }.  p->
d600: 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
d610: 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 70 53 71 6c 69  NONE;.  p->pSqli
d620: 74 65 20 3d 20 70 53 71 6c 69 74 65 3b 0a 0a 20  te = pSqlite;.. 
d630: 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20   /* Try to find 
d640: 61 6e 20 65 78 69 73 74 69 6e 67 20 42 74 72 65  an existing Btre
d650: 65 20 73 74 72 75 63 74 75 72 65 20 6f 70 65 6e  e structure open
d660: 65 64 20 6f 6e 20 7a 46 69 6c 65 6e 61 6d 65 2e  ed on zFilename.
d670: 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
d680: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
d690: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
d6a0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
d6b0: 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 70 54 73  IT_DISKIO).  pTs
d6c0: 64 72 6f 20 3d 20 73 71 6c 69 74 65 33 54 68 72  dro = sqlite3Thr
d6d0: 65 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79 28  eadDataReadOnly(
d6e0: 29 3b 0a 20 20 69 66 28 20 70 54 73 64 72 6f 2d  );.  if( pTsdro-
d6f0: 3e 75 73 65 53 68 61 72 65 64 44 61 74 61 20 26  >useSharedData &
d700: 26 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21  & zFilename && !
d710: 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 63  isMemdb ){.    c
d720: 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61  har *zFullPathna
d730: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75  me = sqlite3OsFu
d740: 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65  llPathname(zFile
d750: 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 21  name);.    if( !
d760: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b  zFullPathname ){
d770: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
d780: 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75  e(p);.      retu
d790: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
d7a0: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70  .    }.    for(p
d7b0: 42 74 3d 70 54 73 64 72 6f 2d 3e 70 42 74 72 65  Bt=pTsdro->pBtre
d7c0: 65 3b 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d  e; pBt; pBt=pBt-
d7d0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61  >pNext){.      a
d7e0: 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66  ssert( pBt->nRef
d7f0: 3e 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >0 );.      if( 
d800: 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50  0==strcmp(zFullP
d810: 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33  athname, sqlite3
d820: 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42  PagerFilename(pB
d830: 74 2d 3e 70 50 61 67 65 72 29 29 20 29 7b 0a 20  t->pPager)) ){. 
d840: 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20 3d 20         p->pBt = 
d850: 70 42 74 3b 0a 20 20 20 20 20 20 20 20 2a 70 70  pBt;.        *pp
d860: 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 20  Btree = p;.     
d870: 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a     pBt->nRef++;.
d880: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72          sqliteFr
d890: 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
d8a0: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
d8b0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
d8c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
d8d0: 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50  qliteFree(zFullP
d8e0: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 65  athname);.  }.#e
d8f0: 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  ndif..  /*.  ** 
d900: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
d910: 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65 20  serts make sure 
d920: 74 68 61 74 20 73 74 72 75 63 74 75 72 65 73 20  that structures 
d930: 75 73 65 64 20 62 79 20 74 68 65 20 62 74 72 65  used by the btre
d940: 65 20 61 72 65 0a 20 20 2a 2a 20 74 68 65 20 72  e are.  ** the r
d950: 69 67 68 74 20 73 69 7a 65 2e 20 20 54 68 69 73  ight size.  This
d960: 20 69 73 20 74 6f 20 67 75 61 72 64 20 61 67 61   is to guard aga
d970: 69 6e 73 74 20 73 69 7a 65 20 63 68 61 6e 67 65  inst size change
d980: 73 20 74 68 61 74 20 72 65 73 75 6c 74 0a 20 20  s that result.  
d990: 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e  ** when compilin
d9a0: 67 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74  g on a different
d9b0: 20 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20   architecture.. 
d9c0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 69   */.  assert( si
d9d0: 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c 20  zeof(i64)==8 || 
d9e0: 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20 29  sizeof(i64)==4 )
d9f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  ;.  assert( size
da00: 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c 20 73 69  of(u64)==8 || si
da10: 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20 29 3b 0a  zeof(u64)==4 );.
da20: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
da30: 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20 61 73  (u32)==4 );.  as
da40: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36  sert( sizeof(u16
da50: 29 3d 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74  )==2 );.  assert
da60: 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d  ( sizeof(Pgno)==
da70: 34 20 29 3b 0a 0a 20 20 70 42 74 20 3d 20 73 71  4 );..  pBt = sq
da80: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
da90: 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 69 66  of(*pBt) );.  if
daa0: 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pBt==0 ){.    
dab0: 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20  *ppBtree = 0;.  
dac0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b    sqliteFree(p);
dad0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
dae0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
daf0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
db00: 72 4f 70 65 6e 28 26 70 42 74 2d 3e 70 50 61 67  rOpen(&pBt->pPag
db10: 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 45  er, zFilename, E
db20: 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73  XTRA_SIZE, flags
db30: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
db40: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
db50: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
db60: 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 70 42  eadFileheader(pB
db70: 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66  t->pPager,sizeof
db80: 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48  (zDbHeader),zDbH
db90: 65 61 64 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66  eader);.  }.  if
dba0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
dbb0: 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  ){.    if( pBt->
dbc0: 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20  pPager ){.      
dbd0: 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
dbe0: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  e(pBt->pPager);.
dbf0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
dc00: 46 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73  Free(pBt);.    s
dc10: 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 20 20  qliteFree(p);.  
dc20: 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a    *ppBtree = 0;.
dc30: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
dc40: 20 7d 0a 20 20 70 2d 3e 70 42 74 20 3d 20 70 42   }.  p->pBt = pB
dc50: 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67  t;..  sqlite3Pag
dc60: 65 72 53 65 74 44 65 73 74 72 75 63 74 6f 72 28  erSetDestructor(
dc70: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 61 67  pBt->pPager, pag
dc80: 65 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20  eDestructor);.  
dc90: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 52  sqlite3PagerSetR
dca0: 65 69 6e 69 74 65 72 28 70 42 74 2d 3e 70 50 61  einiter(pBt->pPa
dcb0: 67 65 72 2c 20 70 61 67 65 52 65 69 6e 69 74 29  ger, pageReinit)
dcc0: 3b 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  ;.  pBt->pCursor
dcd0: 20 3d 20 30 3b 0a 20 20 70 42 74 2d 3e 70 50 61   = 0;.  pBt->pPa
dce0: 67 65 31 20 3d 20 30 3b 0a 20 20 70 42 74 2d 3e  ge1 = 0;.  pBt->
dcf0: 72 65 61 64 4f 6e 6c 79 20 3d 20 73 71 6c 69 74  readOnly = sqlit
dd00: 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c  e3PagerIsreadonl
dd10: 79 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  y(pBt->pPager);.
dd20: 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
dd30: 3d 20 67 65 74 32 62 79 74 65 28 26 7a 44 62 48  = get2byte(&zDbH
dd40: 65 61 64 65 72 5b 31 36 5d 29 3b 0a 20 20 69 66  eader[16]);.  if
dd50: 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  ( pBt->pageSize<
dd60: 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65  512 || pBt->page
dd70: 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
dd80: 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20  PAGE_SIZE.      
dd90: 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65 53   || ((pBt->pageS
dda0: 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67 65  ize-1)&pBt->page
ddb0: 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Size)!=0 ){.    
ddc0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
ddd0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
dde0: 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 70 42  AGE_SIZE;.    pB
ddf0: 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72 61 63 20  t->maxEmbedFrac 
de00: 3d 20 36 34 3b 20 20 20 2f 2a 20 32 35 25 20 2a  = 64;   /* 25% *
de10: 2f 0a 20 20 20 20 70 42 74 2d 3e 6d 69 6e 45 6d  /.    pBt->minEm
de20: 62 65 64 46 72 61 63 20 3d 20 33 32 3b 20 20 20  bedFrac = 32;   
de30: 2f 2a 20 31 32 2e 35 25 20 2a 2f 0a 20 20 20 20  /* 12.5% */.    
de40: 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63  pBt->minLeafFrac
de50: 20 3d 20 33 32 3b 20 20 20 20 2f 2a 20 31 32 2e   = 32;    /* 12.
de60: 35 25 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  5% */.#ifndef SQ
de70: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
de80: 43 55 55 4d 0a 20 20 20 20 2f 2a 20 49 66 20 74  CUUM.    /* If t
de90: 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a  he magic name ":
dea0: 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72  memory:" will cr
deb0: 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  eate an in-memor
dec0: 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  y database, then
ded0: 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 73  .    ** do not s
dee0: 65 74 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  et the auto-vacu
def0: 75 6d 20 66 6c 61 67 2c 20 65 76 65 6e 20 69 66  um flag, even if
df00: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
df10: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 2a  AUTOVACUUM.    *
df20: 2a 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68  * is true. On th
df30: 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66  e other hand, if
df40: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
df50: 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e 20 64  ORYDB has been d
df60: 65 66 69 6e 65 64 2c 0a 20 20 20 20 2a 2a 20 74  efined,.    ** t
df70: 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69  hen ":memory:" i
df80: 73 20 6a 75 73 74 20 61 20 72 65 67 75 6c 61 72  s just a regular
df90: 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 52 65 73 70   file-name. Resp
dfa0: 65 63 74 20 74 68 65 20 61 75 74 6f 2d 76 61 63  ect the auto-vac
dfb0: 75 75 6d 0a 20 20 20 20 2a 2a 20 64 65 66 61 75  uum.    ** defau
dfc0: 6c 74 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  lt in this case.
dfd0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
dfe0: 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73  zFilename && !is
dff0: 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 70  Memdb ){.      p
e000: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
e010: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
e020: 41 55 54 4f 56 41 43 55 55 4d 3b 0a 20 20 20 20  AUTOVACUUM;.    
e030: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 6e 52 65  }.#endif.    nRe
e040: 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  serve = 0;.  }el
e050: 73 65 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65  se{.    nReserve
e060: 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d   = zDbHeader[20]
e070: 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 45 6d  ;.    pBt->maxEm
e080: 62 65 64 46 72 61 63 20 3d 20 7a 44 62 48 65 61  bedFrac = zDbHea
e090: 64 65 72 5b 32 31 5d 3b 0a 20 20 20 20 70 42 74  der[21];.    pBt
e0a0: 2d 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63 20 3d  ->minEmbedFrac =
e0b0: 20 7a 44 62 48 65 61 64 65 72 5b 32 32 5d 3b 0a   zDbHeader[22];.
e0c0: 20 20 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66      pBt->minLeaf
e0d0: 46 72 61 63 20 3d 20 7a 44 62 48 65 61 64 65 72  Frac = zDbHeader
e0e0: 5b 32 33 5d 3b 0a 20 20 20 20 70 42 74 2d 3e 70  [23];.    pBt->p
e0f0: 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31  ageSizeFixed = 1
e100: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
e110: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
e120: 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61  .    pBt->autoVa
e130: 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
e140: 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b  (&zDbHeader[36 +
e150: 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e   4*4])?1:0);.#en
e160: 64 69 66 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 75  dif.  }.  pBt->u
e170: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
e180: 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73  >pageSize - nRes
e190: 65 72 76 65 3b 0a 20 20 61 73 73 65 72 74 28 20  erve;.  assert( 
e1a0: 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26  (pBt->pageSize &
e1b0: 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d   7)==0 );  /* 8-
e1c0: 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f  byte alignment o
e1d0: 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20  f pageSize */.  
e1e0: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
e1f0: 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
e200: 67 65 72 2c 20 70 42 74 2d 3e 70 61 67 65 53 69  ger, pBt->pageSi
e210: 7a 65 29 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e  ze);..#if !defin
e220: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
e230: 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
e240: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
e250: 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f  OMIT_DISKIO).  /
e260: 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 62 74  * Add the new bt
e270: 72 65 65 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65  ree to the linke
e280: 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67 20  d list starting 
e290: 61 74 20 54 68 72 65 61 64 44 61 74 61 2e 70 42  at ThreadData.pB
e2a0: 74 72 65 65 2e 0a 20 20 2a 2a 20 54 68 65 72 65  tree..  ** There
e2b0: 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68   is no chance th
e2c0: 61 74 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6d 61  at a malloc() ma
e2d0: 79 20 66 61 69 6c 20 69 6e 73 69 64 65 20 6f 66  y fail inside of
e2e0: 20 74 68 65 20 0a 20 20 2a 2a 20 73 71 6c 69 74   the .  ** sqlit
e2f0: 65 33 54 68 72 65 61 64 44 61 74 61 28 29 20 63  e3ThreadData() c
e300: 61 6c 6c 2c 20 61 73 20 74 68 65 20 54 68 72 65  all, as the Thre
e310: 61 64 44 61 74 61 20 73 74 72 75 63 74 75 72 65  adData structure
e320: 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61   must have alrea
e330: 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20 61 6c 6c  dy.  ** been all
e340: 6f 63 61 74 65 64 20 66 6f 72 20 70 54 73 64 72  ocated for pTsdr
e350: 6f 2d 3e 75 73 65 53 68 61 72 65 64 44 61 74 61  o->useSharedData
e360: 20 74 6f 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 2e   to be non-zero.
e370: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 73 64  .  */.  if( pTsd
e380: 72 6f 2d 3e 75 73 65 53 68 61 72 65 64 44 61 74  ro->useSharedDat
e390: 61 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 20 26  a && zFilename &
e3a0: 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20  & !isMemdb ){.  
e3b0: 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 70    pBt->pNext = p
e3c0: 54 73 64 72 6f 2d 3e 70 42 74 72 65 65 3b 0a 20  Tsdro->pBtree;. 
e3d0: 20 20 20 73 71 6c 69 74 65 33 54 68 72 65 61 64     sqlite3Thread
e3e0: 44 61 74 61 28 29 2d 3e 70 42 74 72 65 65 20 3d  Data()->pBtree =
e3f0: 20 70 42 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   pBt;.  }.#endif
e400: 0a 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31  .  pBt->nRef = 1
e410: 3b 0a 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70  ;.  *ppBtree = p
e420: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
e430: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
e440: 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74  lose an open dat
e450: 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69  abase and invali
e460: 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  date all cursors
e470: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
e480: 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65  BtreeClose(Btree
e490: 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
e4a0: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
e4b0: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
e4c0: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
e4d0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
e4e0: 43 48 45 0a 20 20 54 68 72 65 61 64 44 61 74 61  CHE.  ThreadData
e4f0: 20 2a 70 54 73 64 3b 0a 23 65 6e 64 69 66 0a 0a   *pTsd;.#endif..
e500: 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63    /* Close all c
e510: 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76 69  ursors opened vi
e520: 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 20  a this handle.  
e530: 2a 2f 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d  */.  pCur = pBt-
e540: 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c  >pCursor;.  whil
e550: 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42  e( pCur ){.    B
e560: 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20  tCursor *pTmp = 
e570: 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d  pCur;.    pCur =
e580: 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20   pCur->pNext;.  
e590: 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72    if( pTmp->pBtr
e5a0: 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73  ee==p ){.      s
e5b0: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
e5c0: 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20  Cursor(pTmp);.  
e5d0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f    }.  }..  /* Ro
e5e0: 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76  llback any activ
e5f0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  e transaction an
e600: 64 20 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c  d free the handl
e610: 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a  e structure..  *
e620: 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  * The call to sq
e630: 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
e640: 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74  ck() drops any t
e650: 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20  able-locks held 
e660: 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e  by.  ** this han
e670: 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  dle..  */.  sqli
e680: 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
e690: 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  (p);.  sqliteFre
e6a0: 65 28 70 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  e(p);..#ifndef S
e6b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
e6c0: 44 5f 43 41 43 48 45 0a 20 20 2f 2a 20 49 66 20  D_CACHE.  /* If 
e6d0: 74 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20  there are still 
e6e0: 6f 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e  other outstandin
e6f0: 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  g references to 
e700: 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
e710: 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c  .  ** structure,
e720: 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65   return now. The
e730: 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68   remainder of th
e740: 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65  is procedure cle
e750: 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65  ans .  ** up the
e760: 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20   shared-btree.. 
e770: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 42   */.  assert( pB
e780: 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70  t->nRef>0 );.  p
e790: 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66  Bt->nRef--;.  if
e7a0: 28 20 70 42 74 2d 3e 6e 52 65 66 20 29 7b 0a 20  ( pBt->nRef ){. 
e7b0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e7c0: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  _OK;.  }..  /* R
e7d0: 65 6d 6f 76 65 20 74 68 65 20 73 68 61 72 65 64  emove the shared
e7e0: 2d 62 74 72 65 65 20 66 72 6f 6d 20 74 68 65 20  -btree from the 
e7f0: 74 68 72 65 61 64 20 77 69 64 65 20 6c 69 73 74  thread wide list
e800: 2e 20 43 61 6c 6c 20 0a 20 20 2a 2a 20 54 68 72  . Call .  ** Thr
e810: 65 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79 28  eadDataReadOnly(
e820: 29 20 61 6e 64 20 74 68 65 6e 20 63 61 73 74 20  ) and then cast 
e830: 61 77 61 79 20 74 68 65 20 63 6f 6e 73 74 20 70  away the const p
e840: 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 0a  roperty of the .
e850: 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20    ** pointer to 
e860: 61 76 6f 69 64 20 61 6c 6c 6f 63 61 74 69 6e 67  avoid allocating
e870: 20 74 68 72 65 61 64 20 64 61 74 61 20 69 66 20   thread data if 
e880: 69 74 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  it is not really
e890: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a   required..  */.
e8a0: 20 20 70 54 73 64 20 3d 20 28 54 68 72 65 61 64    pTsd = (Thread
e8b0: 44 61 74 61 20 2a 29 73 71 6c 69 74 65 33 54 68  Data *)sqlite3Th
e8c0: 72 65 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79  readDataReadOnly
e8d0: 28 29 3b 0a 20 20 69 66 28 20 70 54 73 64 2d 3e  ();.  if( pTsd->
e8e0: 70 42 74 72 65 65 3d 3d 70 42 74 20 29 7b 0a 20  pBtree==pBt ){. 
e8f0: 20 20 20 61 73 73 65 72 74 28 20 70 54 73 64 3d     assert( pTsd=
e900: 3d 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61  =sqlite3ThreadDa
e910: 74 61 28 29 20 29 3b 0a 20 20 20 20 70 54 73 64  ta() );.    pTsd
e920: 2d 3e 70 42 74 72 65 65 20 3d 20 70 42 74 2d 3e  ->pBtree = pBt->
e930: 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pNext;.  }else{.
e940: 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 50      BtShared *pP
e950: 72 65 76 3b 0a 20 20 20 20 66 6f 72 28 70 50 72  rev;.    for(pPr
e960: 65 76 3d 70 54 73 64 2d 3e 70 42 74 72 65 65 3b  ev=pTsd->pBtree;
e970: 20 70 50 72 65 76 20 26 26 20 70 50 72 65 76 2d   pPrev && pPrev-
e980: 3e 70 4e 65 78 74 21 3d 70 42 74 3b 20 70 50 72  >pNext!=pBt; pPr
e990: 65 76 3d 70 50 72 65 76 2d 3e 70 4e 65 78 74 29  ev=pPrev->pNext)
e9a0: 7b 7d 0a 20 20 20 20 69 66 28 20 70 50 72 65 76  {}.    if( pPrev
e9b0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
e9c0: 28 20 70 54 73 64 3d 3d 73 71 6c 69 74 65 33 54  ( pTsd==sqlite3T
e9d0: 68 72 65 61 64 44 61 74 61 28 29 20 29 3b 0a 20  hreadData() );. 
e9e0: 20 20 20 20 20 70 50 72 65 76 2d 3e 70 4e 65 78       pPrev->pNex
e9f0: 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a  t = pBt->pNext;.
ea00: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
ea10: 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 74 68 65  ..  /* Close the
ea20: 20 70 61 67 65 72 20 61 6e 64 20 66 72 65 65 20   pager and free 
ea30: 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
ea40: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
ea50: 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43  assert( !pBt->pC
ea60: 75 72 73 6f 72 20 29 3b 0a 20 20 73 71 6c 69 74  ursor );.  sqlit
ea70: 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74  e3PagerClose(pBt
ea80: 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  ->pPager);.  if(
ea90: 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
eaa0: 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d  a && pBt->pSchem
eab0: 61 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 78 46  a ){.    pBt->xF
eac0: 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70  reeSchema(pBt->p
ead0: 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 73  Schema);.  }.  s
eae0: 71 6c 69 74 65 46 72 65 65 28 70 42 74 2d 3e 70  qliteFree(pBt->p
eaf0: 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74  Schema);.  sqlit
eb00: 65 46 72 65 65 28 70 42 74 29 3b 0a 20 20 72 65  eFree(pBt);.  re
eb10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
eb20: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
eb30: 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
eb40: 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69   callback functi
eb50: 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
eb60: 65 33 42 74 72 65 65 53 65 74 42 75 73 79 48 61  e3BtreeSetBusyHa
eb70: 6e 64 6c 65 72 28 42 74 72 65 65 20 2a 70 2c 20  ndler(Btree *p, 
eb80: 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 48 61  BusyHandler *pHa
eb90: 6e 64 6c 65 72 29 7b 0a 20 20 42 74 53 68 61 72  ndler){.  BtShar
eba0: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
ebb0: 3b 0a 20 20 70 42 74 2d 3e 70 42 75 73 79 48 61  ;.  pBt->pBusyHa
ebc0: 6e 64 6c 65 72 20 3d 20 70 48 61 6e 64 6c 65 72  ndler = pHandler
ebd0: 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
ebe0: 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 70  SetBusyhandler(p
ebf0: 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 48 61 6e  Bt->pPager, pHan
ec00: 64 6c 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  dler);.  return 
ec10: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
ec20: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c  .** Change the l
ec30: 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62  imit on the numb
ec40: 65 72 20 6f 66 20 70 61 67 65 73 20 61 6c 6c 6f  er of pages allo
ec50: 77 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  wed in the cache
ec60: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69  ..**.** The maxi
ec70: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 61  mum number of ca
ec80: 63 68 65 20 70 61 67 65 73 20 69 73 20 73 65 74  che pages is set
ec90: 20 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74 65   to the absolute
eca0: 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78 50  .** value of mxP
ecb0: 61 67 65 2e 20 20 49 66 20 6d 78 50 61 67 65 20  age.  If mxPage 
ecc0: 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65  is negative, the
ecd0: 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f   pager will.** o
ece0: 70 65 72 61 74 65 20 61 73 79 6e 63 68 72 6f 6e  perate asynchron
ecf0: 6f 75 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c 20  ously - it will 
ed00: 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f 20 66  not stop to do f
ed10: 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69 6e  sync()s.** to in
ed20: 73 75 72 65 20 64 61 74 61 20 69 73 20 77 72 69  sure data is wri
ed30: 74 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73 6b  tten to the disk
ed40: 20 73 75 72 66 61 63 65 20 62 65 66 6f 72 65 0a   surface before.
ed50: 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20  ** continuing.  
ed60: 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69  Transactions sti
ed70: 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e 63 68  ll work if synch
ed80: 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a 2a  ronous is off,.*
ed90: 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  * and the databa
eda0: 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 72  se cannot be cor
edb0: 72 75 70 74 65 64 20 69 66 20 74 68 69 73 20 70  rupted if this p
edc0: 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68 65  rogram.** crashe
edd0: 73 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 6f  s.  But if the o
ede0: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
edf0: 63 72 61 73 68 65 73 20 6f 72 20 74 68 65 72 65  crashes or there
ee00: 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70 74   is.** an abrupt
ee10: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77   power failure w
ee20: 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20  hen synchronous 
ee30: 69 73 20 6f 66 66 2c 20 74 68 65 20 64 61 74 61  is off, the data
ee40: 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62 65  base.** could be
ee50: 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f   left in an inco
ee60: 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 75 6e 72  nsistent and unr
ee70: 65 63 6f 76 65 72 61 62 6c 65 20 73 74 61 74 65  ecoverable state
ee80: 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75 73  ..** Synchronous
ee90: 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c   is on by defaul
eea0: 74 20 73 6f 20 64 61 74 61 62 61 73 65 20 63 6f  t so database co
eeb0: 72 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74 0a  rruption is not.
eec0: 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77 6f  ** normally a wo
eed0: 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  rry..*/.int sqli
eee0: 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65  te3BtreeSetCache
eef0: 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69  Size(Btree *p, i
ef00: 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74  nt mxPage){.  Bt
ef10: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
ef20: 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 50  >pBt;.  sqlite3P
ef30: 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65  agerSetCachesize
ef40: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78  (pBt->pPager, mx
ef50: 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Page);.  return 
ef60: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
ef70: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77  .** Change the w
ef80: 61 79 20 64 61 74 61 20 69 73 20 73 79 6e 63 65  ay data is synce
ef90: 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64  d to disk in ord
efa0: 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f  er to increase o
efb0: 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f  r decrease.** ho
efc0: 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62  w well the datab
efd0: 61 73 65 20 72 65 73 69 73 74 73 20 64 61 6d 61  ase resists dama
efe0: 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61  ge due to OS cra
eff0: 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a  shes and power.*
f000: 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76  * failures.  Lev
f010: 65 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d 65  el 1 is the same
f020: 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73   as asynchronous
f030: 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63   (no syncs() occ
f040: 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20  ur and.** there 
f050: 69 73 20 61 20 68 69 67 68 20 70 72 6f 62 61 62  is a high probab
f060: 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29  ility of damage)
f070: 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65    Level 2 is the
f080: 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65   default.  There
f090: 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f  .** is a very lo
f0a0: 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70  w but non-zero p
f0b0: 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
f0c0: 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72  mage.  Level 3 r
f0d0: 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72  educes the.** pr
f0e0: 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
f0f0: 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f  age to near zero
f100: 20 62 75 74 20 77 69 74 68 20 61 20 77 72 69 74   but with a writ
f110: 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65  e performance re
f120: 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e  duction..*/.#ifn
f130: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f140: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e  PAGER_PRAGMAS.in
f150: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
f160: 74 53 61 66 65 74 79 4c 65 76 65 6c 28 42 74 72  tSafetyLevel(Btr
f170: 65 65 20 2a 70 2c 20 69 6e 74 20 6c 65 76 65 6c  ee *p, int level
f180: 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 29 7b  , int fullSync){
f190: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
f1a0: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
f1b0: 69 74 65 33 50 61 67 65 72 53 65 74 53 61 66 65  ite3PagerSetSafe
f1c0: 74 79 4c 65 76 65 6c 28 70 42 74 2d 3e 70 50 61  tyLevel(pBt->pPa
f1d0: 67 65 72 2c 20 6c 65 76 65 6c 2c 20 66 75 6c 6c  ger, level, full
f1e0: 53 79 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e 20  Sync);.  return 
f1f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
f200: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
f210: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69  n TRUE if the gi
f220: 76 65 6e 20 62 74 72 65 65 20 69 73 20 73 65 74  ven btree is set
f230: 20 74 6f 20 73 61 66 65 74 79 20 6c 65 76 65 6c   to safety level
f240: 20 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a   1.  In other.**
f250: 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54   words, return T
f260: 52 55 45 20 69 66 20 6e 6f 20 73 79 6e 63 28 29  RUE if no sync()
f270: 20 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 64   occurs on the d
f280: 69 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e  isk files..*/.in
f290: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79  t sqlite3BtreeSy
f2a0: 6e 63 44 69 73 61 62 6c 65 64 28 42 74 72 65 65  ncDisabled(Btree
f2b0: 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
f2c0: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
f2d0: 20 20 61 73 73 65 72 74 28 20 70 42 74 20 26 26    assert( pBt &&
f2e0: 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a   pBt->pPager );.
f2f0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
f300: 50 61 67 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d  PagerNosync(pBt-
f310: 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 23 69 66  >pPager);.}..#if
f320: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
f330: 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
f340: 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  MAS) || !defined
f350: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43  (SQLITE_OMIT_VAC
f360: 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  UUM)./*.** Chang
f370: 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61  e the default pa
f380: 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68 65  ges size and the
f390: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
f3a0: 76 65 64 20 62 79 74 65 73 20 70 65 72 20 70 61  ved bytes per pa
f3b0: 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ge..**.** The pa
f3c0: 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20  ge size must be 
f3d0: 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74  a power of 2 bet
f3e0: 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35  ween 512 and 655
f3f0: 33 36 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  36.  If the page
f400: 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65  .** size supplie
f410: 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20  d does not meet 
f420: 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  this constraint 
f430: 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 73 69  then the page si
f440: 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61  ze is not.** cha
f450: 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  nged..**.** Page
f460: 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74   sizes are const
f470: 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70  rained to be a p
f480: 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74  ower of two so t
f490: 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a  hat the region.*
f4a0: 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
f4b0: 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20  e file used for 
f4c0: 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69  locking (beginni
f4d0: 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59  ng at PENDING_BY
f4e0: 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  TE,.** the first
f4f0: 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 31   byte past the 1
f500: 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34  GB boundary, 0x4
f510: 30 30 30 30 30 30 30 29 20 6e 65 65 64 73 20 74  0000000) needs t
f520: 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68  o occur.** at th
f530: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
f540: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
f550: 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72  parameter nReser
f560: 76 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ve is less than 
f570: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e  zero, then the n
f580: 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
f590: 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70  d.** bytes per p
f5a0: 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68  age is left unch
f5b0: 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  anged..*/.int sq
f5c0: 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67  lite3BtreeSetPag
f5d0: 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20  eSize(Btree *p, 
f5e0: 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e  int pageSize, in
f5f0: 74 20 6e 52 65 73 65 72 76 65 29 7b 0a 20 20 42  t nReserve){.  B
f600: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
f610: 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 70 42 74  ->pBt;.  if( pBt
f620: 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20  ->pageSizeFixed 
f630: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
f640: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
f650: 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76   }.  if( nReserv
f660: 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 65  e<0 ){.    nRese
f670: 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  rve = pBt->pageS
f680: 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c  ize - pBt->usabl
f690: 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28  eSize;.  }.  if(
f6a0: 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26   pageSize>=512 &
f6b0: 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49  & pageSize<=SQLI
f6c0: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
f6d0: 20 26 26 0a 20 20 20 20 20 20 20 20 28 28 70 61   &&.        ((pa
f6e0: 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69  geSize-1)&pageSi
f6f0: 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  ze)==0 ){.    as
f700: 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20  sert( (pageSize 
f710: 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61  & 7)==0 );.    a
f720: 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 50 61  ssert( !pBt->pPa
f730: 67 65 31 20 26 26 20 21 70 42 74 2d 3e 70 43 75  ge1 && !pBt->pCu
f740: 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74 2d  rsor );.    pBt-
f750: 3e 70 61 67 65 53 69 7a 65 20 3d 20 73 71 6c 69  >pageSize = sqli
f760: 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
f770: 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
f780: 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a   pageSize);.  }.
f790: 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
f7a0: 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
f7b0: 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20  e - nReserve;.  
f7c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
f7d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
f7e0: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20  n the currently 
f7f0: 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a  defined page siz
f800: 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  e.*/.int sqlite3
f810: 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a 65  BtreeGetPageSize
f820: 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65  (Btree *p){.  re
f830: 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67  turn p->pBt->pag
f840: 65 53 69 7a 65 3b 0a 7d 0a 69 6e 74 20 73 71 6c  eSize;.}.int sql
f850: 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65  ite3BtreeGetRese
f860: 72 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  rve(Btree *p){. 
f870: 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e   return p->pBt->
f880: 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42  pageSize - p->pB
f890: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 7d  t->usableSize;.}
f8a0: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
f8b0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
f8c0: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c  PAGER_PRAGMAS) |
f8d0: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
f8e0: 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20 2a  E_OMIT_VACUUM) *
f8f0: 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  /../*.** Change 
f900: 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d  the 'auto-vacuum
f910: 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68  ' property of th
f920: 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74  e database. If t
f930: 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a  he 'autoVacuum'.
f940: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
f950: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61  non-zero, then a
f960: 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20  uto-vacuum mode 
f970: 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a  is enabled. If z
f980: 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69  ero, it.** is di
f990: 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61  sabled. The defa
f9a0: 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ult value for th
f9b0: 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72  e auto-vacuum pr
f9c0: 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65  operty is .** de
f9d0: 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
f9e0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
f9f0: 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e  UTOVACUUM macro.
fa00: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
fa10: 74 72 65 65 53 65 74 41 75 74 6f 56 61 63 75 75  treeSetAutoVacuu
fa20: 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  m(Btree *p, int 
fa30: 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 20 20 42  autoVacuum){.  B
fa40: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
fa50: 2d 3e 70 42 74 3b 3b 0a 23 69 66 64 65 66 20 53  ->pBt;;.#ifdef S
fa60: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
fa70: 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53  ACUUM.  return S
fa80: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
fa90: 23 65 6c 73 65 0a 20 20 69 66 28 20 70 42 74 2d  #else.  if( pBt-
faa0: 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 29  >pageSizeFixed )
fab0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
fac0: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
fad0: 7d 0a 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  }.  pBt->autoVac
fae0: 75 75 6d 20 3d 20 28 61 75 74 6f 56 61 63 75 75  uum = (autoVacuu
faf0: 6d 3f 31 3a 30 29 3b 0a 20 20 72 65 74 75 72 6e  m?1:0);.  return
fb00: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64   SQLITE_OK;.#end
fb10: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  if.}../*.** Retu
fb20: 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  rn the value of 
fb30: 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d  the 'auto-vacuum
fb40: 27 20 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61  ' property. If a
fb50: 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a  uto-vacuum is .*
fb60: 2a 20 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72  * enabled 1 is r
fb70: 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
fb80: 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  se 0..*/.int sql
fb90: 69 74 65 33 42 74 72 65 65 47 65 74 41 75 74 6f  ite3BtreeGetAuto
fba0: 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29  Vacuum(Btree *p)
fbb0: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
fbc0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
fbd0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6c 73    return 0;.#els
fbe0: 65 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42  e.  return p->pB
fbf0: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3b 0a 23  t->autoVacuum;.#
fc00: 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  endif.}.../*.** 
fc10: 47 65 74 20 61 20 72 65 66 65 72 65 6e 63 65 20  Get a reference 
fc20: 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68 65  to pPage1 of the
fc30: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
fc40: 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c   This will.** al
fc50: 73 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 61  so acquire a rea
fc60: 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69  dlock on that fi
fc70: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  le..**.** SQLITE
fc80: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
fc90: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
fca0: 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  the file is not 
fcb0: 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  a.** well-formed
fcc0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
fcd0: 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  then SQLITE_CORR
fce0: 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e  UPT is returned.
fcf0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
fd00: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
fd10: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6c  he database is l
fd20: 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e  ocked.  SQLITE_N
fd30: 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72  OMEM.** is retur
fd40: 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75  ned if we run ou
fd50: 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f  t of memory. .*/
fd60: 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b  .static int lock
fd70: 42 74 72 65 65 28 42 74 53 68 61 72 65 64 20 2a  Btree(BtShared *
fd80: 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20  pBt){.  int rc, 
fd90: 70 61 67 65 53 69 7a 65 3b 0a 20 20 4d 65 6d 50  pageSize;.  MemP
fda0: 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69  age *pPage1;.  i
fdb0: 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20 29  f( pBt->pPage1 )
fdc0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
fdd0: 4b 3b 0a 20 20 72 63 20 3d 20 67 65 74 50 61 67  K;.  rc = getPag
fde0: 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65  e(pBt, 1, &pPage
fdf0: 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  1, 0);.  if( rc!
fe00: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
fe10: 75 72 6e 20 72 63 3b 0a 20 20 0a 0a 20 20 2f 2a  urn rc;.  ..  /*
fe20: 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e   Do some checkin
fe30: 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72 65  g to help insure
fe40: 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70 65   the file we ope
fe50: 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20 20  ned really is.  
fe60: 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61 62  ** a valid datab
fe70: 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a  ase file. .  */.
fe80: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
fe90: 54 41 44 42 3b 0a 20 20 69 66 28 20 73 71 6c 69  TADB;.  if( sqli
fea0: 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
feb0: 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3e 30  t(pBt->pPager)>0
fec0: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 61 67 65   ){.    u8 *page
fed0: 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74  1 = pPage1->aDat
fee0: 61 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  a;.    if( memcm
fef0: 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63 48  p(page1, zMagicH
ff00: 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29 7b  eader, 16)!=0 ){
ff10: 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
ff20: 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
ff30: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67     }.    if( pag
ff40: 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20  e1[18]>1 ){.    
ff50: 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20    pBt->readOnly 
ff60: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
ff70: 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29  f( page1[19]>1 )
ff80: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
ff90: 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
ffa0: 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 53 69      }.    pageSi
ffb0: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 70  ze = get2byte(&p
ffc0: 61 67 65 31 5b 31 36 5d 29 3b 0a 20 20 20 20 69  age1[16]);.    i
ffd0: 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29  f( ((pageSize-1)
ffe0: 26 70 61 67 65 53 69 7a 65 29 21 3d 30 20 7c 7c  &pageSize)!=0 ||
fff0: 20 70 61 67 65 53 69 7a 65 3c 35 31 32 20 29 7b   pageSize<512 ){
10000 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
10010 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
10020 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
10030 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
10040 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  =0 );.    pBt->p
10050 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
10060 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61  ze;.    pBt->usa
10070 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  bleSize = pageSi
10080 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a  ze - page1[20];.
10090 20 20 20 20 69 66 28 20 70 42 74 2d 3e 75 73 61      if( pBt->usa
100a0 62 6c 65 53 69 7a 65 3c 35 30 30 20 29 7b 0a 20  bleSize<500 ){. 
100b0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
100c0 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
100d0 20 7d 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 45   }.    pBt->maxE
100e0 6d 62 65 64 46 72 61 63 20 3d 20 70 61 67 65 31  mbedFrac = page1
100f0 5b 32 31 5d 3b 0a 20 20 20 20 70 42 74 2d 3e 6d  [21];.    pBt->m
10100 69 6e 45 6d 62 65 64 46 72 61 63 20 3d 20 70 61  inEmbedFrac = pa
10110 67 65 31 5b 32 32 5d 3b 0a 20 20 20 20 70 42 74  ge1[22];.    pBt
10120 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63 20 3d 20  ->minLeafFrac = 
10130 70 61 67 65 31 5b 32 33 5d 3b 0a 23 69 66 6e 64  page1[23];.#ifnd
10140 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
10150 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42  UTOVACUUM.    pB
10160 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
10170 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31  (get4byte(&page1
10180 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29  [36 + 4*4])?1:0)
10190 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
101a0 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74  /* maxLocal is t
101b0 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e  he maximum amoun
101c0 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20  t of payload to 
101d0 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f  store locally fo
101e0 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20  r.  ** a cell.  
101f0 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20  Make sure it is 
10200 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20  small enough so 
10210 74 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69  that at least mi
10220 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c  nFanout.  ** cel
10230 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20  ls can will fit 
10240 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65  on one page.  We
10250 20 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74   assume a 10-byt
10260 65 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20  e page header.. 
10270 20 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65 20   ** Besides the 
10280 70 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c  payload, the cel
10290 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20  l must store:.  
102a0 2a 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f  **     2-byte po
102b0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
102c0 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  l.  **     4-byt
102d0 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a  e child pointer.
102e0 20 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20    **     9-byte 
102f0 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20  nKey value.  ** 
10300 20 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61      4-byte nData
10310 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20   value.  **     
10320 34 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20  4-byte overflow 
10330 70 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a  page pointer.  *
10340 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73  * So a cell cons
10350 69 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65  ists of a 2-byte
10360 20 70 6f 69 6e 65 72 2c 20 61 20 68 65 61 64 65   poiner, a heade
10370 72 20 77 68 69 63 68 20 69 73 20 61 73 20 6d 75  r which is as mu
10380 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79  ch as.  ** 17 by
10390 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e  tes long, 0 to N
103a0 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61   bytes of payloa
103b0 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e  d, and an option
103c0 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c  al 4 byte overfl
103d0 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69  ow.  ** page poi
103e0 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74  nter..  */.  pBt
103f0 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 70 42  ->maxLocal = (pB
10400 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32  t->usableSize-12
10410 29 2a 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64 46  )*pBt->maxEmbedF
10420 72 61 63 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20  rac/255 - 23;.  
10430 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  pBt->minLocal = 
10440 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
10450 2d 31 32 29 2a 70 42 74 2d 3e 6d 69 6e 45 6d 62  -12)*pBt->minEmb
10460 65 64 46 72 61 63 2f 32 35 35 20 2d 20 32 33 3b  edFrac/255 - 23;
10470 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20  .  pBt->maxLeaf 
10480 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
10490 65 20 2d 20 33 35 3b 0a 20 20 70 42 74 2d 3e 6d  e - 35;.  pBt->m
104a0 69 6e 4c 65 61 66 20 3d 20 28 70 42 74 2d 3e 75  inLeaf = (pBt->u
104b0 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 70 42  sableSize-12)*pB
104c0 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63 2f 32  t->minLeafFrac/2
104d0 35 35 20 2d 20 32 33 3b 0a 20 20 69 66 28 20 70  55 - 23;.  if( p
104e0 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3e 70 42 74  Bt->minLocal>pBt
104f0 2d 3e 6d 61 78 4c 6f 63 61 6c 20 7c 7c 20 70 42  ->maxLocal || pB
10500 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3c 30 20 29 7b  t->maxLocal<0 ){
10510 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f  .    goto page1_
10520 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 7d  init_failed;.  }
10530 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
10540 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20  maxLeaf + 23 <= 
10550 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74  MX_CELL_SIZE(pBt
10560 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67  ) );.  pBt->pPag
10570 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 72  e1 = pPage1;.  r
10580 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10590 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  ..page1_init_fai
105a0 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61  led:.  releasePa
105b0 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70 42  ge(pPage1);.  pB
105c0 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
105d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
105e0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
105f0 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20 6c 6f 63  e works like loc
10600 6b 42 74 72 65 65 28 29 20 65 78 63 65 70 74 20  kBtree() except 
10610 74 68 61 74 20 69 74 20 61 6c 73 6f 20 69 6e 76  that it also inv
10620 6f 6b 65 73 20 74 68 65 0a 2a 2a 20 62 75 73 79  okes the.** busy
10630 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65   callback if the
10640 72 65 20 69 73 20 6c 6f 63 6b 20 63 6f 6e 74 65  re is lock conte
10650 6e 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ntion..*/.static
10660 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 57 69   int lockBtreeWi
10670 74 68 52 65 74 72 79 28 42 74 72 65 65 20 2a 70  thRetry(Btree *p
10680 52 65 66 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Ref){.  int rc =
10690 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
106a0 28 20 70 52 65 66 2d 3e 69 6e 54 72 61 6e 73 3d  ( pRef->inTrans=
106b0 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20  =TRANS_NONE ){. 
106c0 20 20 20 75 38 20 69 6e 54 72 61 6e 73 61 63 74     u8 inTransact
106d0 69 6f 6e 20 3d 20 70 52 65 66 2d 3e 70 42 74 2d  ion = pRef->pBt-
106e0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b 0a  >inTransaction;.
106f0 20 20 20 20 62 74 72 65 65 49 6e 74 65 67 72 69      btreeIntegri
10700 74 79 28 70 52 65 66 29 3b 0a 20 20 20 20 72 63  ty(pRef);.    rc
10710 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42   = sqlite3BtreeB
10720 65 67 69 6e 54 72 61 6e 73 28 70 52 65 66 2c 20  eginTrans(pRef, 
10730 30 29 3b 0a 20 20 20 20 70 52 65 66 2d 3e 70 42  0);.    pRef->pB
10740 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
10750 20 3d 20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e   = inTransaction
10760 3b 0a 20 20 20 20 70 52 65 66 2d 3e 69 6e 54 72  ;.    pRef->inTr
10770 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
10780 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
10790 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
107a0 20 70 52 65 66 2d 3e 70 42 74 2d 3e 6e 54 72 61   pRef->pBt->nTra
107b0 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20  nsaction--;.    
107c0 7d 0a 20 20 20 20 62 74 72 65 65 49 6e 74 65 67  }.    btreeInteg
107d0 72 69 74 79 28 70 52 65 66 29 3b 0a 20 20 7d 0a  rity(pRef);.  }.
107e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 20    return rc;.}. 
107f0 20 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 49 66        ../*.** If
10800 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
10810 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72  tstanding cursor
10820 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74  s and we are not
10830 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a   in the middle.*
10840 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  * of a transacti
10850 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69 73 20  on but there is 
10860 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  a read lock on t
10870 68 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  he database, the
10880 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  n.** this routin
10890 65 20 75 6e 72 65 66 73 20 74 68 65 20 66 69 72  e unrefs the fir
108a0 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
108b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69  atabase file whi
108c0 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65  ch .** has the e
108d0 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69  ffect of releasi
108e0 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  ng the read lock
108f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
10900 20 61 72 65 20 61 6e 79 20 6f 75 74 73 74 61 6e   are any outstan
10910 64 69 6e 67 20 63 75 72 73 6f 72 73 2c 20 74 68  ding cursors, th
10920 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
10930 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  no-op..**.** If 
10940 74 68 65 72 65 20 69 73 20 61 20 74 72 61 6e 73  there is a trans
10950 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65  action in progre
10960 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ss, this routine
10970 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
10980 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f  static void unlo
10990 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
109a0 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
109b0 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61    if( pBt->inTra
109c0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
109d0 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 43 75  NONE && pBt->pCu
109e0 72 73 6f 72 3d 3d 30 20 26 26 20 70 42 74 2d 3e  rsor==0 && pBt->
109f0 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20  pPage1!=0 ){.   
10a00 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
10a10 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70  rRefcount(pBt->p
10a20 50 61 67 65 72 29 3e 3d 31 20 29 7b 0a 20 20 20  Pager)>=1 ){.   
10a30 20 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67     if( pBt->pPag
10a40 65 31 2d 3e 61 44 61 74 61 3d 3d 30 20 29 7b 0a  e1->aData==0 ){.
10a50 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
10a60 2a 70 50 61 67 65 20 3d 20 70 42 74 2d 3e 70 50  *pPage = pBt->pP
10a70 61 67 65 31 3b 0a 20 20 20 20 20 20 20 20 70 50  age1;.        pP
10a80 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 26 28 28  age->aData = &((
10a90 75 38 2a 29 70 50 61 67 65 29 5b 2d 70 42 74 2d  u8*)pPage)[-pBt-
10aa0 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20 20 20  >pageSize];.    
10ab0 20 20 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d      pPage->pBt =
10ac0 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20 70 50   pBt;.        pP
10ad0 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 31 3b 0a 20  age->pgno = 1;. 
10ae0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c       }.      rel
10af0 65 61 73 65 50 61 67 65 28 70 42 74 2d 3e 70 50  easePage(pBt->pP
10b00 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  age1);.    }.   
10b10 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
10b20 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d  ;.    pBt->inStm
10b30 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  t = 0;.  }.}../*
10b40 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
10b50 20 64 61 74 61 62 61 73 65 20 62 79 20 69 6e 69   database by ini
10b60 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69  tializing the fi
10b70 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 0a  rst page of the.
10b80 2a 2a 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ** file..*/.stat
10b90 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61  ic int newDataba
10ba0 73 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  se(BtShared *pBt
10bb0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
10bc0 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  1;.  unsigned ch
10bd0 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20  ar *data;.  int 
10be0 72 63 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  rc;.  if( sqlite
10bf0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
10c00 70 42 74 2d 3e 70 50 61 67 65 72 29 3e 30 20 29  pBt->pPager)>0 )
10c10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10c20 4b 3b 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e  K;.  pP1 = pBt->
10c30 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74  pPage1;.  assert
10c40 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61  ( pP1!=0 );.  da
10c50 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b  ta = pP1->aData;
10c60 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
10c70 61 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70  agerWrite(pP1->p
10c80 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
10c90 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
10ca0 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d   memcpy(data, zM
10cb0 61 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65  agicHeader, size
10cc0 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29  of(zMagicHeader)
10cd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a  );.  assert( siz
10ce0 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72  eof(zMagicHeader
10cf0 29 3d 3d 31 36 20 29 3b 0a 20 20 70 75 74 32 62  )==16 );.  put2b
10d00 79 74 65 28 26 64 61 74 61 5b 31 36 5d 2c 20 70  yte(&data[16], p
10d10 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
10d20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20   data[18] = 1;. 
10d30 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20   data[19] = 1;. 
10d40 20 64 61 74 61 5b 32 30 5d 20 3d 20 70 42 74 2d   data[20] = pBt-
10d50 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d  >pageSize - pBt-
10d60 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 64  >usableSize;.  d
10d70 61 74 61 5b 32 31 5d 20 3d 20 70 42 74 2d 3e 6d  ata[21] = pBt->m
10d80 61 78 45 6d 62 65 64 46 72 61 63 3b 0a 20 20 64  axEmbedFrac;.  d
10d90 61 74 61 5b 32 32 5d 20 3d 20 70 42 74 2d 3e 6d  ata[22] = pBt->m
10da0 69 6e 45 6d 62 65 64 46 72 61 63 3b 0a 20 20 64  inEmbedFrac;.  d
10db0 61 74 61 5b 32 33 5d 20 3d 20 70 42 74 2d 3e 6d  ata[23] = pBt->m
10dc0 69 6e 4c 65 61 66 46 72 61 63 3b 0a 20 20 6d 65  inLeafFrac;.  me
10dd0 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20  mset(&data[24], 
10de0 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65  0, 100-24);.  ze
10df0 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f  roPage(pP1, PTF_
10e00 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c  INTKEY|PTF_LEAF|
10e10 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a  PTF_LEAFDATA );.
10e20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46    pBt->pageSizeF
10e30 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65  ixed = 1;.#ifnde
10e40 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
10e50 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20 70  TOVACUUM.  if( p
10e60 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
10e70 7b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26  {.    put4byte(&
10e80 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20  data[36 + 4*4], 
10e90 31 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  1);.  }.#endif. 
10ea0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10eb0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  K;.}../*.** Atte
10ec0 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61 20 6e  mpt to start a n
10ed0 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ew transaction. 
10ee0 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
10ef0 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74 65  ion.** is starte
10f00 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20  d if the second 
10f10 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a  argument is nonz
10f20 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 61  ero, otherwise a
10f30 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61   read-.** transa
10f40 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73  ction.  If the s
10f50 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
10f60 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20  s 2 or more and 
10f70 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61  exclusive.** tra
10f80 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72  nsaction is star
10f90 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61  ted, meaning tha
10fa0 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65  t no other proce
10fb0 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a  ss is allowed.**
10fc0 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
10fd0 61 74 61 62 61 73 65 2e 20 20 41 20 70 72 65 65  atabase.  A pree
10fe0 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63 74  xisting transact
10ff0 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a  ion may not be.*
11000 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20 65 78  * upgraded to ex
11010 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c 69  clusive by calli
11020 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
11030 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20  a second time - 
11040 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69  the.** exclusivi
11050 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72  ty flag only wor
11060 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72 61  ks for a new tra
11070 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
11080 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
11090 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72  ion must be star
110a0 74 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d  ted before attem
110b0 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68  pting any .** ch
110c0 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  anges to the dat
110d0 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20  abase.  None of 
110e0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  the following ro
110f0 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20  utines .** will 
11100 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74 72  work unless a tr
11110 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61  ansaction is sta
11120 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a  rted first:.**.*
11130 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
11140 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 29  reeCreateTable()
11150 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
11160 42 74 72 65 65 43 72 65 61 74 65 49 6e 64 65 78  BtreeCreateIndex
11170 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
11180 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c  e3BtreeClearTabl
11190 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
111a0 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c  te3BtreeDropTabl
111b0 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
111c0 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 29  te3BtreeInsert()
111d0 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
111e0 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a  BtreeDelete().**
111f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
11200 65 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a 2a  eeUpdateMeta().*
11210 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74 69  *.** If an initi
11220 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63  al attempt to ac
11230 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20 66  quire the lock f
11240 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66 20  ails because of 
11250 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a  lock contention.
11260 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ** and the datab
11270 61 73 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  ase was previous
11280 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65  ly unlocked, the
11290 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  n invoke the bus
112a0 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20  y handler.** if 
112b0 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 42  there is one.  B
112c0 75 74 20 69 66 20 74 68 65 72 65 20 77 61 73 20  ut if there was 
112d0 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65 61  previously a rea
112e0 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a  d-lock, do not.*
112f0 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  * invoke the bus
11300 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74  y handler - just
11310 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
11320 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55 53  USY.  SQLITE_BUS
11330 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  Y is .** returne
11340 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
11350 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c  already a read-l
11360 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ock in order to 
11370 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63 6b  avoid a deadlock
11380 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20  ..**.** Suppose 
11390 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 72  there are two pr
113a0 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20 42 2e  ocesses A and B.
113b0 20 20 41 20 68 61 73 20 61 20 72 65 61 64 20 6c    A has a read l
113c0 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a  ock and B has.**
113d0 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
113e0 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20 70 72  .  B tries to pr
113f0 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73 69  omote to exclusi
11400 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65  ve but is blocke
11410 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20  d because.** of 
11420 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20  A's read lock.  
11430 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f  A tries to promo
11440 74 65 20 74 6f 20 72 65 73 65 72 76 65 64 20 62  te to reserved b
11450 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 79  ut is blocked by
11460 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68   B..** One or th
11470 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 74  e other of the t
11480 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75 73  wo processes mus
11490 74 20 67 69 76 65 20 77 61 79 20 6f 72 20 74 68  t give way or th
114a0 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f  ere can be.** no
114b0 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20 72   progress.  By r
114c0 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f  eturning SQLITE_
114d0 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76  BUSY and not inv
114e0 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20 63  oking the busy c
114f0 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20  allback.** when 
11500 41 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20  A already has a 
11510 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e  read lock, we en
11520 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69 76  courage A to giv
11530 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a  e up and let B.*
11540 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e  * proceed..*/.in
11550 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  t sqlite3BtreeBe
11560 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a  ginTrans(Btree *
11570 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a  p, int wrflag){.
11580 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
11590 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
115a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
115b0 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
115c0 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  y(p);..  /* If t
115d0 68 65 20 62 74 72 65 65 20 69 73 20 61 6c 72 65  he btree is alre
115e0 61 64 79 20 69 6e 20 61 20 77 72 69 74 65 2d 74  ady in a write-t
115f0 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69  ransaction, or i
11600 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64  t.  ** is alread
11610 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72 61 6e  y in a read-tran
11620 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 72 65  saction and a re
11630 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  ad-transaction. 
11640 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74 65 64   ** is requested
11650 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  , this is a no-o
11660 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  p..  */.  if( p-
11670 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
11680 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54  WRITE || (p->inT
11690 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44  rans==TRANS_READ
116a0 20 26 26 20 21 77 72 66 6c 61 67 29 20 29 7b 0a   && !wrflag) ){.
116b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
116c0 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
116d0 57 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  Write transactio
116e0 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f 73 73 69  ns are not possi
116f0 62 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e  ble on a read-on
11700 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ly database */. 
11710 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e   if( pBt->readOn
11720 6c 79 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a  ly && wrflag ){.
11730 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11740 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a  E_READONLY;.  }.
11750 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72  .  /* If another
11760 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
11770 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65   has already ope
11780 6e 65 64 20 61 20 77 72 69 74 65 20 74 72 61 6e  ned a write tran
11790 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e  saction .  ** on
117a0 20 74 68 69 73 20 73 68 61 72 65 64 2d 62 74 72   this shared-btr
117b0 65 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ee structure and
117c0 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20   a second write 
117d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20  transaction is. 
117e0 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72   ** requested, r
117f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
11800 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42  Y..  */.  if( pB
11810 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
11820 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26  ==TRANS_WRITE &&
11830 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72   wrflag ){.    r
11840 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
11850 59 3b 0a 20 20 7d 0a 0a 20 20 64 6f 20 7b 0a 20  Y;.  }..  do {. 
11860 20 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67     if( pBt->pPag
11870 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  e1==0 ){.      r
11880 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42  c = lockBtree(pB
11890 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  t);.    }..    i
118a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
118b0 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20   && wrflag ){.  
118c0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61      if( pBt->rea
118d0 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20  dOnly ){.       
118e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
118f0 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c  DONLY;.      }el
11900 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
11910 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67   sqlite3PagerBeg
11920 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  in(pBt->pPage1->
11930 70 44 62 50 61 67 65 2c 20 77 72 66 6c 61 67 3e  pDbPage, wrflag>
11940 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
11950 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
11960 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
11970 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29  newDatabase(pBt)
11980 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
11990 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
119a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
119b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
119c0 77 72 66 6c 61 67 20 29 20 70 42 74 2d 3e 69 6e  wrflag ) pBt->in
119d0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Stmt = 0;.    }e
119e0 6c 73 65 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63  lse{.      unloc
119f0 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
11a00 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68  Bt);.    }.  }wh
11a10 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
11a20 42 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54  BUSY && pBt->inT
11a30 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
11a40 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20  S_NONE &&.      
11a50 20 20 20 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b      sqlite3Invok
11a60 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74  eBusyHandler(pBt
11a70 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 29 20  ->pBusyHandler) 
11a80 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
11a90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
11aa0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
11ab0 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
11ac0 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63     pBt->nTransac
11ad0 74 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  tion++;.    }.  
11ae0 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28    p->inTrans = (
11af0 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49  wrflag?TRANS_WRI
11b00 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a  TE:TRANS_READ);.
11b10 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61      if( p->inTra
11b20 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  ns>pBt->inTransa
11b30 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70  ction ){.      p
11b40 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
11b50 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a  n = p->inTrans;.
11b60 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 62 74 72      }.  }..  btr
11b70 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
11b80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
11b90 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11ba0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a  MIT_AUTOVACUUM..
11bb0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f  /*.** Set the po
11bc0 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
11bd0 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72  s for all childr
11be0 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67 65  en of page pPage
11bf0 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50  . Also, if.** pP
11c00 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c  age contains cel
11c10 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ls that point to
11c20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
11c30 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72   set the pointer
11c40 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20  .** map entries 
11c50 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
11c60 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a   pages as well..
11c70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
11c80 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65  tChildPtrmaps(Me
11c90 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
11ca0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
11cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cc0 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76      /* Counter v
11cd0 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  ariable */.  int
11ce0 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20   nCell;         
11cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d00 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
11d10 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61 67 65  ls in page pPage
11d20 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
11d30 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
11d40 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
11d50 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53  rn code */.  BtS
11d60 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
11d70 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 69  ge->pBt;.  int i
11d80 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67  sInitOrig = pPag
11d90 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e  e->isInit;.  Pgn
11da0 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e  o pgno = pPage->
11db0 70 67 6e 6f 3b 0a 0a 20 20 69 6e 69 74 50 61 67  pgno;..  initPag
11dc0 65 28 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 6e  e(pPage, 0);.  n
11dd0 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43  Cell = pPage->nC
11de0 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  ell;..  for(i=0;
11df0 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
11e00 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20      u8 *pCell = 
11e10 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
11e20 69 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 74  i);..    rc = pt
11e30 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70  rmapPutOvflPtr(p
11e40 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20  Page, pCell);.  
11e50 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11e60 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
11e70 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d  o set_child_ptrm
11e80 61 70 73 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a  aps_out;.    }..
11e90 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
11ea0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67  leaf ){.      Pg
11eb0 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67  no childPgno = g
11ec0 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a  et4byte(pCell);.
11ed0 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
11ee0 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50  pPut(pBt, childP
11ef0 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
11f00 45 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  E, pgno);.      
11f10 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11f20 4b 20 29 20 67 6f 74 6f 20 73 65 74 5f 63 68 69  K ) goto set_chi
11f30 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a  ld_ptrmaps_out;.
11f40 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
11f50 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
11f60 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50  .    Pgno childP
11f70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
11f80 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
11f90 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
11fa0 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d  );.    rc = ptrm
11fb0 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64  apPut(pBt, child
11fc0 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  Pgno, PTRMAP_BTR
11fd0 45 45 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 0a  EE, pgno);.  }..
11fe0 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70  set_child_ptrmap
11ff0 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e  s_out:.  pPage->
12000 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f  isInit = isInitO
12010 72 69 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  rig;.  return rc
12020 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77  ;.}../*.** Somew
12030 68 65 72 65 20 6f 6e 20 70 50 61 67 65 2c 20 77  here on pPage, w
12040 68 69 63 68 20 69 73 20 67 75 61 72 65 6e 74 65  hich is guarente
12050 65 64 20 74 6f 20 62 65 20 61 20 62 74 72 65 65  ed to be a btree
12060 20 70 61 67 65 2c 20 6e 6f 74 20 61 6e 20 6f 76   page, not an ov
12070 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 2c 20  erflow.** page, 
12080 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
12090 70 61 67 65 20 69 46 72 6f 6d 2e 20 4d 6f 64 69  page iFrom. Modi
120a0 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20  fy this pointer 
120b0 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
120c0 73 20 74 6f 0a 2a 2a 20 69 54 6f 2e 20 50 61 72  s to.** iTo. Par
120d0 61 6d 65 74 65 72 20 65 54 79 70 65 20 64 65 73  ameter eType des
120e0 63 72 69 62 65 73 20 74 68 65 20 74 79 70 65 20  cribes the type 
120f0 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 20 62 65  of pointer to be
12100 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 0a 2a   modified, as .*
12110 2a 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  * follows:.**.**
12120 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20   PTRMAP_BTREE:  
12130 20 20 20 70 50 61 67 65 20 69 73 20 61 20 62 74     pPage is a bt
12140 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f  ree-page. The po
12150 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20  inter points at 
12160 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20  a child .**     
12170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
12180 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a  ge of pPage..**.
12190 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ** PTRMAP_OVERFL
121a0 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20 61 20  OW1: pPage is a 
121b0 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20  btree-page. The 
121c0 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
121d0 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  t an overflow.**
121e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121f0 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20     page pointed 
12200 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65  to by one of the
12210 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e   cells on pPage.
12220 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56  .**.** PTRMAP_OV
12230 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69  ERFLOW2: pPage i
12240 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61  s an overflow-pa
12250 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
12260 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65  points at the ne
12270 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  xt.**           
12280 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77          overflow
12290 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73   page in the lis
122a0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
122b0 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74   modifyPagePoint
122c0 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  er(MemPage *pPag
122d0 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50  e, Pgno iFrom, P
122e0 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70  gno iTo, u8 eTyp
122f0 65 29 7b 0a 20 20 69 66 28 20 65 54 79 70 65 3d  e){.  if( eType=
12300 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
12310 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  2 ){.    /* The 
12320 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61 79  pointer is alway
12330 73 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  s the first 4 by
12340 74 65 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  tes of the page 
12350 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a  in this case.  *
12360 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34 62 79  /.    if( get4by
12370 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29  te(pPage->aData)
12380 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  !=iFrom ){.     
12390 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
123a0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
123b0 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65 28   }.    put4byte(
123c0 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54  pPage->aData, iT
123d0 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
123e0 20 69 6e 74 20 69 73 49 6e 69 74 4f 72 69 67 20   int isInitOrig 
123f0 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b  = pPage->isInit;
12400 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
12410 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20  int nCell;..    
12420 69 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c 20  initPage(pPage, 
12430 30 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20  0);.    nCell = 
12440 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20  pPage->nCell;.. 
12450 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
12460 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
12470 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e   u8 *pCell = fin
12480 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
12490 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
124a0 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
124b0 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65  W1 ){.        Ce
124c0 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
124d0 20 20 20 20 20 70 61 72 73 65 43 65 6c 6c 50 74       parseCellPt
124e0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
124f0 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  &info);.        
12500 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
12510 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ow ){.          
12520 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62  if( iFrom==get4b
12530 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
12540 69 4f 76 65 72 66 6c 6f 77 5d 29 20 29 7b 0a 20  iOverflow]) ){. 
12550 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
12560 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
12570 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29  iOverflow], iTo)
12580 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
12590 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
125a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
125b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
125c0 69 66 28 20 67 65 74 34 62 79 74 65 28 70 43 65  if( get4byte(pCe
125d0 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  ll)==iFrom ){.  
125e0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
125f0 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20  (pCell, iTo);.  
12600 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
12610 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
12620 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66  .    }.  .    if
12630 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20  ( i==nCell ){.  
12640 20 20 20 20 69 66 28 20 65 54 79 70 65 21 3d 50      if( eType!=P
12650 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a  TRMAP_BTREE || .
12660 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79            get4by
12670 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
12680 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
12690 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a  t+8])!=iFrom ){.
126a0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
126b0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
126c0 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
126d0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
126e0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
126f0 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54  hdrOffset+8], iT
12700 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  o);.    }..    p
12710 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69  Page->isInit = i
12720 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20  sInitOrig;.  }. 
12730 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12740 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  K;.}.../*.** Mov
12750 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  e the open datab
12760 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65  ase page pDbPage
12770 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72   to location iFr
12780 65 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  eePage in the .*
12790 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20  * database. The 
127a0 70 44 62 50 61 67 65 20 72 65 66 65 72 65 6e 63  pDbPage referenc
127b0 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e  e remains valid.
127c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
127d0 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42  elocatePage(.  B
127e0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
127f0 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65          /* Btree
12800 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
12810 44 62 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f  DbPage,        /
12820 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d  * Open page to m
12830 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70  ove */.  u8 eTyp
12840 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
12850 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
12860 20 27 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f   'type' entry fo
12870 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  r pDbPage */.  P
12880 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20  gno iPtrPage,   
12890 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
128a0 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27  er map 'page-no'
128b0 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61   entry for pDbPa
128c0 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72  ge */.  Pgno iFr
128d0 65 65 50 61 67 65 20 20 20 20 20 20 20 20 20 20  eePage          
128e0 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e   /* The location
128f0 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65   to move pDbPage
12900 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50   to */.){.  MemP
12910 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20 20  age *pPtrPage;  
12920 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
12930 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  t contains a poi
12940 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67 65 20  nter to pDbPage 
12950 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67  */.  Pgno iDbPag
12960 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  e = pDbPage->pgn
12970 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  o;.  Pager *pPag
12980 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72  er = pBt->pPager
12990 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
129a0 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50 54  ssert( eType==PT
129b0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c  RMAP_OVERFLOW2 |
129c0 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
129d0 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20  OVERFLOW1 || .  
129e0 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41      eType==PTRMA
129f0 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65  P_BTREE || eType
12a00 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
12a10 45 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20  E );..  /* Move 
12a20 70 61 67 65 20 69 44 62 50 61 67 65 20 66 72 6f  page iDbPage fro
12a30 6d 20 69 74 27 73 20 63 75 72 72 65 6e 74 20 6c  m it's current l
12a40 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20  ocation to page 
12a50 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61 67 65  number iFreePage
12a60 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55   */.  TRACE(("AU
12a70 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67  TOVACUUM: Moving
12a80 20 25 64 20 74 6f 20 66 72 65 65 20 70 61 67 65   %d to free page
12a90 20 25 64 20 28 70 74 72 20 70 61 67 65 20 25 64   %d (ptr page %d
12aa0 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20   type %d)\n", . 
12ab0 20 20 20 20 20 69 44 62 50 61 67 65 2c 20 69 46       iDbPage, iF
12ac0 72 65 65 50 61 67 65 2c 20 69 50 74 72 50 61 67  reePage, iPtrPag
12ad0 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63  e, eType));.  rc
12ae0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d   = sqlite3PagerM
12af0 6f 76 65 70 61 67 65 28 70 50 61 67 65 72 2c 20  ovepage(pPager, 
12b00 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65  pDbPage->pDbPage
12b10 2c 20 69 46 72 65 65 50 61 67 65 29 3b 0a 20 20  , iFreePage);.  
12b20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12b30 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
12b40 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61 67  rc;.  }.  pDbPag
12b50 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65 50  e->pgno = iFreeP
12b60 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44  age;..  /* If pD
12b70 62 50 61 67 65 20 77 61 73 20 61 20 62 74 72 65  bPage was a btre
12b80 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20  e-page, then it 
12b90 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64 20 70  may have child p
12ba0 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c  ages and/or cell
12bb0 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e  s.  ** that poin
12bc0 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  t to overflow pa
12bd0 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  ges. The pointer
12be0 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72   map entries for
12bf0 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20   all these.  ** 
12c00 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65  pages need to be
12c10 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20   changed..  **. 
12c20 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20 69   ** If pDbPage i
12c30 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  s an overflow pa
12c40 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  ge, then the fir
12c50 73 74 20 34 20 62 79 74 65 73 20 6d 61 79 20 73  st 4 bytes may s
12c60 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e  tore a.  ** poin
12c70 74 65 72 20 74 6f 20 61 20 73 75 62 73 65 71 75  ter to a subsequ
12c80 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
12c90 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  e. If this is th
12ca0 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a  e case, then.  *
12cb0 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * the pointer ma
12cc0 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70  p needs to be up
12cd0 64 61 74 65 64 20 66 6f 72 20 74 68 65 20 73 75  dated for the su
12ce0 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f  bsequent overflo
12cf0 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  w page..  */.  i
12d00 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
12d10 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d  _BTREE || eType=
12d20 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
12d30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74   ){.    rc = set
12d40 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44 62  ChildPtrmaps(pDb
12d50 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
12d60 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
12d70 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
12d80 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
12d90 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66      Pgno nextOvf
12da0 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70 44 62  l = get4byte(pDb
12db0 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20  Page->aData);.  
12dc0 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d    if( nextOvfl!=
12dd0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
12de0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6e  ptrmapPut(pBt, n
12df0 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  extOvfl, PTRMAP_
12e00 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65 65  OVERFLOW2, iFree
12e10 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
12e20 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12e30 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
12e40 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
12e50 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78   }.  }..  /* Fix
12e60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70 6f   the database po
12e70 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69 50  inter on page iP
12e80 74 72 50 61 67 65 20 74 68 61 74 20 70 6f 69 6e  trPage that poin
12e90 74 65 64 20 61 74 20 69 44 62 50 61 67 65 20 73  ted at iDbPage s
12ea0 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20 70  o.  ** that it p
12eb0 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65 50 61  oints at iFreePa
12ec0 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68 65  ge. Also fix the
12ed0 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
12ee0 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72  ry for.  ** iPtr
12ef0 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  Page..  */.  if(
12f00 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52   eType!=PTRMAP_R
12f10 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72  OOTPAGE ){.    r
12f20 63 20 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c  c = getPage(pBt,
12f30 20 69 50 74 72 50 61 67 65 2c 20 26 70 50 74 72   iPtrPage, &pPtr
12f40 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  Page, 0);.    if
12f50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12f60 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
12f70 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
12f80 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
12f90 72 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70  rite(pPtrPage->p
12fa0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
12fb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12fc0 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
12fd0 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20  age(pPtrPage);. 
12fe0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
12ff0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d      }.    rc = m
13000 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72  odifyPagePointer
13010 28 70 50 74 72 50 61 67 65 2c 20 69 44 62 50 61  (pPtrPage, iDbPa
13020 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65  ge, iFreePage, e
13030 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61  Type);.    relea
13040 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29  sePage(pPtrPage)
13050 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
13060 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13070 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
13080 70 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20  pBt, iFreePage, 
13090 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 29  eType, iPtrPage)
130a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
130b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46  turn rc;.}../* F
130c0 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
130d0 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 61  on required by a
130e0 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28  utoVacuumCommit(
130f0 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ). */.static int
13100 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
13110 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d  ge(BtShared *, M
13120 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20  emPage **, Pgno 
13130 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f  *, Pgno, u8);../
13140 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
13150 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f  e is called prio
13160 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  r to sqlite3Page
13170 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74  rCommit when a t
13180 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73  ransaction.** is
13190 20 63 6f 6d 6d 69 74 65 64 20 66 6f 72 20 61 6e   commited for an
131a0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
131b0 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  abase..**.** If 
131c0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
131d0 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54  urned, then *pnT
131e0 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74  runc is set to t
131f0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
13200 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  es.** the databa
13210 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62  se file should b
13220 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64  e truncated to d
13230 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74  uring the commit
13240 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e   process. .** i.
13250 65 2e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  e. the database 
13260 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e  has been reorgan
13270 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c  ized so that onl
13280 79 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54  y the first *pnT
13290 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72  runc.** pages ar
132a0 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61  e in use..*/.sta
132b0 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75  tic int autoVacu
132c0 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65  umCommit(BtShare
132d0 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 2a 70 6e  d *pBt, Pgno *pn
132e0 54 72 75 6e 63 29 7b 0a 20 20 50 61 67 65 72 20  Trunc){.  Pager 
132f0 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70  *pPager = pBt->p
13300 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 46  Pager;.  Pgno nF
13310 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20  reeList;        
13320 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
13330 20 70 61 67 65 73 20 72 65 6d 61 69 6e 69 6e 67   pages remaining
13340 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
13350 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 74 72  t. */.  int nPtr
13360 4d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Map;            
13370 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
13380 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
13390 73 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 2a 2f  s deallocated */
133a0 0a 20 20 50 67 6e 6f 20 6f 72 69 67 53 69 7a 65  .  Pgno origSize
133b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
133c0 20 50 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   Pages in the da
133d0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
133e0 20 50 67 6e 6f 20 66 69 6e 53 69 7a 65 3b 20 20   Pgno finSize;  
133f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
13400 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
13410 62 61 73 65 20 66 69 6c 65 20 61 66 74 65 72 20  base file after 
13420 74 72 75 6e 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  truncation */.  
13430 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
13440 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
13450 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75  turn code */.  u
13460 38 20 65 54 79 70 65 3b 0a 20 20 69 6e 74 20 70  8 eType;.  int p
13470 67 73 7a 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  gsz = pBt->pageS
13480 69 7a 65 3b 20 20 2f 2a 20 50 61 67 65 20 73 69  ize;  /* Page si
13490 7a 65 20 66 6f 72 20 74 68 69 73 20 64 61 74 61  ze for this data
134a0 62 61 73 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  base */.  Pgno i
134b0 44 62 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  DbPage;         
134c0 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
134d0 62 61 73 65 20 70 61 67 65 20 74 6f 20 6d 6f 76  base page to mov
134e0 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
134f0 70 44 62 4d 65 6d 50 61 67 65 20 3d 20 30 3b 20  pDbMemPage = 0; 
13500 20 20 2f 2a 20 22 22 20 2a 2f 0a 20 20 50 67 6e    /* "" */.  Pgn
13510 6f 20 69 50 74 72 50 61 67 65 3b 20 20 20 20 20  o iPtrPage;     
13520 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
13530 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
13540 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  s a pointer to i
13550 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
13560 20 69 46 72 65 65 50 61 67 65 3b 20 20 20 20 20   iFreePage;     
13570 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 72         /* The fr
13580 65 65 2d 6c 69 73 74 20 70 61 67 65 20 74 6f 20  ee-list page to 
13590 6d 6f 76 65 20 69 44 62 50 61 67 65 20 74 6f 20  move iDbPage to 
135a0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 46  */.  MemPage *pF
135b0 72 65 65 4d 65 6d 50 61 67 65 20 3d 20 30 3b 20  reeMemPage = 0; 
135c0 2f 2a 20 22 22 20 2a 2f 0a 0a 23 69 66 6e 64 65  /* "" */..#ifnde
135d0 66 20 4e 44 45 42 55 47 0a 20 20 69 6e 74 20 6e  f NDEBUG.  int n
135e0 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67  Ref = sqlite3Pag
135f0 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65  erRefcount(pPage
13600 72 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  r);.#endif..  as
13610 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
13620 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 50  acuum );.  if( P
13630 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
13640 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  , sqlite3PagerPa
13650 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 29  gecount(pPager))
13660 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
13670 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
13680 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69  PT;.  }..  /* Fi
13690 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
136a0 79 20 66 72 65 65 2d 70 61 67 65 73 20 61 72 65  y free-pages are
136b0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
136c0 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e  . If there are n
136d0 6f 0a 20 20 2a 2a 20 66 72 65 65 20 70 61 67 65  o.  ** free page
136e0 73 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63  s, then auto-vac
136f0 75 75 6d 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  uum is a no-op..
13700 20 20 2a 2f 0a 20 20 6e 46 72 65 65 4c 69 73 74    */.  nFreeList
13710 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74   = get4byte(&pBt
13720 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
13730 33 36 5d 29 3b 0a 20 20 69 66 28 20 6e 46 72 65  36]);.  if( nFre
13740 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  eList==0 ){.    
13750 2a 70 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 20 20  *pnTrunc = 0;.  
13760 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13770 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  OK;.  }..  /* Th
13780 69 73 20 62 6c 6f 63 6b 20 66 69 67 75 72 65 73  is block figures
13790 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 70 61   out how many pa
137a0 67 65 73 20 74 68 65 72 65 20 61 72 65 20 69 6e  ges there are in
137b0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
137c0 2a 2a 20 6e 6f 77 20 28 76 61 72 69 61 62 6c 65  ** now (variable
137d0 20 6f 72 69 67 53 69 7a 65 29 2c 20 61 6e 64 20   origSize), and 
137e0 68 6f 77 20 6d 61 6e 79 20 74 68 65 72 65 20 77  how many there w
137f0 69 6c 6c 20 62 65 20 61 66 74 65 72 20 74 68 65  ill be after the
13800 0a 20 20 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e  .  ** truncation
13810 20 28 76 61 72 69 61 62 6c 65 20 66 69 6e 53 69   (variable finSi
13820 7a 65 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ze)..  **.  ** T
13830 68 65 20 66 69 6e 61 6c 20 73 69 7a 65 20 69 73  he final size is
13840 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 69   the original si
13850 7a 65 2c 20 6c 65 73 73 20 74 68 65 20 6e 75 6d  ze, less the num
13860 62 65 72 20 6f 66 20 66 72 65 65 20 70 61 67 65  ber of free page
13870 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 64 61  s.  ** in the da
13880 74 61 62 61 73 65 2c 20 6c 65 73 73 20 61 6e 79  tabase, less any
13890 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
138a0 65 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f 20  es that will no 
138b0 6c 6f 6e 67 65 72 0a 20 20 2a 2a 20 62 65 20 72  longer.  ** be r
138c0 65 71 75 69 72 65 64 2c 20 6c 65 73 73 20 31 20  equired, less 1 
138d0 69 66 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 62  if the pending-b
138e0 79 74 65 20 70 61 67 65 20 77 61 73 20 70 61 72  yte page was par
138f0 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
13900 65 0a 20 20 2a 2a 20 62 75 74 20 69 73 20 6e 6f  e.  ** but is no
13910 74 20 61 66 74 65 72 20 74 68 65 20 74 72 75 6e  t after the trun
13920 63 61 74 69 6f 6e 2e 0a 20 20 2a 2a 2f 0a 20 20  cation..  **/.  
13930 6f 72 69 67 53 69 7a 65 20 3d 20 73 71 6c 69 74  origSize = sqlit
13940 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
13950 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
13960 6f 72 69 67 53 69 7a 65 3d 3d 50 45 4e 44 49 4e  origSize==PENDIN
13970 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
13980 20 29 7b 0a 20 20 20 20 6f 72 69 67 53 69 7a 65   ){.    origSize
13990 2d 2d 3b 0a 20 20 7d 0a 20 20 6e 50 74 72 4d 61  --;.  }.  nPtrMa
139a0 70 20 3d 20 28 6e 46 72 65 65 4c 69 73 74 2d 6f  p = (nFreeList-o
139b0 72 69 67 53 69 7a 65 2b 50 54 52 4d 41 50 5f 50  rigSize+PTRMAP_P
139c0 41 47 45 4e 4f 28 70 42 74 2c 20 6f 72 69 67 53  AGENO(pBt, origS
139d0 69 7a 65 29 2b 70 67 73 7a 2f 35 29 2f 28 70 67  ize)+pgsz/5)/(pg
139e0 73 7a 2f 35 29 3b 0a 20 20 66 69 6e 53 69 7a 65  sz/5);.  finSize
139f0 20 3d 20 6f 72 69 67 53 69 7a 65 20 2d 20 6e 46   = origSize - nF
13a00 72 65 65 4c 69 73 74 20 2d 20 6e 50 74 72 4d 61  reeList - nPtrMa
13a10 70 3b 0a 20 20 69 66 28 20 6f 72 69 67 53 69 7a  p;.  if( origSiz
13a20 65 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  e>PENDING_BYTE_P
13a30 41 47 45 28 70 42 74 29 20 26 26 20 66 69 6e 53  AGE(pBt) && finS
13a40 69 7a 65 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ize<=PENDING_BYT
13a50 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
13a60 20 20 20 66 69 6e 53 69 7a 65 2d 2d 3b 0a 20 20     finSize--;.  
13a70 7d 0a 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41  }.  while( PTRMA
13a80 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 66 69  P_ISPAGE(pBt, fi
13a90 6e 53 69 7a 65 29 20 7c 7c 20 66 69 6e 53 69 7a  nSize) || finSiz
13aa0 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  e==PENDING_BYTE_
13ab0 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
13ac0 20 66 69 6e 53 69 7a 65 2d 2d 3b 0a 20 20 7d 0a   finSize--;.  }.
13ad0 20 20 54 52 41 43 45 28 28 22 41 55 54 4f 56 41    TRACE(("AUTOVA
13ae0 43 55 55 4d 3a 20 42 65 67 69 6e 20 28 64 62 20  CUUM: Begin (db 
13af0 73 69 7a 65 20 25 64 2d 3e 25 64 29 5c 6e 22 2c  size %d->%d)\n",
13b00 20 6f 72 69 67 53 69 7a 65 2c 20 66 69 6e 53 69   origSize, finSi
13b10 7a 65 29 29 3b 0a 0a 20 20 2f 2a 20 56 61 72 69  ze));..  /* Vari
13b20 61 62 6c 65 20 27 66 69 6e 53 69 7a 65 27 20 77  able 'finSize' w
13b30 69 6c 6c 20 62 65 20 74 68 65 20 73 69 7a 65 20  ill be the size 
13b40 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 20 70  of the file in p
13b50 61 67 65 73 20 61 66 74 65 72 0a 20 20 2a 2a 20  ages after.  ** 
13b60 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  the auto-vacuum 
13b70 68 61 73 20 63 6f 6d 70 6c 65 74 65 64 20 28 74  has completed (t
13b80 68 65 20 63 75 72 72 65 6e 74 20 66 69 6c 65 20  he current file 
13b90 73 69 7a 65 20 6d 69 6e 75 73 20 74 68 65 20 6e  size minus the n
13ba0 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 70 61  umber.  ** of pa
13bb0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 20  ges on the free 
13bc0 6c 69 73 74 29 2e 20 4c 6f 6f 70 20 74 68 72 6f  list). Loop thro
13bd0 75 67 68 20 74 68 65 20 70 61 67 65 73 20 74 68  ugh the pages th
13be0 61 74 20 6c 69 65 20 62 65 79 6f 6e 64 0a 20 20  at lie beyond.  
13bf0 2a 2a 20 74 68 69 73 20 6d 61 72 6b 2c 20 61 6e  ** this mark, an
13c00 64 20 69 66 20 74 68 65 79 20 61 72 65 20 6e 6f  d if they are no
13c10 74 20 61 6c 72 65 61 64 79 20 6f 6e 20 74 68 65  t already on the
13c20 20 66 72 65 65 20 6c 69 73 74 2c 20 6d 6f 76 65   free list, move
13c30 20 74 68 65 6d 0a 20 20 2a 2a 20 74 6f 20 61 20   them.  ** to a 
13c40 66 72 65 65 20 70 61 67 65 20 65 61 72 6c 69 65  free page earlie
13c50 72 20 69 6e 20 74 68 65 20 66 69 6c 65 20 28 73  r in the file (s
13c60 6f 6d 65 77 68 65 72 65 20 62 65 66 6f 72 65 20  omewhere before 
13c70 66 69 6e 53 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20  finSize)..  */. 
13c80 20 66 6f 72 28 20 69 44 62 50 61 67 65 3d 66 69   for( iDbPage=fi
13c90 6e 53 69 7a 65 2b 31 3b 20 69 44 62 50 61 67 65  nSize+1; iDbPage
13ca0 3c 3d 6f 72 69 67 53 69 7a 65 3b 20 69 44 62 50  <=origSize; iDbP
13cb0 61 67 65 2b 2b 20 29 7b 0a 20 20 20 20 2f 2a 20  age++ ){.    /* 
13cc0 49 66 20 69 44 62 50 61 67 65 20 69 73 20 61 20  If iDbPage is a 
13cd0 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
13ce0 2c 20 6f 72 20 74 68 65 20 70 65 6e 64 69 6e 67  , or the pending
13cf0 2d 62 79 74 65 20 70 61 67 65 2c 20 73 6b 69 70  -byte page, skip
13d00 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   it. */.    if( 
13d10 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
13d20 74 2c 20 69 44 62 50 61 67 65 29 20 7c 7c 20 69  t, iDbPage) || i
13d30 44 62 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f  DbPage==PENDING_
13d40 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
13d50 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  {.      continue
13d60 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20  ;.    }..    rc 
13d70 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
13d80 20 69 44 62 50 61 67 65 2c 20 26 65 54 79 70 65   iDbPage, &eType
13d90 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20  , &iPtrPage);.  
13da0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
13db0 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 75 74 6f 76  _OK ) goto autov
13dc0 61 63 75 75 6d 5f 6f 75 74 3b 0a 20 20 20 20 69  acuum_out;.    i
13dd0 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
13de0 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
13df0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
13e00 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
13e10 20 20 20 67 6f 74 6f 20 61 75 74 6f 76 61 63 75     goto autovacu
13e20 75 6d 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20  um_out;.    }.. 
13e30 20 20 20 2f 2a 20 49 66 20 69 44 62 50 61 67 65     /* If iDbPage
13e40 20 69 73 20 66 72 65 65 2c 20 64 6f 20 6e 6f 74   is free, do not
13e50 20 73 77 61 70 20 69 74 2e 20 20 2a 2f 0a 20 20   swap it.  */.  
13e60 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
13e70 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a  MAP_FREEPAGE ){.
13e80 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
13e90 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 67      }.    rc = g
13ea0 65 74 50 61 67 65 28 70 42 74 2c 20 69 44 62 50  etPage(pBt, iDbP
13eb0 61 67 65 2c 20 26 70 44 62 4d 65 6d 50 61 67 65  age, &pDbMemPage
13ec0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
13ed0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
13ee0 74 6f 20 61 75 74 6f 76 61 63 75 75 6d 5f 6f 75  to autovacuum_ou
13ef0 74 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20  t;..    /* Find 
13f00 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
13f10 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 74   the free-list t
13f20 68 61 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  hat is not alrea
13f30 64 79 20 61 74 20 74 68 65 20 65 6e 64 20 0a 20  dy at the end . 
13f40 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c     ** of the fil
13f50 65 2e 20 41 20 70 61 67 65 20 63 61 6e 20 62 65  e. A page can be
13f60 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20   pulled off the 
13f70 66 72 65 65 20 6c 69 73 74 20 75 73 69 6e 67 20  free list using 
13f80 74 68 65 20 0a 20 20 20 20 2a 2a 20 61 6c 6c 6f  the .    ** allo
13f90 63 61 74 65 42 74 72 65 65 50 61 67 65 28 29 20  cateBtreePage() 
13fa0 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a  routine..    */.
13fb0 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66      do{.      if
13fc0 28 20 70 46 72 65 65 4d 65 6d 50 61 67 65 20 29  ( pFreeMemPage )
13fd0 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
13fe0 65 50 61 67 65 28 70 46 72 65 65 4d 65 6d 50 61  ePage(pFreeMemPa
13ff0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72  ge);.        pFr
14000 65 65 4d 65 6d 50 61 67 65 20 3d 20 30 3b 0a 20  eeMemPage = 0;. 
14010 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
14020 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
14030 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 4d  age(pBt, &pFreeM
14040 65 6d 50 61 67 65 2c 20 26 69 46 72 65 65 50 61  emPage, &iFreePa
14050 67 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ge, 0, 0);.     
14060 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14070 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
14080 6c 65 61 73 65 50 61 67 65 28 70 44 62 4d 65 6d  leasePage(pDbMem
14090 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 67  Page);.        g
140a0 6f 74 6f 20 61 75 74 6f 76 61 63 75 75 6d 5f 6f  oto autovacuum_o
140b0 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
140c0 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50    assert( iFreeP
140d0 61 67 65 3c 3d 6f 72 69 67 53 69 7a 65 20 29 3b  age<=origSize );
140e0 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69 46 72  .    }while( iFr
140f0 65 65 50 61 67 65 3e 66 69 6e 53 69 7a 65 20 29  eePage>finSize )
14100 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
14110 65 28 70 46 72 65 65 4d 65 6d 50 61 67 65 29 3b  e(pFreeMemPage);
14120 0a 20 20 20 20 70 46 72 65 65 4d 65 6d 50 61 67  .    pFreeMemPag
14130 65 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 52  e = 0;..    /* R
14140 65 6c 6f 63 61 74 65 20 74 68 65 20 70 61 67 65  elocate the page
14150 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f   into the body o
14160 66 20 74 68 65 20 66 69 6c 65 2e 20 4e 6f 74 65  f the file. Note
14170 20 74 68 61 74 20 61 6c 74 68 6f 75 67 68 20 74   that although t
14180 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 20  he .    ** page 
14190 68 61 73 20 6d 6f 76 65 64 20 77 69 74 68 69 6e  has moved within
141a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
141b0 6c 65 2c 20 74 68 65 20 70 44 62 4d 65 6d 50 61  le, the pDbMemPa
141c0 67 65 20 70 6f 69 6e 74 65 72 20 0a 20 20 20 20  ge pointer .    
141d0 2a 2a 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64  ** remains valid
141e0 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
141f0 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  t this function 
14200 63 61 6e 20 72 75 6e 20 77 69 74 68 6f 75 74 0a  can run without.
14210 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64 61 74      ** invalidat
14220 69 6e 67 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  ing cursors open
14230 20 6f 6e 20 74 68 65 20 62 74 72 65 65 2e 20 54   on the btree. T
14240 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  his is important
14250 20 69 6e 20 0a 20 20 20 20 2a 2a 20 73 68 61 72   in .    ** shar
14260 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2e 0a 20  ed-cache mode.. 
14270 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72     */.    rc = r
14280 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c  elocatePage(pBt,
14290 20 70 44 62 4d 65 6d 50 61 67 65 2c 20 65 54 79   pDbMemPage, eTy
142a0 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69 46  pe, iPtrPage, iF
142b0 72 65 65 50 61 67 65 29 3b 0a 20 20 20 20 72 65  reePage);.    re
142c0 6c 65 61 73 65 50 61 67 65 28 70 44 62 4d 65 6d  leasePage(pDbMem
142d0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
142e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
142f0 6f 74 6f 20 61 75 74 6f 76 61 63 75 75 6d 5f 6f  oto autovacuum_o
14300 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  ut;.  }..  /* Th
14310 65 20 65 6e 74 69 72 65 20 66 72 65 65 2d 6c 69  e entire free-li
14320 73 74 20 68 61 73 20 62 65 65 6e 20 73 77 61 70  st has been swap
14330 70 65 64 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ped to the end o
14340 66 20 74 68 65 20 66 69 6c 65 2e 20 53 6f 0a 20  f the file. So. 
14350 20 2a 2a 20 74 72 75 6e 63 61 74 65 20 74 68 65   ** truncate the
14360 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
14370 6f 20 66 69 6e 53 69 7a 65 20 70 61 67 65 73 20  o finSize pages 
14380 61 6e 64 20 63 6f 6e 73 69 64 65 72 20 74 68 65  and consider the
14390 0a 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20  .  ** free-list 
143a0 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 72 63  empty..  */.  rc
143b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
143c0 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31  rite(pBt->pPage1
143d0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
143e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
143f0 29 20 67 6f 74 6f 20 61 75 74 6f 76 61 63 75 75  ) goto autovacuu
14400 6d 5f 6f 75 74 3b 0a 20 20 70 75 74 34 62 79 74  m_out;.  put4byt
14410 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
14420 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20  aData[32], 0);. 
14430 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
14440 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
14450 5d 2c 20 30 29 3b 0a 20 20 2a 70 6e 54 72 75 6e  ], 0);.  *pnTrun
14460 63 20 3d 20 66 69 6e 53 69 7a 65 3b 0a 20 20 61  c = finSize;.  a
14470 73 73 65 72 74 28 20 66 69 6e 53 69 7a 65 21 3d  ssert( finSize!=
14480 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
14490 45 28 70 42 74 29 20 29 3b 0a 0a 61 75 74 6f 76  E(pBt) );..autov
144a0 61 63 75 75 6d 5f 6f 75 74 3a 0a 20 20 61 73 73  acuum_out:.  ass
144b0 65 72 74 28 20 6e 52 65 66 3d 3d 73 71 6c 69 74  ert( nRef==sqlit
144c0 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
144d0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 69 66 28  pPager) );.  if(
144e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
144f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  {.    sqlite3Pag
14500 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  erRollback(pPage
14510 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
14520 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f   rc;.}.#endif../
14530 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
14540 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74  e does the first
14550 20 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d   phase of a two-
14560 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54  phase commit.  T
14570 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63  his routine.** c
14580 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b  auses a rollback
14590 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63   journal to be c
145a0 72 65 61 74 65 64 20 28 69 66 20 69 74 20 64 6f  reated (if it do
145b0 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  es not already e
145c0 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70  xist).** and pop
145d0 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75  ulated with enou
145e0 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73  gh information s
145f0 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65  o that if a powe
14600 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a  r loss occurs.**
14610 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
14620 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f  n be restored to
14630 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
14640 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62  ate by playing b
14650 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ack.** the journ
14660 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f  al.  Then the co
14670 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f  ntents of the jo
14680 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65  urnal are flushe
14690 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20  d out to.** the 
146a0 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65  disk.  After the
146b0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65   journal is safe
146c0 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65  ly on oxide, the
146d0 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a   changes to the.
146e0 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72 65 20  ** database are 
146f0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
14700 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
14710 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78  nd flushed to ox
14720 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65  ide..** At the e
14730 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c  nd of this call,
14740 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
14750 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73  urnal still exis
14760 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73  ts on the.** dis
14770 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73 74 69  k and we are sti
14780 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c  ll holding all l
14790 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61  ocks, so the tra
147a0 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74  nsaction has not
147b0 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20  .** committed.  
147c0 53 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  See sqlite3Btree
147d0 43 6f 6d 6d 69 74 28 29 20 66 6f 72 20 74 68 65  Commit() for the
147e0 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66   second phase of
147f0 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70   the.** commit p
14800 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  rocess..**.** Th
14810 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
14820 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74  op if no write-t
14830 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75  ransaction is cu
14840 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f  rrently active o
14850 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  n pBt..**.** Oth
14860 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65  erwise, sync the
14870 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
14880 6f 72 20 74 68 65 20 62 74 72 65 65 20 70 42 74  or the btree pBt
14890 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73  . zMaster points
148a0 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20   to.** the name 
148b0 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
148c0 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68  nal file that sh
148d0 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20  ould be written 
148e0 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69  into the.** indi
148f0 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66  vidual journal f
14900 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c  ile, or is NULL,
14910 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d   indicating no m
14920 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
14930 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64  le .** (single d
14940 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
14950 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ion)..**.** When
14960 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c   this is called,
14970 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
14980 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  nal should alrea
14990 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20  dy have been.** 
149a0 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74  created, populat
149b0 65 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75  ed with this jou
149c0 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64  rnal pointer and
149d0 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
149e0 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73  .**.** Once this
149f0 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20   is routine has 
14a00 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e  returned, the on
14a10 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69 72 65  ly thing require
14a20 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74  d to commit.** t
14a30 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  he write-transac
14a40 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61  tion for this da
14a50 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74  tabase file is t
14a60 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  o delete the jou
14a70 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rnal..*/.int sql
14a80 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
14a90 68 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70  haseOne(Btree *p
14aa0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
14ab0 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
14ac0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
14ad0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
14ae0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
14af0 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
14b00 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 50   = p->pBt;.    P
14b10 67 6e 6f 20 6e 54 72 75 6e 63 20 3d 20 30 3b 0a  gno nTrunc = 0;.
14b20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14b30 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
14b40 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
14b50 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
14b60 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43  rc = autoVacuumC
14b70 6f 6d 6d 69 74 28 70 42 74 2c 20 26 6e 54 72 75  ommit(pBt, &nTru
14b80 6e 63 29 3b 20 0a 20 20 20 20 20 20 69 66 28 20  nc); .      if( 
14b90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
14ba0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
14bb0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
14bc0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20  }.#endif.    rc 
14bd0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  = sqlite3PagerCo
14be0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
14bf0 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  ->pPager, zMaste
14c00 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 7d 0a  r, nTrunc);.  }.
14c10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
14c20 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65  /*.** Commit the
14c30 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72   transaction cur
14c40 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65  rently in progre
14c50 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ss..**.** This r
14c60 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74  outine implement
14c70 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61  s the second pha
14c80 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20  se of a 2-phase 
14c90 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20  commit.  The.** 
14ca0 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63  sqlite3BtreeSync
14cb0 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  () routine does 
14cc0 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20  the first phase 
14cd0 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  and should be in
14ce0 76 6f 6b 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74  voked.** prior t
14cf0 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
14d00 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c  outine.  The sql
14d10 69 74 65 33 42 74 72 65 65 53 79 6e 63 28 29 20  ite3BtreeSync() 
14d20 72 6f 75 74 69 6e 65 20 64 69 64 0a 2a 2a 20 61  routine did.** a
14d30 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77  ll the work of w
14d40 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  riting informati
14d50 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61  on out to disk a
14d60 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a  nd flushing the.
14d70 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74  ** contents so t
14d80 68 61 74 20 74 68 65 79 20 61 72 65 20 77 72 69  hat they are wri
14d90 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69  tten onto the di
14da0 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c  sk platter.  All
14db0 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
14dc0 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65   has to do is de
14dd0 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65  lete or truncate
14de0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
14df0 75 72 6e 61 6c 0a 2a 2a 20 28 77 68 69 63 68 20  urnal.** (which 
14e00 63 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73  causes the trans
14e10 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74  action to commit
14e20 29 20 61 6e 64 20 64 72 6f 70 20 6c 6f 63 6b 73  ) and drop locks
14e30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c  ..**.** This wil
14e40 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  l release the wr
14e50 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
14e60 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
14e70 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  If there.** are 
14e80 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72  no active cursor
14e90 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61  s, it also relea
14ea0 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ses the read loc
14eb0 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
14ec0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
14ed0 65 54 77 6f 28 42 74 72 65 65 20 2a 70 29 7b 0a  eTwo(Btree *p){.
14ee0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
14ef0 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 62 74 72  = p->pBt;..  btr
14f00 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
14f10 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e  .  /* If the han
14f20 64 6c 65 20 68 61 73 20 61 20 77 72 69 74 65 2d  dle has a write-
14f30 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
14f40 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61  , commit the sha
14f50 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a  red-btrees .  **
14f60 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
14f70 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20   set the shared 
14f80 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52  state to TRANS_R
14f90 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  EAD..  */.  if( 
14fa0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
14fb0 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69  S_WRITE ){.    i
14fc0 6e 74 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72  nt rc;.    asser
14fd0 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
14fe0 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
14ff0 54 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  TE );.    assert
15000 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74  ( pBt->nTransact
15010 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20  ion>0 );.    rc 
15020 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  = sqlite3PagerCo
15030 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74  mmitPhaseTwo(pBt
15040 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  ->pPager);.    i
15050 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15060 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
15070 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
15080 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
15090 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  n = TRANS_READ;.
150a0 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20      pBt->inStmt 
150b0 3d 20 30 3b 0a 20 20 7d 0a 20 20 75 6e 6c 6f 63  = 0;.  }.  unloc
150c0 6b 41 6c 6c 54 61 62 6c 65 73 28 70 29 3b 0a 0a  kAllTables(p);..
150d0 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64    /* If the hand
150e0 6c 65 20 68 61 73 20 61 6e 79 20 6b 69 6e 64 20  le has any kind 
150f0 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  of transaction o
15100 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74  pen, decrement t
15110 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  he transaction. 
15120 20 2a 2a 20 63 6f 75 6e 74 20 6f 66 20 74 68 65   ** count of the
15130 20 73 68 61 72 65 64 20 62 74 72 65 65 2e 20 49   shared btree. I
15140 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
15150 6e 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20  n count reaches 
15160 30 2c 20 73 65 74 0a 20 20 2a 2a 20 74 68 65 20  0, set.  ** the 
15170 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20  shared state to 
15180 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20  TRANS_NONE. The 
15190 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
151a0 73 65 64 28 29 20 63 61 6c 6c 20 62 65 6c 6f 77  sed() call below
151b0 0a 20 20 2a 2a 20 77 69 6c 6c 20 75 6e 6c 6f 63  .  ** will unloc
151c0 6b 20 74 68 65 20 70 61 67 65 72 2e 0a 20 20 2a  k the pager..  *
151d0 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  /.  if( p->inTra
151e0 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns!=TRANS_NONE )
151f0 7b 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e  {.    pBt->nTran
15200 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 69  saction--;.    i
15210 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e  f( 0==pBt->nTran
15220 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  saction ){.     
15230 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
15240 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ion = TRANS_NONE
15250 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
15260 2a 20 53 65 74 20 74 68 65 20 68 61 6e 64 6c 65  * Set the handle
15270 73 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  s current transa
15280 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54  ction state to T
15290 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e  RANS_NONE and un
152a0 6c 6f 63 6b 0a 20 20 2a 2a 20 74 68 65 20 70 61  lock.  ** the pa
152b0 67 65 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c  ger if this call
152c0 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79   closed the only
152d0 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
152e0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f  ransaction..  */
152f0 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20  .  p->inTrans = 
15300 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 75 6e  TRANS_NONE;.  un
15310 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
15320 64 28 70 42 74 29 3b 0a 0a 20 20 62 74 72 65 65  d(pBt);..  btree
15330 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20  Integrity(p);.  
15340 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15350 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f  ;.}../*.** Do bo
15360 74 68 20 70 68 61 73 65 73 20 6f 66 20 61 20 63  th phases of a c
15370 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ommit..*/.int sq
15380 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
15390 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
153a0 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c  t rc;.  rc = sql
153b0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
153c0 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20  haseOne(p, 0);. 
153d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
153e0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
153f0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
15400 74 50 68 61 73 65 54 77 6f 28 70 29 3b 0a 20 20  tPhaseTwo(p);.  
15410 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
15420 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
15430 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
15440 65 20 6e 75 6d 62 65 72 20 6f 66 20 77 72 69 74  e number of writ
15450 65 2d 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  e-cursors open o
15460 6e 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 54  n this handle. T
15470 68 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a  his is for use.*
15480 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 65 78  * in assert() ex
15490 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74  pressions, so it
154a0 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65   is only compile
154b0 64 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e  d if NDEBUG is n
154c0 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a  ot.** defined..*
154d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75  /.static int cou
154e0 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73 28 42  ntWriteCursors(B
154f0 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
15500 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b   BtCursor *pCur;
15510 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20  .  int r = 0;.  
15520 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43  for(pCur=pBt->pC
15530 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75  ursor; pCur; pCu
15540 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a  r=pCur->pNext){.
15550 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 77 72      if( pCur->wr
15560 46 6c 61 67 20 29 20 72 2b 2b 3b 20 0a 20 20 7d  Flag ) r++; .  }
15570 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23  .  return r;.}.#
15580 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
15590 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20  ed(SQLITE_TEST) 
155a0 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
155b0 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50  E_DEBUG)./*.** P
155c0 72 69 6e 74 20 64 65 62 75 67 67 69 6e 67 20 69  rint debugging i
155d0 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
155e0 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 74 6f 20   all cursors to 
155f0 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75 74 2e  standard output.
15600 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
15610 42 74 72 65 65 43 75 72 73 6f 72 4c 69 73 74 28  BtreeCursorList(
15620 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 43  Btree *p){.  BtC
15630 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 42  ursor *pCur;.  B
15640 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
15650 2d 3e 70 42 74 3b 0a 20 20 66 6f 72 28 70 43 75  ->pBt;.  for(pCu
15660 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  r=pBt->pCursor; 
15670 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d  pCur; pCur=pCur-
15680 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 4d 65 6d  >pNext){.    Mem
15690 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43  Page *pPage = pC
156a0 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 63  ur->pPage;.    c
156b0 68 61 72 20 2a 7a 4d 6f 64 65 20 3d 20 70 43 75  har *zMode = pCu
156c0 72 2d 3e 77 72 46 6c 61 67 20 3f 20 22 72 77 22  r->wrFlag ? "rw"
156d0 20 3a 20 22 72 6f 22 3b 0a 20 20 20 20 73 71 6c   : "ro";.    sql
156e0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
156f0 22 43 55 52 53 4f 52 20 25 70 20 72 6f 6f 74 65  "CURSOR %p roote
15700 64 20 61 74 20 25 34 64 28 25 73 29 20 63 75 72  d at %4d(%s) cur
15710 72 65 6e 74 6c 79 20 61 74 20 25 64 2e 25 64 25  rently at %d.%d%
15720 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 43 75  s\n",.       pCu
15730 72 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  r, pCur->pgnoRoo
15740 74 2c 20 7a 4d 6f 64 65 2c 0a 20 20 20 20 20 20  t, zMode,.      
15750 20 70 50 61 67 65 20 3f 20 70 50 61 67 65 2d 3e   pPage ? pPage->
15760 70 67 6e 6f 20 3a 20 30 2c 20 70 43 75 72 2d 3e  pgno : 0, pCur->
15770 69 64 78 2c 0a 20 20 20 20 20 20 20 28 70 43 75  idx,.       (pCu
15780 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
15790 52 5f 56 41 4c 49 44 29 20 3f 20 22 22 20 3a 20  R_VALID) ? "" : 
157a0 22 20 65 6f 66 22 0a 20 20 20 20 29 3b 0a 20 20  " eof".    );.  
157b0 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
157c0 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74  * Rollback the t
157d0 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72  ransaction in pr
157e0 6f 67 72 65 73 73 2e 20 20 41 6c 6c 20 63 75 72  ogress.  All cur
157f0 73 6f 72 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  sors will be.** 
15800 69 6e 76 61 6c 69 64 65 64 20 62 79 20 74 68 69  invalided by thi
15810 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e  s operation.  An
15820 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  y attempt to use
15830 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 74 68 61   a cursor.** tha
15840 74 20 77 61 73 20 6f 70 65 6e 20 61 74 20 74 68  t was open at th
15850 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
15860 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 77 69  his operation wi
15870 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20  ll result.** in 
15880 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  an error..**.** 
15890 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73  This will releas
158a0 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
158b0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
158c0 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
158d0 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
158e0 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c  e cursors, it al
158f0 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20  so releases the 
15900 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e  read lock..*/.in
15910 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  t sqlite3BtreeRo
15920 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70 29  llback(Btree *p)
15930 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
15940 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
15950 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20  >pBt;.  MemPage 
15960 2a 70 50 61 67 65 31 3b 0a 0a 20 20 72 63 20 3d  *pPage1;..  rc =
15970 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
15980 70 42 74 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e  pBt, 0, 0);.#ifn
15990 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
159a0 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 69  SHARED_CACHE.  i
159b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
159c0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
159d0 69 73 20 61 20 68 6f 72 72 69 62 6c 65 20 73 69  is a horrible si
159e0 74 75 61 74 69 6f 6e 2e 20 41 6e 20 49 4f 20 6f  tuation. An IO o
159f0 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72  r malloc() error
15a00 20 6f 63 63 75 72 65 64 20 77 68 69 6c 73 74 0a   occured whilst.
15a10 20 20 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f      ** trying to
15a20 20 73 61 76 65 20 63 75 72 73 6f 72 20 70 6f 73   save cursor pos
15a30 69 74 69 6f 6e 73 2e 20 49 66 20 74 68 69 73 20  itions. If this 
15a40 69 73 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  is an automatic 
15a50 72 6f 6c 6c 62 61 63 6b 20 28 61 73 0a 20 20 20  rollback (as.   
15a60 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 6f   ** the result o
15a70 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20  f a constraint, 
15a80 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
15a90 20 6f 72 20 49 4f 20 65 72 72 6f 72 29 20 74 68   or IO error) th
15aa0 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 63  en .    ** the c
15ab0 61 63 68 65 20 6d 61 79 20 62 65 20 69 6e 74 65  ache may be inte
15ac0 72 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74  rnally inconsist
15ad0 65 6e 74 20 28 6e 6f 74 20 63 6f 6e 74 61 69 6e  ent (not contain
15ae0 20 76 61 6c 69 64 20 74 72 65 65 73 29 20 73 6f   valid trees) so
15af0 0a 20 20 20 20 2a 2a 20 77 65 20 63 61 6e 6e 6f  .    ** we canno
15b00 74 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20  t simply return 
15b10 74 68 65 20 65 72 72 6f 72 20 74 6f 20 74 68 65  the error to the
15b20 20 63 61 6c 6c 65 72 2e 20 49 6e 73 74 65 61 64   caller. Instead
15b30 2c 20 61 62 6f 72 74 20 0a 20 20 20 20 2a 2a 20  , abort .    ** 
15b40 61 6c 6c 20 71 75 65 72 69 65 73 20 74 68 61 74  all queries that
15b50 20 6d 61 79 20 62 65 20 75 73 69 6e 67 20 61 6e   may be using an
15b60 79 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73  y of the cursors
15b70 20 74 68 61 74 20 66 61 69 6c 65 64 20 74 6f 20   that failed to 
15b80 73 61 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  save..    */.   
15b90 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 43 75   while( pBt->pCu
15ba0 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 73 71  rsor ){.      sq
15bb0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 42 74 2d  lite3 *db = pBt-
15bc0 3e 70 43 75 72 73 6f 72 2d 3e 70 42 74 72 65 65  >pCursor->pBtree
15bd0 2d 3e 70 53 71 6c 69 74 65 3b 0a 20 20 20 20 20  ->pSqlite;.     
15be0 20 69 66 28 20 64 62 20 29 7b 0a 20 20 20 20 20   if( db ){.     
15bf0 20 20 20 73 71 6c 69 74 65 33 41 62 6f 72 74 4f     sqlite3AbortO
15c00 74 68 65 72 41 63 74 69 76 65 56 64 62 65 73 28  therActiveVdbes(
15c10 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  db, 0);.      }.
15c20 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
15c30 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
15c40 79 28 70 29 3b 0a 20 20 75 6e 6c 6f 63 6b 41 6c  y(p);.  unlockAl
15c50 6c 54 61 62 6c 65 73 28 70 29 3b 0a 0a 20 20 69  lTables(p);..  i
15c60 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
15c70 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
15c80 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20    int rc2;..    
15c90 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52  assert( TRANS_WR
15ca0 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e  ITE==pBt->inTran
15cb0 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72  saction );.    r
15cc0 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  c2 = sqlite3Page
15cd0 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70  rRollback(pBt->p
15ce0 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
15cf0 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2!=SQLITE_OK )
15d00 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32  {.      rc = rc2
15d10 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
15d20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79  The rollback may
15d30 20 68 61 76 65 20 64 65 73 74 72 6f 79 65 64 20   have destroyed 
15d40 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74  the pPage1->aDat
15d50 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20  a value.  So.   
15d60 20 2a 2a 20 63 61 6c 6c 20 67 65 74 50 61 67 65   ** call getPage
15d70 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61  () on page 1 aga
15d80 69 6e 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  in to make sure 
15d90 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69 73  pPage1->aData is
15da0 0a 20 20 20 20 2a 2a 20 73 65 74 20 63 6f 72 72  .    ** set corr
15db0 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66  ectly. */.    if
15dc0 28 20 67 65 74 50 61 67 65 28 70 42 74 2c 20 31  ( getPage(pBt, 1
15dd0 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53  , &pPage1, 0)==S
15de0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15df0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
15e00 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  age1);.    }.   
15e10 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 57 72   assert( countWr
15e20 69 74 65 43 75 72 73 6f 72 73 28 70 42 74 29 3d  iteCursors(pBt)=
15e30 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69  =0 );.    pBt->i
15e40 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
15e50 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a  RANS_READ;.  }..
15e60 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
15e70 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  !=TRANS_NONE ){.
15e80 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
15e90 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20  >nTransaction>0 
15ea0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  );.    pBt->nTra
15eb0 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20  nsaction--;.    
15ec0 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61  if( 0==pBt->nTra
15ed0 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  nsaction ){.    
15ee0 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
15ef0 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  tion = TRANS_NON
15f00 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
15f10 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
15f20 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 42 74 2d 3e  NS_NONE;.  pBt->
15f30 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 75 6e  inStmt = 0;.  un
15f40 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
15f50 64 28 70 42 74 29 3b 0a 0a 20 20 62 74 72 65 65  d(pBt);..  btree
15f60 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20  Integrity(p);.  
15f70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
15f80 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61 74  .** Start a stat
15f90 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
15fa0 74 69 6f 6e 2e 20 20 54 68 65 20 73 75 62 74 72  tion.  The subtr
15fb0 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 0a 2a 2a  ansaction can.**
15fc0 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62   can be rolled b
15fd0 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c  ack independentl
15fe0 79 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72  y of the main tr
15ff0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 59 6f  ansaction..** Yo
16000 75 20 6d 75 73 74 20 73 74 61 72 74 20 61 20 74  u must start a t
16010 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f 72  ransaction befor
16020 65 20 73 74 61 72 74 69 6e 67 20 61 20 73 75 62  e starting a sub
16030 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
16040 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69  The subtransacti
16050 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74 6f  on is ended auto
16060 6d 61 74 69 63 61 6c 6c 79 20 69 66 20 74 68 65  matically if the
16070 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f   main transactio
16080 6e 0a 2a 2a 20 63 6f 6d 6d 69 74 73 20 6f 72 20  n.** commits or 
16090 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  rolls back..**.*
160a0 2a 20 4f 6e 6c 79 20 6f 6e 65 20 73 75 62 74 72  * Only one subtr
160b0 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65  ansaction may be
160c0 20 61 63 74 69 76 65 20 61 74 20 61 20 74 69 6d   active at a tim
160d0 65 2e 20 20 49 74 20 69 73 20 61 6e 20 65 72 72  e.  It is an err
160e0 6f 72 20 74 6f 20 74 72 79 0a 2a 2a 20 74 6f 20  or to try.** to 
160f0 73 74 61 72 74 20 61 20 6e 65 77 20 73 75 62 74  start a new subt
16100 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 61 6e  ransaction if an
16110 6f 74 68 65 72 20 73 75 62 74 72 61 6e 73 61 63  other subtransac
16120 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20  tion is already 
16130 61 63 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 53 74  active..**.** St
16140 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  atement subtrans
16150 61 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64  actions are used
16160 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75   around individu
16170 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  al SQL statement
16180 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f  s.** that are co
16190 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61  ntained within a
161a0 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20   BEGIN...COMMIT 
161b0 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e  block.  If a con
161c0 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72  straint.** error
161d0 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
161e0 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  he statement, th
161f0 65 20 65 66 66 65 63 74 20 6f 66 20 74 68 61 74  e effect of that
16200 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a   one statement.*
16210 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20  * can be rolled 
16220 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76  back without hav
16230 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ing to rollback 
16240 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73  the entire trans
16250 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  action..*/.int s
16260 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
16270 53 74 6d 74 28 42 74 72 65 65 20 2a 70 29 7b 0a  Stmt(Btree *p){.
16280 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
16290 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
162a0 42 74 3b 0a 20 20 69 66 28 20 28 70 2d 3e 69 6e  Bt;.  if( (p->in
162b0 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49  Trans!=TRANS_WRI
162c0 54 45 29 20 7c 7c 20 70 42 74 2d 3e 69 6e 53 74  TE) || pBt->inSt
162d0 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  mt ){.    return
162e0 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f   pBt->readOnly ?
162f0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
16300 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   : SQLITE_ERROR;
16310 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
16320 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
16330 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
16340 3b 0a 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65  ;.  rc = pBt->re
16350 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f  adOnly ? SQLITE_
16360 4f 4b 20 3a 20 73 71 6c 69 74 65 33 50 61 67 65  OK : sqlite3Page
16370 72 53 74 6d 74 42 65 67 69 6e 28 70 42 74 2d 3e  rStmtBegin(pBt->
16380 70 50 61 67 65 72 29 3b 0a 20 20 70 42 74 2d 3e  pPager);.  pBt->
16390 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 20 20 72 65  inStmt = 1;.  re
163a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
163b0 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 73 74  ** Commit the st
163c0 61 74 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  atment subtransa
163d0 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20  ction currently 
163e0 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20 49 66  in progress.  If
163f0 20 6e 6f 0a 2a 2a 20 73 75 62 74 72 61 6e 73 61   no.** subtransa
16400 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c  ction is active,
16410 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   this is a no-op
16420 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16430 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 28  BtreeCommitStmt(
16440 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
16450 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
16460 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
16470 20 69 66 28 20 70 42 74 2d 3e 69 6e 53 74 6d 74   if( pBt->inStmt
16480 20 26 26 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e   && !pBt->readOn
16490 6c 79 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  ly ){.    rc = s
164a0 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 43  qlite3PagerStmtC
164b0 6f 6d 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65  ommit(pBt->pPage
164c0 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
164d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
164e0 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 69 6e 53 74  .  }.  pBt->inSt
164f0 6d 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  mt = 0;.  return
16500 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f   rc;.}../*.** Ro
16510 6c 6c 62 61 63 6b 20 74 68 65 20 61 63 74 69 76  llback the activ
16520 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74  e statement subt
16530 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20  ransaction.  If 
16540 6e 6f 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  no subtransactio
16550 6e 0a 2a 2a 20 69 73 20 61 63 74 69 76 65 20 74  n.** is active t
16560 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
16570 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 41 6c   no-op..**.** Al
16580 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62  l cursors will b
16590 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 62 79  e invalidated by
165a0 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e   this operation.
165b0 20 20 41 6e 79 20 61 74 74 65 6d 70 74 0a 2a 2a    Any attempt.**
165c0 20 74 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72   to use a cursor
165d0 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20 61   that was open a
165e0 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
165f0 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  of this operatio
16600 6e 0a 2a 2a 20 77 69 6c 6c 20 72 65 73 75 6c 74  n.** will result
16610 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f   in an error..*/
16620 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
16630 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 28 42 74  eRollbackStmt(Bt
16640 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
16650 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
16660 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
16670 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
16680 65 33 4d 61 6c 6c 6f 63 44 69 73 61 6c 6c 6f 77  e3MallocDisallow
16690 28 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69  ();.  if( pBt->i
166a0 6e 53 74 6d 74 20 26 26 20 21 70 42 74 2d 3e 72  nStmt && !pBt->r
166b0 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72  eadOnly ){.    r
166c0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
166d0 53 74 6d 74 52 6f 6c 6c 62 61 63 6b 28 70 42 74  StmtRollback(pBt
166e0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61  ->pPager);.    a
166f0 73 73 65 72 74 28 20 63 6f 75 6e 74 57 72 69 74  ssert( countWrit
16700 65 43 75 72 73 6f 72 73 28 70 42 74 29 3d 3d 30  eCursors(pBt)==0
16710 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53   );.    pBt->inS
16720 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  tmt = 0;.  }.  s
16730 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 41 6c 6c 6f  qlite3MallocAllo
16740 77 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  w();.  return rc
16750 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75  ;.}../*.** Defau
16760 6c 74 20 6b 65 79 20 63 6f 6d 70 61 72 69 73 6f  lt key compariso
16770 6e 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65  n function to be
16780 20 75 73 65 64 20 69 66 20 6e 6f 20 63 6f 6d 70   used if no comp
16790 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 0a  arison function.
167a0 2a 2a 20 69 73 20 73 70 65 63 69 66 69 65 64 20  ** is specified 
167b0 6f 6e 20 74 68 65 20 73 71 6c 69 74 65 33 42 74  on the sqlite3Bt
167c0 72 65 65 43 75 72 73 6f 72 28 29 20 63 61 6c 6c  reeCursor() call
167d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
167e0 64 66 6c 74 43 6f 6d 70 61 72 65 28 0a 20 20 76  dfltCompare(.  v
167f0 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20  oid *NotUsed,   
16800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
16810 72 20 64 61 74 61 20 69 73 20 6e 6f 74 20 75 73  r data is not us
16820 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 31 2c 20  ed */.  int n1, 
16830 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 31 2c 20  const void *p1, 
16840 20 20 20 2f 2a 20 46 69 72 73 74 20 6b 65 79 20     /* First key 
16850 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20  to compare */.  
16860 69 6e 74 20 6e 32 2c 20 63 6f 6e 73 74 20 76 6f  int n2, const vo
16870 69 64 20 2a 70 32 20 20 20 20 20 2f 2a 20 53 65  id *p2     /* Se
16880 63 6f 6e 64 20 6b 65 79 20 74 6f 20 63 6f 6d 70  cond key to comp
16890 61 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  are */.){.  int 
168a0 63 3b 0a 20 20 63 20 3d 20 6d 65 6d 63 6d 70 28  c;.  c = memcmp(
168b0 70 31 2c 20 70 32 2c 20 6e 31 3c 6e 32 20 3f 20  p1, p2, n1<n2 ? 
168c0 6e 31 20 3a 20 6e 32 29 3b 0a 20 20 69 66 28 20  n1 : n2);.  if( 
168d0 63 3d 3d 30 20 29 7b 0a 20 20 20 20 63 20 3d 20  c==0 ){.    c = 
168e0 6e 31 20 2d 20 6e 32 3b 0a 20 20 7d 0a 20 20 72  n1 - n2;.  }.  r
168f0 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn c;.}../*.*
16900 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63  * Create a new c
16910 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54  ursor for the BT
16920 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69  ree whose root i
16930 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  s on the page.**
16940 20 69 54 61 62 6c 65 2e 20 20 54 68 65 20 61 63   iTable.  The ac
16950 74 20 6f 66 20 61 63 71 75 69 72 69 6e 67 20 61  t of acquiring a
16960 20 63 75 72 73 6f 72 20 67 65 74 73 20 61 20 72   cursor gets a r
16970 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a 20  ead lock on .** 
16980 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16990 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c  e..**.** If wrFl
169a0 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20  ag==0, then the 
169b0 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20  cursor can only 
169c0 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64  be used for read
169d0 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61  ing..** If wrFla
169e0 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63  g==1, then the c
169f0 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75 73 65  ursor can be use
16a00 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72  d for reading or
16a10 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20   for.** writing 
16a20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69  if other conditi
16a30 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67 20  ons for writing 
16a40 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54  are also met.  T
16a50 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20  hese.** are the 
16a60 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20  conditions that 
16a70 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f  must be met in o
16a80 72 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e 67  rder for writing
16a90 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65   to.** be allowe
16aa0 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65  d:.**.** 1:  The
16ab0 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76   cursor must hav
16ac0 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69  e been opened wi
16ad0 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a  th wrFlag==1.**.
16ae0 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74  ** 2:  Other dat
16af0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
16b00 73 20 74 68 61 74 20 73 68 61 72 65 20 74 68 65  s that share the
16b10 20 73 61 6d 65 20 70 61 67 65 72 20 63 61 63 68   same pager cach
16b20 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69  e.**     but whi
16b30 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68  ch are not in th
16b40 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54  e READ_UNCOMMITT
16b50 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74  ED state may not
16b60 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72   have.**     cur
16b70 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77  sors open with w
16b80 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20  rFlag==0 on the 
16b90 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68  same table.  Oth
16ba0 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68  erwise.**     th
16bb0 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62  e changes made b
16bc0 79 20 74 68 69 73 20 77 72 69 74 65 20 63 75 72  y this write cur
16bd0 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73  sor would be vis
16be0 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74  ible to.**     t
16bf0 68 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20  he read cursors 
16c00 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61 74  in the other dat
16c10 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
16c20 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20  ..**.** 3:  The 
16c30 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
16c40 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f   writable (not o
16c50 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69  n read-only medi
16c60 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65  a).**.** 4:  The
16c70 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63  re must be an ac
16c80 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
16c90 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b  ..**.** No check
16ca0 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d  ing is done to m
16cb0 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 70 61  ake sure that pa
16cc0 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79  ge iTable really
16cd0 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20   is the.** root 
16ce0 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65  page of a b-tree
16cf0 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c  .  If it is not,
16d00 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
16d10 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c   acquired.** wil
16d20 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65  l not work corre
16d30 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ctly..**.** The 
16d40 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
16d50 69 6f 6e 20 6d 75 73 74 20 62 65 20 6c 6f 67 69  ion must be logi
16d60 63 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 66  cally the same f
16d70 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f 72 0a  or every cursor.
16d80 2a 2a 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c  ** on a particul
16d90 61 72 20 74 61 62 6c 65 2e 20 20 43 68 61 6e 67  ar table.  Chang
16da0 69 6e 67 20 74 68 65 20 63 6f 6d 70 61 72 69 73  ing the comparis
16db0 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  on function will
16dc0 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 69 6e   result.** in in
16dd0 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f  correct operatio
16de0 6e 73 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 70  ns.  If the comp
16df0 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
16e00 69 73 20 4e 55 4c 4c 2c 20 61 0a 2a 2a 20 64 65  is NULL, a.** de
16e10 66 61 75 6c 74 20 63 6f 6d 70 61 72 69 73 6f 6e  fault comparison
16e20 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
16e30 64 2e 20 20 54 68 65 20 63 6f 6d 70 61 72 69 73  d.  The comparis
16e40 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a  on function is.*
16e50 2a 20 61 6c 77 61 79 73 20 69 67 6e 6f 72 65 64  * always ignored
16e60 20 66 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c   for INTKEY tabl
16e70 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
16e80 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20  e3BtreeCursor(. 
16e90 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20   Btree *p,      
16ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16ec0 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69  The btree */.  i
16ed0 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
16ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ef0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
16f00 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65  ot page of table
16f10 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
16f20 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20  t wrFlag,       
16f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74            /* 1 t
16f50 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d  o write. 0 read-
16f60 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 28 2a  only */.  int (*
16f70 78 43 6d 70 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  xCmp)(void*,int,
16f80 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c  const void*,int,
16f90 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 20 2f 2a  const void*), /*
16fa0 20 4b 65 79 20 43 6f 6d 70 61 72 69 73 6f 6e 20   Key Comparison 
16fb0 66 75 6e 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  func */.  void *
16fc0 70 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20  pArg,           
16fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fe0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
16ff0 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29  rg to xCompare()
17000 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
17010 2a 70 70 43 75 72 20 20 20 20 20 20 20 20 20 20  *ppCur          
17020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17030 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63    /* Write new c
17040 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b  ursor here */.){
17050 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43  .  int rc;.  BtC
17060 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 42  ursor *pCur;.  B
17070 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
17080 2d 3e 70 42 74 3b 0a 0a 20 20 2a 70 70 43 75 72  ->pBt;..  *ppCur
17090 20 3d 20 30 3b 0a 20 20 69 66 28 20 77 72 46 6c   = 0;.  if( wrFl
170a0 61 67 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42  ag ){.    if( pB
170b0 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  t->readOnly ){. 
170c0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
170d0 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  TE_READONLY;.   
170e0 20 7d 0a 20 20 20 20 69 66 28 20 63 68 65 63 6b   }.    if( check
170f0 52 65 61 64 4c 6f 63 6b 73 28 70 2c 20 69 54 61  ReadLocks(p, iTa
17100 62 6c 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  ble, 0) ){.     
17110 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
17120 4f 43 4b 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d  OCKED;.    }.  }
17130 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61  ..  if( pBt->pPa
17140 67 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  ge1==0 ){.    rc
17150 20 3d 20 6c 6f 63 6b 42 74 72 65 65 57 69 74 68   = lockBtreeWith
17160 52 65 74 72 79 28 70 29 3b 0a 20 20 20 20 69 66  Retry(p);.    if
17170 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17180 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
17190 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rc;.    }.  }.  
171a0 70 43 75 72 20 3d 20 73 71 6c 69 74 65 4d 61 6c  pCur = sqliteMal
171b0 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 75  loc( sizeof(*pCu
171c0 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  r) );.  if( pCur
171d0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
171e0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
171f0 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 63 75    goto create_cu
17200 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a  rsor_exception;.
17210 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f    }.  pCur->pgno
17220 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61  Root = (Pgno)iTa
17230 62 6c 65 3b 0a 20 20 69 66 28 20 69 54 61 62 6c  ble;.  if( iTabl
17240 65 3d 3d 31 20 26 26 20 73 71 6c 69 74 65 33 50  e==1 && sqlite3P
17250 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
17260 74 2d 3e 70 50 61 67 65 72 29 3d 3d 30 20 29 7b  t->pPager)==0 ){
17270 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
17280 5f 45 4d 50 54 59 3b 0a 20 20 20 20 67 6f 74 6f  _EMPTY;.    goto
17290 20 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65   create_cursor_e
172a0 78 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20  xception;.  }.  
172b0 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
172c0 61 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70  age(pBt, pCur->p
172d0 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e  gnoRoot, &pCur->
172e0 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28  pPage, 0);.  if(
172f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17300 7b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74  {.    goto creat
17310 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69  e_cursor_excepti
17320 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  on;.  }..  /* No
17330 77 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  w that no other 
17340 65 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72  errors can occur
17350 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67  , finish filling
17360 20 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72   in the BtCursor
17370 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 2c  .  ** variables,
17380 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72   link the cursor
17390 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72   into the BtShar
173a0 65 64 20 6c 69 73 74 20 61 6e 64 20 73 65 74 20  ed list and set 
173b0 2a 70 70 43 75 72 20 28 74 68 65 0a 20 20 2a 2a  *ppCur (the.  **
173c0 20 6f 75 74 70 75 74 20 61 72 67 75 6d 65 6e 74   output argument
173d0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
173e0 6e 29 2e 0a 20 20 2a 2f 0a 20 20 70 43 75 72 2d  n)..  */.  pCur-
173f0 3e 78 43 6f 6d 70 61 72 65 20 3d 20 78 43 6d 70  >xCompare = xCmp
17400 20 3f 20 78 43 6d 70 20 3a 20 64 66 6c 74 43 6f   ? xCmp : dfltCo
17410 6d 70 61 72 65 3b 0a 20 20 70 43 75 72 2d 3e 70  mpare;.  pCur->p
17420 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 70 43  Arg = pArg;.  pC
17430 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a  ur->pBtree = p;.
17440 20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 3d    pCur->wrFlag =
17450 20 77 72 46 6c 61 67 3b 0a 20 20 70 43 75 72 2d   wrFlag;.  pCur-
17460 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43  >pNext = pBt->pC
17470 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70 43 75  ursor;.  if( pCu
17480 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  r->pNext ){.    
17490 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  pCur->pNext->pPr
174a0 65 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d 0a 20  ev = pCur;.  }. 
174b0 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
174c0 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53  pCur;.  pCur->eS
174d0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
174e0 56 41 4c 49 44 3b 0a 20 20 2a 70 70 43 75 72 20  VALID;.  *ppCur 
174f0 3d 20 70 43 75 72 3b 0a 0a 20 20 72 65 74 75 72  = pCur;..  retur
17500 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 63 72 65  n SQLITE_OK;.cre
17510 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70  ate_cursor_excep
17520 74 69 6f 6e 3a 0a 20 20 69 66 28 20 70 43 75 72  tion:.  if( pCur
17530 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50   ){.    releaseP
17540 61 67 65 28 70 43 75 72 2d 3e 70 50 61 67 65 29  age(pCur->pPage)
17550 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
17560 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 75 6e  (pCur);.  }.  un
17570 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
17580 64 28 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e  d(pBt);.  return
17590 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 30 20 20 2f   rc;.}..#if 0  /
175a0 2a 20 4e 6f 74 20 55 73 65 64 20 2a 2f 0a 2f 2a  * Not Used */./*
175b0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
175c0 61 6c 75 65 20 6f 66 20 74 68 65 20 63 6f 6d 70  alue of the comp
175d0 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
175e0 75 73 65 64 20 62 79 20 61 20 63 75 72 73 6f 72  used by a cursor
175f0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
17600 33 42 74 72 65 65 53 65 74 43 6f 6d 70 61 72 65  3BtreeSetCompare
17610 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
17620 75 72 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 63  ur,     /* The c
17630 75 72 73 6f 72 20 74 6f 20 77 68 6f 73 65 20 63  ursor to whose c
17640 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
17650 6f 6e 20 69 73 20 63 68 61 6e 67 65 64 20 2a 2f  on is changed */
17660 0a 20 20 69 6e 74 28 2a 78 43 6d 70 29 28 76 6f  .  int(*xCmp)(vo
17670 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
17680 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
17690 69 64 2a 29 2c 20 2f 2a 20 4e 65 77 20 63 6f 6d  id*), /* New com
176a0 70 61 72 69 73 6f 6e 20 66 75 6e 63 20 2a 2f 0a  parison func */.
176b0 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20    void *pArg    
176c0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
176d0 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6d 70 28  rgument to xCmp(
176e0 29 20 2a 2f 0a 29 7b 0a 20 20 70 43 75 72 2d 3e  ) */.){.  pCur->
176f0 78 43 6f 6d 70 61 72 65 20 3d 20 78 43 6d 70 20  xCompare = xCmp 
17700 3f 20 78 43 6d 70 20 3a 20 64 66 6c 74 43 6f 6d  ? xCmp : dfltCom
17710 70 61 72 65 3b 0a 20 20 70 43 75 72 2d 3e 70 41  pare;.  pCur->pA
17720 72 67 20 3d 20 70 41 72 67 3b 0a 7d 0a 23 65 6e  rg = pArg;.}.#en
17730 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  dif../*.** Close
17740 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20   a cursor.  The 
17750 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
17760 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
17770 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68  s released.** wh
17780 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72 73  en the last curs
17790 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f  or is closed..*/
177a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
177b0 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74 43  eCloseCursor(BtC
177c0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
177d0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
177e0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42  pCur->pBtree->pB
177f0 74 3b 0a 20 20 63 6c 65 61 72 43 75 72 73 6f 72  t;.  clearCursor
17800 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
17810 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50 72 65    if( pCur->pPre
17820 76 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70  v ){.    pCur->p
17830 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43  Prev->pNext = pC
17840 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c  ur->pNext;.  }el
17850 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 70 43 75  se{.    pBt->pCu
17860 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65  rsor = pCur->pNe
17870 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  xt;.  }.  if( pC
17880 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20  ur->pNext ){.   
17890 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50   pCur->pNext->pP
178a0 72 65 76 20 3d 20 70 43 75 72 2d 3e 70 50 72 65  rev = pCur->pPre
178b0 76 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  v;.  }.  release
178c0 50 61 67 65 28 70 43 75 72 2d 3e 70 50 61 67 65  Page(pCur->pPage
178d0 29 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  );.  unlockBtree
178e0 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
178f0 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 75 72   sqliteFree(pCur
17900 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
17910 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
17920 4d 61 6b 65 20 61 20 74 65 6d 70 6f 72 61 72 79  Make a temporary
17930 20 63 75 72 73 6f 72 20 62 79 20 66 69 6c 6c 69   cursor by filli
17940 6e 67 20 69 6e 20 74 68 65 20 66 69 65 6c 64 73  ng in the fields
17950 20 6f 66 20 70 54 65 6d 70 43 75 72 2e 0a 2a 2a   of pTempCur..**
17960 20 54 68 65 20 74 65 6d 70 6f 72 61 72 79 20 63   The temporary c
17970 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 6f 6e 20  ursor is not on 
17980 74 68 65 20 63 75 72 73 6f 72 20 6c 69 73 74 20  the cursor list 
17990 66 6f 72 20 74 68 65 20 42 74 72 65 65 2e 0a 2a  for the Btree..*
179a0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
179b0 74 54 65 6d 70 43 75 72 73 6f 72 28 42 74 43 75  tTempCursor(BtCu
179c0 72 73 6f 72 20 2a 70 43 75 72 2c 20 42 74 43 75  rsor *pCur, BtCu
179d0 72 73 6f 72 20 2a 70 54 65 6d 70 43 75 72 29 7b  rsor *pTempCur){
179e0 0a 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 43  .  memcpy(pTempC
179f0 75 72 2c 20 70 43 75 72 2c 20 73 69 7a 65 6f 66  ur, pCur, sizeof
17a00 28 2a 70 43 75 72 29 29 3b 0a 20 20 70 54 65 6d  (*pCur));.  pTem
17a10 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b  pCur->pNext = 0;
17a20 0a 20 20 70 54 65 6d 70 43 75 72 2d 3e 70 50 72  .  pTempCur->pPr
17a30 65 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 54  ev = 0;.  if( pT
17a40 65 6d 70 43 75 72 2d 3e 70 50 61 67 65 20 29 7b  empCur->pPage ){
17a50 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
17a60 72 52 65 66 28 70 54 65 6d 70 43 75 72 2d 3e 70  rRef(pTempCur->p
17a70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
17a80 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
17a90 65 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ete a temporary 
17aa0 63 75 72 73 6f 72 20 73 75 63 68 20 61 73 20 77  cursor such as w
17ab0 61 73 20 6d 61 64 65 20 62 79 20 74 68 65 20 43  as made by the C
17ac0 72 65 61 74 65 54 65 6d 70 6f 72 61 72 79 43 75  reateTemporaryCu
17ad0 72 73 6f 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69  rsor().** functi
17ae0 6f 6e 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61  on above..*/.sta
17af0 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
17b00 54 65 6d 70 43 75 72 73 6f 72 28 42 74 43 75 72  TempCursor(BtCur
17b10 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 66  sor *pCur){.  if
17b20 28 20 70 43 75 72 2d 3e 70 50 61 67 65 20 29 7b  ( pCur->pPage ){
17b30 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
17b40 72 55 6e 72 65 66 28 70 43 75 72 2d 3e 70 50 61  rUnref(pCur->pPa
17b50 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
17b60 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  }.}../*.** Make 
17b70 73 75 72 65 20 74 68 65 20 42 74 43 75 72 73 6f  sure the BtCurso
17b80 72 2e 69 6e 66 6f 20 66 69 65 6c 64 20 6f 66 20  r.info field of 
17b90 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72  the given cursor
17ba0 20 69 73 20 76 61 6c 69 64 2e 0a 2a 2a 20 49 66   is valid..** If
17bb0 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
17bc0 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 20 70  dy valid, call p
17bd0 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69  arseCell() to fi
17be0 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20  ll it in..**.** 
17bf0 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73  BtCursor.info is
17c00 20 61 20 63 61 63 68 65 20 6f 66 20 74 68 65 20   a cache of the 
17c10 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74  information in t
17c20 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e  he current cell.
17c30 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63  .** Using this c
17c40 61 63 68 65 20 72 65 64 75 63 65 73 20 74 68 65  ache reduces the
17c50 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73   number of calls
17c60 20 74 6f 20 70 61 72 73 65 43 65 6c 6c 28 29 2e   to parseCell().
17c70 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
17c80 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75  getCellInfo(BtCu
17c90 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
17ca0 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  f( pCur->info.nS
17cb0 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 61  ize==0 ){.    pa
17cc0 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50  rseCell(pCur->pP
17cd0 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20  age, pCur->idx, 
17ce0 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20  &pCur->info);.  
17cf0 7d 65 6c 73 65 7b 0a 23 69 66 6e 64 65 66 20 4e  }else{.#ifndef N
17d00 44 45 42 55 47 0a 20 20 20 20 43 65 6c 6c 49 6e  DEBUG.    CellIn
17d10 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d  fo info;.    mem
17d20 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69  set(&info, 0, si
17d30 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20  zeof(info));.   
17d40 20 70 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d   parseCell(pCur-
17d50 3e 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64  >pPage, pCur->id
17d60 78 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61  x, &info);.    a
17d70 73 73 65 72 74 28 20 6d 65 6d 63 6d 70 28 26 69  ssert( memcmp(&i
17d80 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f  nfo, &pCur->info
17d90 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d  , sizeof(info))=
17da0 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  =0 );.#endif.  }
17db0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70  .}../*.** Set *p
17dc0 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65  Size to the size
17dd0 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6e   of the buffer n
17de0 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74 68  eeded to hold th
17df0 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68  e value of.** th
17e00 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75  e key for the cu
17e10 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49 66  rrent entry.  If
17e20 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   the cursor is n
17e30 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74  ot pointing.** t
17e40 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2c  o a valid entry,
17e50 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20 74   *pSize is set t
17e60 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  o 0. .**.** For 
17e70 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  a table with the
17e80 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74   INTKEY flag set
17e90 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
17ea0 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a  eturns the key.*
17eb0 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68  * itself, not th
17ec0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
17ed0 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2f  s in the key..*/
17ee0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
17ef0 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f  eKeySize(BtCurso
17f00 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 53  r *pCur, i64 *pS
17f10 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ize){.  int rc =
17f20 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43   restoreOrClearC
17f30 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
17f40 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
17f50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17f60 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
17f70 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
17f80 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53  ALID || pCur->eS
17f90 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
17fa0 49 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43  ID );.    if( pC
17fb0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
17fc0 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
17fd0 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a      *pSize = 0;.
17fe0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17ff0 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
18000 72 29 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65  r);.      *pSize
18010 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b   = pCur->info.nK
18020 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ey;.    }.  }.  
18030 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
18040 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74  .** Set *pSize t
18050 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
18060 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e  bytes of data in
18070 20 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a   the entry the.*
18080 2a 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74  * cursor current
18090 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41  ly points to.  A
180a0 6c 77 61 79 73 20 72 65 74 75 72 6e 20 53 51 4c  lways return SQL
180b0 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 61 69 6c 75  ITE_OK..** Failu
180c0 72 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  re is not possib
180d0 6c 65 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  le.  If the curs
180e0 6f 72 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e  or is not curren
180f0 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20  tly.** pointing 
18100 74 6f 20 61 6e 20 65 6e 74 72 79 20 28 77 68 69  to an entry (whi
18110 63 68 20 63 61 6e 20 68 61 70 70 65 6e 2c 20 66  ch can happen, f
18120 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a  or example, if.*
18130 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  * the database i
18140 73 20 65 6d 70 74 79 29 20 74 68 65 6e 20 2a 70  s empty) then *p
18150 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30  Size is set to 0
18160 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
18170 42 74 72 65 65 44 61 74 61 53 69 7a 65 28 42 74  BtreeDataSize(Bt
18180 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
18190 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74  2 *pSize){.  int
181a0 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43   rc = restoreOrC
181b0 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
181c0 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
181d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
181e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
181f0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
18200 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75  R_INVALID || pCu
18210 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
18220 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 69  R_VALID );.    i
18230 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
18240 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
18250 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20  ){.      /* Not 
18260 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 76 61  pointing at a va
18270 6c 69 64 20 65 6e 74 72 79 20 2d 20 73 65 74 20  lid entry - set 
18280 2a 70 53 69 7a 65 20 74 6f 20 30 2e 20 2a 2f 0a  *pSize to 0. */.
18290 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30        *pSize = 0
182a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
182b0 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70     getCellInfo(p
182c0 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 53 69  Cur);.      *pSi
182d0 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ze = pCur->info.
182e0 6e 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d  nData;.    }.  }
182f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18300 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 79 6c  ./*.** Read payl
18310 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  oad information 
18320 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74  from the entry t
18330 68 61 74 20 74 68 65 20 70 43 75 72 20 63 75 72  hat the pCur cur
18340 73 6f 72 20 69 73 0a 2a 2a 20 70 6f 69 6e 74 69  sor is.** pointi
18350 6e 67 20 74 6f 2e 20 20 42 65 67 69 6e 20 72 65  ng to.  Begin re
18360 61 64 69 6e 67 20 74 68 65 20 70 61 79 6c 6f 61  ading the payloa
18370 64 20 61 74 20 22 6f 66 66 73 65 74 22 20 61 6e  d at "offset" an
18380 64 20 72 65 61 64 0a 2a 2a 20 61 20 74 6f 74 61  d read.** a tota
18390 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73  l of "amt" bytes
183a0 2e 20 20 50 75 74 20 74 68 65 20 72 65 73 75 6c  .  Put the resul
183b0 74 20 69 6e 20 7a 42 75 66 2e 0a 2a 2a 0a 2a 2a  t in zBuf..**.**
183c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
183d0 65 73 20 6e 6f 74 20 6d 61 6b 65 20 61 20 64 69  es not make a di
183e0 73 74 69 6e 63 74 69 6f 6e 20 62 65 74 77 65 65  stinction betwee
183f0 6e 20 6b 65 79 20 61 6e 64 20 64 61 74 61 2e 0a  n key and data..
18400 2a 2a 20 49 74 20 6a 75 73 74 20 72 65 61 64 73  ** It just reads
18410 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20   bytes from the 
18420 70 61 79 6c 6f 61 64 20 61 72 65 61 2e 20 20 44  payload area.  D
18430 61 74 61 20 6d 69 67 68 74 20 61 70 70 65 61 72  ata might appear
18440 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  .** on the main 
18450 70 61 67 65 20 6f 72 20 62 65 20 73 63 61 74 74  page or be scatt
18460 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74  ered out on mult
18470 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  iple overflow pa
18480 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ges..*/.static i
18490 6e 74 20 67 65 74 50 61 79 6c 6f 61 64 28 0a 20  nt getPayload(. 
184a0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
184b0 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
184c0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72  pointing to entr
184d0 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  y to read from *
184e0 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 2c 20  /.  int offset, 
184f0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69           /* Begi
18500 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73 20 66  n reading this f
18510 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20  ar into payload 
18520 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20  */.  int amt,   
18530 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61            /* Rea
18540 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  d this many byte
18550 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  s */.  unsigned 
18560 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57  char *pBuf, /* W
18570 72 69 74 65 20 74 68 65 20 62 79 74 65 73 20 69  rite the bytes i
18580 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20  nto this buffer 
18590 2a 2f 20 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65  */ .  int skipKe
185a0 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 66  y          /* of
185b0 66 73 65 74 20 62 65 67 69 6e 73 20 61 74 20 64  fset begins at d
185c0 61 74 61 20 69 66 20 74 68 69 73 20 69 73 20 74  ata if this is t
185d0 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69  rue */.){.  unsi
185e0 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c  gned char *aPayl
185f0 6f 61 64 3b 0a 20 20 50 67 6e 6f 20 6e 65 78 74  oad;.  Pgno next
18600 50 61 67 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Page;.  int rc;.
18610 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
18620 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
18630 74 3b 0a 20 20 69 6e 74 20 6f 76 66 6c 53 69 7a  t;.  int ovflSiz
18640 65 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 0a  e;.  u32 nKey;..
18650 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d    assert( pCur!=
18660 30 20 26 26 20 70 43 75 72 2d 3e 70 50 61 67 65  0 && pCur->pPage
18670 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
18680 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
18690 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
186a0 20 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74   pBt = pCur->pBt
186b0 72 65 65 2d 3e 70 42 74 3b 0a 20 20 70 50 61 67  ree->pBt;.  pPag
186c0 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
186d0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
186e0 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d  >idx>=0 && pCur-
186f0 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  >idx<pPage->nCel
18700 6c 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e  l );.  getCellIn
18710 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79  fo(pCur);.  aPay
18720 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66  load = pCur->inf
18730 6f 2e 70 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e  o.pCell + pCur->
18740 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20  info.nHeader;.  
18750 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
18760 79 20 29 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20  y ){.    nKey = 
18770 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
18780 6e 4b 65 79 20 3d 20 70 43 75 72 2d 3e 69 6e 66  nKey = pCur->inf
18790 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 61 73  o.nKey;.  }.  as
187a0 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 30 20  sert( offset>=0 
187b0 29 3b 0a 20 20 69 66 28 20 73 6b 69 70 4b 65 79  );.  if( skipKey
187c0 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b   ){.    offset +
187d0 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66  = nKey;.  }.  if
187e0 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3e 20 6e  ( offset+amt > n
187f0 4b 65 79 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  Key+pCur->info.n
18800 44 61 74 61 20 29 7b 0a 20 20 20 20 72 65 74 75  Data ){.    retu
18810 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
18820 0a 20 20 7d 0a 20 20 69 66 28 20 6f 66 66 73 65  .  }.  if( offse
18830 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  t<pCur->info.nLo
18840 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61  cal ){.    int a
18850 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20   = amt;.    if( 
18860 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69  a+offset>pCur->i
18870 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  nfo.nLocal ){.  
18880 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e      a = pCur->in
18890 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73  fo.nLocal - offs
188a0 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  et;.    }.    me
188b0 6d 63 70 79 28 70 42 75 66 2c 20 26 61 50 61 79  mcpy(pBuf, &aPay
188c0 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20 61 29  load[offset], a)
188d0 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 61 6d 74  ;.    if( a==amt
188e0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
188f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
18900 7d 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30  }.    offset = 0
18910 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b  ;.    pBuf += a;
18920 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20  .    amt -= a;. 
18930 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73   }else{.    offs
18940 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  et -= pCur->info
18950 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 6f  .nLocal;.  }.  o
18960 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  vflSize = pBt->u
18970 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
18980 20 69 66 28 20 61 6d 74 3e 30 20 29 7b 0a 20 20   if( amt>0 ){.  
18990 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
189a0 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b  4byte(&aPayload[
189b0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
189c0 6c 5d 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  l]);.    while( 
189d0 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50 61 67  amt>0 && nextPag
189e0 65 20 29 7b 0a 20 20 20 20 20 20 44 62 50 61 67  e ){.      DbPag
189f0 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20  e *pDbPage;.    
18a00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
18a10 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
18a20 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70  er, nextPage, &p
18a30 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  DbPage);.      i
18a40 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
18a50 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
18a60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 50 61       }.      aPa
18a70 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50  yload = sqlite3P
18a80 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
18a90 61 67 65 29 3b 0a 20 20 20 20 20 20 6e 65 78 74  age);.      next
18aa0 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
18ab0 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20  aPayload);.     
18ac0 20 69 66 28 20 6f 66 66 73 65 74 3c 6f 76 66 6c   if( offset<ovfl
18ad0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
18ae0 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20  int a = amt;.   
18af0 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66       if( a + off
18b00 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29  set > ovflSize )
18b10 7b 0a 20 20 20 20 20 20 20 20 20 20 61 20 3d 20  {.          a = 
18b20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65  ovflSize - offse
18b30 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
18b40 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66       memcpy(pBuf
18b50 2c 20 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73  , &aPayload[offs
18b60 65 74 2b 34 5d 2c 20 61 29 3b 0a 20 20 20 20 20  et+4], a);.     
18b70 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20     offset = 0;. 
18b80 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b         amt -= a;
18b90 0a 20 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d  .        pBuf +=
18ba0 20 61 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   a;.      }else{
18bb0 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20  .        offset 
18bc0 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20  -= ovflSize;.   
18bd0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
18be0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
18bf0 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Page);.    }.  }
18c00 0a 0a 20 20 69 66 28 20 61 6d 74 3e 30 20 29 7b  ..  if( amt>0 ){
18c10 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
18c20 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
18c30 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
18c40 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
18c50 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74  * Read part of t
18c60 68 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65  he key associate
18c70 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43  d with cursor pC
18c80 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20  ur.  Exactly.** 
18c90 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c  "amt" bytes will
18ca0 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69   be transfered i
18cb0 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65  nto pBuf[].  The
18cc0 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67   transfer.** beg
18cd0 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e  ins at "offset".
18ce0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
18cf0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
18d00 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
18d10 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
18d20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20  goes.** wrong.  
18d30 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  An error is retu
18d40 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b  rned if "offset+
18d50 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74  amt" is larger t
18d60 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c  han.** the avail
18d70 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f  able payload..*/
18d80 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
18d90 65 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70  eKey(BtCursor *p
18da0 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c  Cur, u32 offset,
18db0 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a   u32 amt, void *
18dc0 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 20  pBuf){.  int rc 
18dd0 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72  = restoreOrClear
18de0 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
18df0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
18e00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18e10 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
18e20 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
18e30 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72  LID );.    asser
18e40 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 21 3d  t( pCur->pPage!=
18e50 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75  0 );.    if( pCu
18e60 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  r->pPage->intKey
18e70 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
18e80 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
18e90 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
18ea0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
18eb0 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29  age->intKey==0 )
18ec0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
18ed0 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43  ur->idx>=0 && pC
18ee0 75 72 2d 3e 69 64 78 3c 70 43 75 72 2d 3e 70 50  ur->idx<pCur->pP
18ef0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
18f00 20 20 72 63 20 3d 20 67 65 74 50 61 79 6c 6f 61    rc = getPayloa
18f10 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
18f20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  amt, (unsigned c
18f30 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a 20  har*)pBuf, 0);. 
18f40 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
18f50 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61  }../*.** Read pa
18f60 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61  rt of the data a
18f70 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63  ssociated with c
18f80 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61  ursor pCur.  Exa
18f90 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79  ctly.** "amt" by
18fa0 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e  tes will be tran
18fb0 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66  sfered into pBuf
18fc0 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65  [].  The transfe
18fd0 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22  r.** begins at "
18fe0 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52  offset"..**.** R
18ff0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
19000 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
19010 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
19020 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
19030 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72  wrong.  An error
19040 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
19050 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20  "offset+amt" is 
19060 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74  larger than.** t
19070 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79  he available pay
19080 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  load..*/.int sql
19090 69 74 65 33 42 74 72 65 65 44 61 74 61 28 42 74  ite3BtreeData(Bt
190a0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
190b0 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d  2 offset, u32 am
190c0 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a  t, void *pBuf){.
190d0 20 20 69 6e 74 20 72 63 20 3d 20 72 65 73 74 6f    int rc = resto
190e0 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50  reOrClearCursorP
190f0 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
19100 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19110 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
19120 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
19130 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
19140 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
19150 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20  ->pPage!=0 );.  
19160 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
19170 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  idx>=0 && pCur->
19180 69 64 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d  idx<pCur->pPage-
19190 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63  >nCell );.    rc
191a0 20 3d 20 67 65 74 50 61 79 6c 6f 61 64 28 70 43   = getPayload(pC
191b0 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  ur, offset, amt,
191c0 20 70 42 75 66 2c 20 31 29 3b 0a 20 20 7d 0a 20   pBuf, 1);.  }. 
191d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
191e0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
191f0 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64  inter to payload
19200 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
19210 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  m the entry that
19220 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75   the .** pCur cu
19230 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
19240 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65   to.  The pointe
19250 72 20 69 73 20 74 6f 20 74 68 65 20 62 65 67 69  r is to the begi
19260 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20  nning of.** the 
19270 6b 65 79 20 69 66 20 73 6b 69 70 4b 65 79 3d 3d  key if skipKey==
19280 30 20 61 6e 64 20 69 74 20 70 6f 69 6e 74 73 20  0 and it points 
19290 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
192a0 20 6f 66 20 64 61 74 61 20 69 66 0a 2a 2a 20 73   of data if.** s
192b0 6b 69 70 4b 65 79 3d 3d 31 2e 20 20 54 68 65 20  kipKey==1.  The 
192c0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
192d0 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 6b 65 79  of available key
192e0 2f 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e  /data is written
192f0 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20  .** into *pAmt. 
19300 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68   If *pAmt==0, th
19310 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  en the value ret
19320 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62  urned will not b
19330 65 0a 2a 2a 20 61 20 76 61 6c 69 64 20 70 6f 69  e.** a valid poi
19340 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  nter..**.** This
19350 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f   routine is an o
19360 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74  ptimization.  It
19370 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74   is common for t
19380 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a  he entire key.**
19390 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74   and data to fit
193a0 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
193b0 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65  ge and for there
193c0 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c   to be no overfl
193d0 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68  ow.** pages.  Wh
193e0 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74  en that is so, t
193f0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  his routine can 
19400 62 65 20 75 73 65 64 20 74 6f 20 61 63 63 65 73  be used to acces
19410 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64  s the.** key and
19420 20 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61   data without ma
19430 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66  king a copy.  If
19440 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20   the key and/or 
19450 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f  data spills.** o
19460 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  nto overflow pag
19470 65 73 2c 20 74 68 65 6e 20 67 65 74 50 61 79 6c  es, then getPayl
19480 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20 75 73  oad() must be us
19490 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 79  ed to reassembly
194a0 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61  .** the key/data
194b0 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74   and copy it int
194c0 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64  o a preallocated
194d0 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   buffer..**.** T
194e0 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
194f0 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74  ned by this rout
19500 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74  ine looks direct
19510 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  ly into the cach
19520 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68  ed.** page of th
19530 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
19540 20 64 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e   data might chan
19550 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e  ge or move the n
19560 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20  ext time.** any 
19570 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73  btree routine is
19580 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
19590 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
195a0 64 20 63 68 61 72 20 2a 66 65 74 63 68 50 61 79  d char *fetchPay
195b0 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72  load(.  BtCursor
195c0 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20   *pCur,      /* 
195d0 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  Cursor pointing 
195e0 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64  to entry to read
195f0 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a   from */.  int *
19600 70 41 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20  pAmt,           
19610 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d  /* Write the num
19620 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
19630 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 20   bytes here */. 
19640 20 69 6e 74 20 73 6b 69 70 4b 65 79 20 20 20 20   int skipKey    
19650 20 20 20 20 20 20 2f 2a 20 72 65 61 64 20 62 65        /* read be
19660 67 69 6e 6e 69 6e 67 20 61 74 20 64 61 74 61 20  ginning at data 
19670 69 66 20 74 68 69 73 20 69 73 20 74 72 75 65 20  if this is true 
19680 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
19690 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b   char *aPayload;
196a0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
196b0 65 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20  e;.  u32 nKey;. 
196c0 20 69 6e 74 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20   int nLocal;..  
196d0 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20  assert( pCur!=0 
196e0 26 26 20 70 43 75 72 2d 3e 70 50 61 67 65 21 3d  && pCur->pPage!=
196f0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
19700 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
19710 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70  SOR_VALID );.  p
19720 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
19730 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  ge;.  assert( pC
19740 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43  ur->idx>=0 && pC
19750 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e  ur->idx<pPage->n
19760 43 65 6c 6c 20 29 3b 0a 20 20 67 65 74 43 65 6c  Cell );.  getCel
19770 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61  lInfo(pCur);.  a
19780 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e  Payload = pCur->
19790 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61 50  info.pCell;.  aP
197a0 61 79 6c 6f 61 64 20 2b 3d 20 70 43 75 72 2d 3e  ayload += pCur->
197b0 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20  info.nHeader;.  
197c0 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
197d0 79 20 29 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20  y ){.    nKey = 
197e0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
197f0 6e 4b 65 79 20 3d 20 70 43 75 72 2d 3e 69 6e 66  nKey = pCur->inf
19800 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66  o.nKey;.  }.  if
19810 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20  ( skipKey ){.   
19820 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65   aPayload += nKe
19830 79 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20  y;.    nLocal = 
19840 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
19850 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73  l - nKey;.  }els
19860 65 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20  e{.    nLocal = 
19870 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
19880 6c 3b 0a 20 20 20 20 69 66 28 20 6e 4c 6f 63 61  l;.    if( nLoca
19890 6c 3e 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  l>nKey ){.      
198a0 6e 4c 6f 63 61 6c 20 3d 20 6e 4b 65 79 3b 0a 20  nLocal = nKey;. 
198b0 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 41 6d 74     }.  }.  *pAmt
198c0 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74   = nLocal;.  ret
198d0 75 72 6e 20 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a  urn aPayload;.}.
198e0 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ../*.** For the 
198f0 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f  entry that curso
19900 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20  r pCur is point 
19910 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a  to, return as.**
19920 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74   many bytes of t
19930 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61  he key or data a
19940 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20  s are available 
19950 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20  on the local.** 
19960 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57 72  b-tree page.  Wr
19970 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ite the number o
19980 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65  f available byte
19990 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a  s into *pAmt..**
199a0 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20  .** The pointer 
199b0 72 65 74 75 72 6e 65 64 20 69 73 20 65 70 68 65  returned is ephe
199c0 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f  meral.  The key/
199d0 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a  data may move.**
199e0 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65 64   or be destroyed
199f0 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c   on the next cal
19a00 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72  l to any Btree r
19a10 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  outine..**.** Th
19a20 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20  ese routines is 
19a30 75 73 65 64 20 74 6f 20 67 65 74 20 71 75 69 63  used to get quic
19a40 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20  k access to key 
19a50 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74  and data.** in t
19a60 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  he common case w
19a70 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77  here no overflow
19a80 20 70 61 67 65 73 20 61 72 65 20 75 73 65 64 2e   pages are used.
19a90 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a  .*/.const void *
19aa0 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 46  sqlite3BtreeKeyF
19ab0 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70  etch(BtCursor *p
19ac0 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b  Cur, int *pAmt){
19ad0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
19ae0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
19af0 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  D ){.    return 
19b00 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74  (const void*)fet
19b10 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  chPayload(pCur, 
19b20 70 41 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  pAmt, 0);.  }.  
19b30 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 63 6f 6e 73  return 0;.}.cons
19b40 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42  t void *sqlite3B
19b50 74 72 65 65 44 61 74 61 46 65 74 63 68 28 42 74  treeDataFetch(Bt
19b60 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
19b70 74 20 2a 70 41 6d 74 29 7b 0a 20 20 69 66 28 20  t *pAmt){.  if( 
19b80 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
19b90 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
19ba0 20 20 72 65 74 75 72 6e 20 28 63 6f 6e 73 74 20    return (const 
19bb0 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f  void*)fetchPaylo
19bc0 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 31  ad(pCur, pAmt, 1
19bd0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
19be0 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  0;.}.../*.** Mov
19bf0 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
19c00 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64  n to a new child
19c10 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77 50   page.  The newP
19c20 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73 20  gno argument is 
19c30 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62  the.** page numb
19c40 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  er of the child 
19c50 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e  page to move to.
19c60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
19c70 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72  oveToChild(BtCur
19c80 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e  sor *pCur, u32 n
19c90 65 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72  ewPgno){.  int r
19ca0 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  c;.  MemPage *pN
19cb0 65 77 50 61 67 65 3b 0a 20 20 4d 65 6d 50 61 67  ewPage;.  MemPag
19cc0 65 20 2a 70 4f 6c 64 50 61 67 65 3b 0a 20 20 42  e *pOldPage;.  B
19cd0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
19ce0 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74  Cur->pBtree->pBt
19cf0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  ;..  assert( pCu
19d00 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
19d10 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72 63 20  R_VALID );.  rc 
19d20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
19d30 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26  (pBt, newPgno, &
19d40 70 4e 65 77 50 61 67 65 2c 20 70 43 75 72 2d 3e  pNewPage, pCur->
19d50 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  pPage);.  if( rc
19d60 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
19d70 70 4e 65 77 50 61 67 65 2d 3e 69 64 78 50 61 72  pNewPage->idxPar
19d80 65 6e 74 20 3d 20 70 43 75 72 2d 3e 69 64 78 3b  ent = pCur->idx;
19d90 0a 20 20 70 4f 6c 64 50 61 67 65 20 3d 20 70 43  .  pOldPage = pC
19da0 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 70 4f 6c  ur->pPage;.  pOl
19db0 64 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20  dPage->idxShift 
19dc0 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  = 0;.  releasePa
19dd0 67 65 28 70 4f 6c 64 50 61 67 65 29 3b 0a 20 20  ge(pOldPage);.  
19de0 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 4e  pCur->pPage = pN
19df0 65 77 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e  ewPage;.  pCur->
19e00 69 64 78 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  idx = 0;.  pCur-
19e10 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
19e20 0a 20 20 69 66 28 20 70 4e 65 77 50 61 67 65 2d  .  if( pNewPage-
19e30 3e 6e 43 65 6c 6c 3c 31 20 29 7b 0a 20 20 20 20  >nCell<1 ){.    
19e40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
19e50 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
19e60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19e70 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
19e80 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
19e90 70 61 67 65 20 69 73 20 74 68 65 20 76 69 72 74  page is the virt
19ea0 75 61 6c 20 72 6f 6f 74 20 6f 66 20 69 74 73 20  ual root of its 
19eb0 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  table..**.** The
19ec0 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
19ed0 67 65 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70  ge is the root p
19ee0 61 67 65 20 66 6f 72 20 6d 6f 73 74 20 74 61 62  age for most tab
19ef0 6c 65 73 2e 20 20 42 75 74 0a 2a 2a 20 66 6f 72  les.  But.** for
19f00 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65   the table roote
19f10 64 20 6f 6e 20 70 61 67 65 20 31 2c 20 73 6f 6d  d on page 1, som
19f20 65 74 69 6d 65 20 74 68 65 20 72 65 61 6c 20 72  etime the real r
19f30 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73 20 65  oot page.** is e
19f40 6d 70 74 79 20 65 78 63 65 70 74 20 66 6f 72 20  mpty except for 
19f50 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e 74 65  the right-pointe
19f60 72 2e 20 20 49 6e 20 73 75 63 68 20 63 61 73 65  r.  In such case
19f70 73 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c  s the.** virtual
19f80 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 74 68   root page is th
19f90 65 20 70 61 67 65 20 74 68 61 74 20 74 68 65 20  e page that the 
19fa0 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 20 6f 66  right-pointer of
19fb0 20 70 61 67 65 0a 2a 2a 20 31 20 69 73 20 70 6f   page.** 1 is po
19fc0 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2f 0a 73 74  inting to..*/.st
19fd0 61 74 69 63 20 69 6e 74 20 69 73 52 6f 6f 74 50  atic int isRootP
19fe0 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
19ff0 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ge){.  MemPage *
1a000 70 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d  pParent = pPage-
1a010 3e 70 50 61 72 65 6e 74 3b 0a 20 20 69 66 28 20  >pParent;.  if( 
1a020 70 50 61 72 65 6e 74 3d 3d 30 20 29 20 72 65 74  pParent==0 ) ret
1a030 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 50 61  urn 1;.  if( pPa
1a040 72 65 6e 74 2d 3e 70 67 6e 6f 3e 31 20 29 20 72  rent->pgno>1 ) r
1a050 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 67  eturn 0;.  if( g
1a060 65 74 32 62 79 74 65 28 26 70 50 61 72 65 6e 74  et2byte(&pParent
1a070 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
1a080 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 29 3d 3d  >hdrOffset+3])==
1a090 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
1a0a0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
1a0b0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
1a0c0 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70 61 72  or up to the par
1a0d0 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ent page..**.** 
1a0e0 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74  pCur->idx is set
1a0f0 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64   to the cell ind
1a100 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ex that contains
1a110 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20   the pointer.** 
1a120 74 6f 20 74 68 65 20 70 61 67 65 20 77 65 20 61  to the page we a
1a130 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20  re coming from. 
1a140 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e   If we are comin
1a150 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69  g from the.** ri
1a160 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70  ght-most child p
1a170 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69  age then pCur->i
1a180 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65  dx is set to one
1a190 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68   more than.** th
1a1a0 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69  e largest cell i
1a1b0 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
1a1c0 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e  void moveToParen
1a1d0 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
1a1e0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
1a1f0 61 72 65 6e 74 3b 0a 20 20 4d 65 6d 50 61 67 65  arent;.  MemPage
1a200 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74 20 69   *pPage;.  int i
1a210 64 78 50 61 72 65 6e 74 3b 0a 0a 20 20 61 73 73  dxParent;..  ass
1a220 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1a230 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1a240 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  );.  pPage = pCu
1a250 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65  r->pPage;.  asse
1a260 72 74 28 20 70 50 61 67 65 21 3d 30 20 29 3b 0a  rt( pPage!=0 );.
1a270 20 20 61 73 73 65 72 74 28 20 21 69 73 52 6f 6f    assert( !isRoo
1a280 74 50 61 67 65 28 70 50 61 67 65 29 20 29 3b 0a  tPage(pPage) );.
1a290 20 20 70 50 61 72 65 6e 74 20 3d 20 70 50 61 67    pParent = pPag
1a2a0 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 61 73  e->pParent;.  as
1a2b0 73 65 72 74 28 20 70 50 61 72 65 6e 74 21 3d 30  sert( pParent!=0
1a2c0 20 29 3b 0a 20 20 69 64 78 50 61 72 65 6e 74 20   );.  idxParent 
1a2d0 3d 20 70 50 61 67 65 2d 3e 69 64 78 50 61 72 65  = pPage->idxPare
1a2e0 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  nt;.  sqlite3Pag
1a2f0 65 72 52 65 66 28 70 50 61 72 65 6e 74 2d 3e 70  erRef(pParent->p
1a300 44 62 50 61 67 65 29 3b 0a 20 20 72 65 6c 65 61  DbPage);.  relea
1a310 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
1a320 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 70   pCur->pPage = p
1a330 50 61 72 65 6e 74 3b 0a 20 20 70 43 75 72 2d 3e  Parent;.  pCur->
1a340 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
1a350 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
1a360 74 2d 3e 69 64 78 53 68 69 66 74 3d 3d 30 20 29  t->idxShift==0 )
1a370 3b 0a 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20  ;.  pCur->idx = 
1a380 69 64 78 50 61 72 65 6e 74 3b 0a 7d 0a 0a 2f 2a  idxParent;.}../*
1a390 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
1a3a0 73 6f 72 20 74 6f 20 74 68 65 20 72 6f 6f 74 20  sor to the root 
1a3b0 70 61 67 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  page.*/.static i
1a3c0 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74  nt moveToRoot(Bt
1a3d0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1a3e0 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b   MemPage *pRoot;
1a3f0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1a400 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65  TE_OK;.  BtShare
1a410 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
1a420 42 74 72 65 65 2d 3e 70 42 74 3b 0a 0a 20 20 69  Btree->pBt;..  i
1a430 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
1a440 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
1a450 45 45 4b 20 29 7b 0a 20 20 20 20 63 6c 65 61 72  EEK ){.    clear
1a460 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
1a470 43 75 72 29 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f  Cur);.  }.  pRoo
1a480 74 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  t = pCur->pPage;
1a490 0a 20 20 69 66 28 20 70 52 6f 6f 74 20 26 26 20  .  if( pRoot && 
1a4a0 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75  pRoot->pgno==pCu
1a4b0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20  r->pgnoRoot ){. 
1a4c0 20 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74     assert( pRoot
1a4d0 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 7d 65  ->isInit );.  }e
1a4e0 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 0a 20 20  lse{.    if( .  
1a4f0 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28      SQLITE_OK!=(
1a500 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
1a510 61 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70  age(pBt, pCur->p
1a520 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c  gnoRoot, &pRoot,
1a530 20 30 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20   0)).    ){.    
1a540 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
1a550 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
1a560 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1a570 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65  ;.    }.    rele
1a580 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 70 50  asePage(pCur->pP
1a590 61 67 65 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  age);.    pCur->
1a5a0 70 50 61 67 65 20 3d 20 70 52 6f 6f 74 3b 0a 20  pPage = pRoot;. 
1a5b0 20 7d 0a 20 20 70 43 75 72 2d 3e 69 64 78 20 3d   }.  pCur->idx =
1a5c0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f   0;.  pCur->info
1a5d0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66  .nSize = 0;.  if
1a5e0 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d  ( pRoot->nCell==
1a5f0 30 20 26 26 20 21 70 52 6f 6f 74 2d 3e 6c 65 61  0 && !pRoot->lea
1a600 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75  f ){.    Pgno su
1a610 62 70 61 67 65 3b 0a 20 20 20 20 61 73 73 65 72  bpage;.    asser
1a620 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d  t( pRoot->pgno==
1a630 31 20 29 3b 0a 20 20 20 20 73 75 62 70 61 67 65  1 );.    subpage
1a640 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 52 6f   = get4byte(&pRo
1a650 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d  ot->aData[pRoot-
1a660 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
1a670 20 20 20 20 61 73 73 65 72 74 28 20 73 75 62 70      assert( subp
1a680 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 70 43 75  age>0 );.    pCu
1a690 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
1a6a0 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72 63  OR_VALID;.    rc
1a6b0 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
1a6c0 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b 0a 20  Cur, subpage);. 
1a6d0 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74   }.  pCur->eStat
1a6e0 65 20 3d 20 28 28 70 43 75 72 2d 3e 70 50 61 67  e = ((pCur->pPag
1a6f0 65 2d 3e 6e 43 65 6c 6c 3e 30 29 3f 43 55 52 53  e->nCell>0)?CURS
1a700 4f 52 5f 56 41 4c 49 44 3a 43 55 52 53 4f 52 5f  OR_VALID:CURSOR_
1a710 49 4e 56 41 4c 49 44 29 3b 0a 20 20 72 65 74 75  INVALID);.  retu
1a720 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1a730 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
1a740 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74  down to the left
1a750 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79  -most leaf entry
1a760 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20   beneath the.** 
1a770 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 69  entry to which i
1a780 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
1a790 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  ointing..**.** T
1a7a0 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61  he left-most lea
1a7b0 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74  f is the one wit
1a7c0 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b  h the smallest k
1a7d0 65 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a  ey - the first.*
1a7e0 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  * in ascending o
1a7f0 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
1a800 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  int moveToLeftmo
1a810 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
1a820 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  r){.  Pgno pgno;
1a830 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
1a840 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
1a850 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1a860 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1a870 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 21  ID );.  while( !
1a880 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70  (pPage = pCur->p
1a890 50 61 67 65 29 2d 3e 6c 65 61 66 20 29 7b 0a 20  Page)->leaf ){. 
1a8a0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1a8b0 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d  >idx>=0 && pCur-
1a8c0 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  >idx<pPage->nCel
1a8d0 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20  l );.    pgno = 
1a8e0 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
1a8f0 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  l(pPage, pCur->i
1a900 64 78 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d  dx));.    rc = m
1a910 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
1a920 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20   pgno);.    if( 
1a930 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1a940 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1a950 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1a960 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
1a970 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67   down to the rig
1a980 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74  ht-most leaf ent
1a990 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a  ry beneath the.*
1a9a0 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63 68 20  * page to which 
1a9b0 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
1a9c0 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63  pointing.  Notic
1a9d0 65 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65  e the difference
1a9e0 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65  .** between move
1a9f0 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64  ToLeftmost() and
1aa00 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
1aa10 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  ().  moveToLeftm
1aa20 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74  ost().** finds t
1aa30 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74  he left-most ent
1aa40 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a  ry beneath the *
1aa50 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d  entry* whereas m
1aa60 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29  oveToRightmost()
1aa70 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69  .** finds the ri
1aa80 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62  ght-most entry b
1aa90 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67 65  eneath the *page
1aaa0 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67  *..**.** The rig
1aab0 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73  ht-most entry is
1aac0 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68   the one with th
1aad0 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20  e largest key - 
1aae0 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20  the last.** key 
1aaf0 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
1ab00 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
1ab10 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  t moveToRightmos
1ab20 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
1ab30 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  ){.  Pgno pgno;.
1ab40 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
1ab50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
1ab60 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1ab70 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1ab80 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 28  D );.  while( !(
1ab90 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
1aba0 61 67 65 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  age)->leaf ){.  
1abb0 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
1abc0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
1abd0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
1abe0 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  +8]);.    pCur->
1abf0 69 64 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  idx = pPage->nCe
1ac00 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ll;.    rc = mov
1ac10 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70  eToChild(pCur, p
1ac20 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63  gno);.    if( rc
1ac30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1ac40 7d 0a 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20  }.  pCur->idx = 
1ac50 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 31  pPage->nCell - 1
1ac60 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
1ac70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 72 65 74 75  Size = 0;.  retu
1ac80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1ac90 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
1aca0 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74  sor to the first
1acb0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
1acc0 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ble.  Return SQL
1acd0 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
1ace0 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73  cess.  Set *pRes
1acf0 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72   to 0 if the cur
1ad00 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69  sor actually poi
1ad10 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  nts to something
1ad20 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73  .** or set *pRes
1ad30 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62   to 1 if the tab
1ad40 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
1ad50 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1ad60 46 69 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a  First(BtCursor *
1ad70 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
1ad80 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63  {.  int rc;.  rc
1ad90 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
1ada0 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ur);.  if( rc ) 
1adb0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28  return rc;.  if(
1adc0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1add0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
1ade0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
1adf0 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  r->pPage->nCell=
1ae00 3d 30 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20  =0 );.    *pRes 
1ae10 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
1ae20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1ae30 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
1ae40 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b  Page->nCell>0 );
1ae50 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20  .  *pRes = 0;.  
1ae60 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  rc = moveToLeftm
1ae70 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 72 65 74  ost(pCur);.  ret
1ae80 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f  urn rc;.}../* Mo
1ae90 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
1aea0 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
1aeb0 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  in the table.  R
1aec0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
1aed0 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ** on success.  
1aee0 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69  Set *pRes to 0 i
1aef0 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74  f the cursor act
1af00 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ually points to 
1af10 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20  something.** or 
1af20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69  set *pRes to 1 i
1af30 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
1af40 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
1af50 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 42 74  ite3BtreeLast(Bt
1af60 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
1af70 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
1af80 72 63 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54  rc;.  rc = moveT
1af90 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
1afa0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1afb0 63 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f  c;.  if( CURSOR_
1afc0 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
1afd0 53 74 61 74 65 20 29 7b 0a 20 20 20 20 61 73 73  State ){.    ass
1afe0 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
1aff0 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
1b000 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
1b010 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1b020 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  K;.  }.  assert(
1b030 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1b040 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1b050 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 72 63   *pRes = 0;.  rc
1b060 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f   = moveToRightmo
1b070 73 74 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75  st(pCur);.  retu
1b080 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  rn rc;.}../* Mov
1b090 65 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20  e the cursor so 
1b0a0 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
1b0b0 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20  o an entry near 
1b0c0 70 4b 65 79 2f 6e 4b 65 79 2e 0a 2a 2a 20 52 65  pKey/nKey..** Re
1b0d0 74 75 72 6e 20 61 20 73 75 63 63 65 73 73 20 63  turn a success c
1b0e0 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49  ode..**.** For I
1b0f0 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 6f 6e  NTKEY tables, on
1b100 6c 79 20 74 68 65 20 6e 4b 65 79 20 70 61 72 61  ly the nKey para
1b110 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e 20 20  meter is used.  
1b120 70 4b 65 79 20 69 73 0a 2a 2a 20 69 67 6e 6f 72  pKey is.** ignor
1b130 65 64 2e 20 20 46 6f 72 20 6f 74 68 65 72 20 74  ed.  For other t
1b140 61 62 6c 65 73 2c 20 6e 4b 65 79 20 69 73 20 74  ables, nKey is t
1b150 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1b160 65 73 20 6f 66 20 64 61 74 61 0a 2a 2a 20 69 6e  es of data.** in
1b170 20 70 4b 65 79 2e 20 20 54 68 65 20 63 6f 6d 70   pKey.  The comp
1b180 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
1b190 73 70 65 63 69 66 69 65 64 20 77 68 65 6e 20 74  specified when t
1b1a0 68 65 20 63 75 72 73 6f 72 20 77 61 73 0a 2a 2a  he cursor was.**
1b1b0 20 63 72 65 61 74 65 64 20 69 73 20 75 73 65 64   created is used
1b1c0 20 74 6f 20 63 6f 6d 70 61 72 65 20 6b 65 79 73   to compare keys
1b1d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78  ..**.** If an ex
1b1e0 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74  act match is not
1b1f0 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65   found, then the
1b200 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79   cursor is alway
1b210 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69  s.** left pointi
1b220 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70 61 67  ng at a leaf pag
1b230 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f  e which would ho
1b240 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69 66 20  ld the entry if 
1b250 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65  it.** were prese
1b260 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20  nt.  The cursor 
1b270 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61  might point to a
1b280 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d  n entry that com
1b290 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20  es.** before or 
1b2a0 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a  after the key..*
1b2b0 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20  *.** The result 
1b2c0 6f 66 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65  of comparing the
1b2d0 20 6b 65 79 20 77 69 74 68 20 74 68 65 20 65 6e   key with the en
1b2e0 74 72 79 20 74 6f 20 77 68 69 63 68 20 74 68 65  try to which the
1b2f0 0a 2a 2a 20 63 75 72 73 6f 72 20 69 73 20 77 72  .** cursor is wr
1b300 69 74 74 65 6e 20 74 6f 20 2a 70 52 65 73 20 69  itten to *pRes i
1b310 66 20 70 52 65 73 21 3d 4e 55 4c 4c 2e 20 20 54  f pRes!=NULL.  T
1b320 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 0a 2a 2a  he meaning of.**
1b330 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 61   this value is a
1b340 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
1b350 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20       *pRes<0    
1b360 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
1b370 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
1b380 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
1b390 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1b3a0 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68     is smaller th
1b3b0 61 6e 20 70 4b 65 79 20 6f 72 20 69 66 20 74 68  an pKey or if th
1b3c0 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
1b3d0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1b3e0 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 75 72       and the cur
1b3f0 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72 65  sor is therefore
1b400 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e   left point to n
1b410 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  othing..**.**   
1b420 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54    *pRes==0     T
1b430 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
1b440 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
1b450 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
1b460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b470 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20  exactly matches 
1b480 70 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  pKey..**.**     
1b490 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54 68 65  *pRes>0      The
1b4a0 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
1b4b0 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
1b4c0 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
1b4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
1b4e0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 4b 65   larger than pKe
1b4f0 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
1b500 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20  3BtreeMoveto(.  
1b510 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1b520 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
1b530 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64  rsor to be moved
1b540 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
1b550 20 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20   *pKey,      /* 
1b560 54 68 65 20 6b 65 79 20 63 6f 6e 74 65 6e 74 20  The key content 
1b570 66 6f 72 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f  for indices.  No
1b580 74 20 75 73 65 64 20 62 79 20 74 61 62 6c 65 73  t used by tables
1b590 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20   */.  i64 nKey, 
1b5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b5b0 53 69 7a 65 20 6f 66 20 70 4b 65 79 2e 20 20 4f  Size of pKey.  O
1b5c0 72 20 74 68 65 20 6b 65 79 20 66 6f 72 20 74 61  r the key for ta
1b5d0 62 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69  bles */.  int bi
1b5e0 61 73 52 69 67 68 74 2c 20 20 20 20 20 20 20 20  asRight,        
1b5f0 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61   /* If true, bia
1b600 73 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20  s the search to 
1b610 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a  the high end */.
1b620 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20    int *pRes     
1b630 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72           /* Sear
1b640 63 68 20 72 65 73 75 6c 74 20 66 6c 61 67 20 2a  ch result flag *
1b650 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
1b660 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
1b670 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
1b680 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1b690 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
1b6a0 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
1b6b0 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 73   pCur->pPage->is
1b6c0 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 70 43  Init );.  if( pC
1b6d0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1b6e0 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
1b6f0 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20    *pRes = -1;.  
1b700 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1b710 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pPage->nCell==0 
1b720 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
1b730 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 66  LITE_OK;.  }.  f
1b740 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20  or(;;){.    int 
1b750 6c 77 72 2c 20 75 70 72 3b 0a 20 20 20 20 50 67  lwr, upr;.    Pg
1b760 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d  no chldPg;.    M
1b770 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
1b780 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20  pCur->pPage;.   
1b790 20 69 6e 74 20 63 20 3d 20 2d 31 3b 20 20 2f 2a   int c = -1;  /*
1b7a0 20 70 52 65 73 20 72 65 74 75 72 6e 20 69 66 20   pRes return if 
1b7b0 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 20 6d  table is empty m
1b7c0 75 73 74 20 62 65 20 2d 31 20 2a 2f 0a 20 20 20  ust be -1 */.   
1b7d0 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70   lwr = 0;.    up
1b7e0 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  r = pPage->nCell
1b7f0 2d 31 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61  -1;.    if( !pPa
1b800 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 70 4b  ge->intKey && pK
1b810 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ey==0 ){.      r
1b820 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1b830 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
1b840 0a 20 20 20 20 69 66 28 20 62 69 61 73 52 69 67  .    if( biasRig
1b850 68 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  ht ){.      pCur
1b860 2d 3e 69 64 78 20 3d 20 75 70 72 3b 0a 20 20 20  ->idx = upr;.   
1b870 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43   }else{.      pC
1b880 75 72 2d 3e 69 64 78 20 3d 20 28 75 70 72 2b 6c  ur->idx = (upr+l
1b890 77 72 29 2f 32 3b 0a 20 20 20 20 7d 0a 20 20 20  wr)/2;.    }.   
1b8a0 20 69 66 28 20 6c 77 72 3c 3d 75 70 72 20 29 20   if( lwr<=upr ) 
1b8b0 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 76  for(;;){.      v
1b8c0 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20  oid *pCellKey;. 
1b8d0 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65       i64 nCellKe
1b8e0 79 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69  y;.      pCur->i
1b8f0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
1b900 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
1b910 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
1b920 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20    u8 *pCell;.   
1b930 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e       pCell = fin
1b940 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  dCell(pPage, pCu
1b950 72 2d 3e 69 64 78 29 20 2b 20 70 50 61 67 65 2d  r->idx) + pPage-
1b960 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
1b970 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
1b980 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20  ->hasData ){.   
1b990 20 20 20 20 20 20 20 75 33 32 20 64 75 6d 6d 79         u32 dummy
1b9a0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 65 6c  ;.          pCel
1b9b0 6c 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  l += getVarint32
1b9c0 28 70 43 65 6c 6c 2c 20 26 64 75 6d 6d 79 29 3b  (pCell, &dummy);
1b9d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b9e0 20 20 20 67 65 74 56 61 72 69 6e 74 28 70 43 65     getVarint(pCe
1b9f0 6c 6c 2c 20 28 75 36 34 20 2a 29 26 6e 43 65 6c  ll, (u64 *)&nCel
1ba00 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69  lKey);.        i
1ba10 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 6e 4b 65 79  f( nCellKey<nKey
1ba20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20   ){.          c 
1ba30 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  = -1;.        }e
1ba40 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79  lse if( nCellKey
1ba50 3e 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  >nKey ){.       
1ba60 20 20 20 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20     c = +1;.     
1ba70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ba80 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20      c = 0;.     
1ba90 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
1baa0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 76  {.        int av
1bab0 61 69 6c 61 62 6c 65 3b 0a 20 20 20 20 20 20 20  ailable;.       
1bac0 20 70 43 65 6c 6c 4b 65 79 20 3d 20 28 76 6f 69   pCellKey = (voi
1bad0 64 20 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64  d *)fetchPayload
1bae0 28 70 43 75 72 2c 20 26 61 76 61 69 6c 61 62 6c  (pCur, &availabl
1baf0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6e  e, 0);.        n
1bb00 43 65 6c 6c 4b 65 79 20 3d 20 70 43 75 72 2d 3e  CellKey = pCur->
1bb10 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20  info.nKey;.     
1bb20 20 20 20 69 66 28 20 61 76 61 69 6c 61 62 6c 65     if( available
1bb30 3e 3d 6e 43 65 6c 6c 4b 65 79 20 29 7b 0a 20 20  >=nCellKey ){.  
1bb40 20 20 20 20 20 20 20 20 63 20 3d 20 70 43 75 72          c = pCur
1bb50 2d 3e 78 43 6f 6d 70 61 72 65 28 70 43 75 72 2d  ->xCompare(pCur-
1bb60 3e 70 41 72 67 2c 20 6e 43 65 6c 6c 4b 65 79 2c  >pArg, nCellKey,
1bb70 20 70 43 65 6c 6c 4b 65 79 2c 20 6e 4b 65 79 2c   pCellKey, nKey,
1bb80 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20   pKey);.        
1bb90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1bba0 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69   pCellKey = sqli
1bbb0 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 43 65  teMallocRaw( nCe
1bbc0 6c 6c 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20  llKey );.       
1bbd0 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d     if( pCellKey=
1bbe0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
1bbf0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
1bc00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1bc10 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30  BtreeKey(pCur, 0
1bc20 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 28 76 6f 69  , nCellKey, (voi
1bc30 64 20 2a 29 70 43 65 6c 6c 4b 65 79 29 3b 0a 20  d *)pCellKey);. 
1bc40 20 20 20 20 20 20 20 20 20 63 20 3d 20 70 43 75           c = pCu
1bc50 72 2d 3e 78 43 6f 6d 70 61 72 65 28 70 43 75 72  r->xCompare(pCur
1bc60 2d 3e 70 41 72 67 2c 20 6e 43 65 6c 6c 4b 65 79  ->pArg, nCellKey
1bc70 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 6e 4b 65 79  , pCellKey, nKey
1bc80 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  , pKey);.       
1bc90 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43     sqliteFree(pC
1bca0 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
1bcb0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
1bcc0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
1bcd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1bce0 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( c==0 ){.     
1bcf0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65     if( pPage->le
1bd00 61 66 44 61 74 61 20 26 26 20 21 70 50 61 67 65  afData && !pPage
1bd10 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
1bd20 20 20 20 20 6c 77 72 20 3d 20 70 43 75 72 2d 3e      lwr = pCur->
1bd30 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 75  idx;.          u
1bd40 70 72 20 3d 20 6c 77 72 20 2d 20 31 3b 0a 20 20  pr = lwr - 1;.  
1bd50 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1bd60 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1bd70 20 20 20 20 20 20 20 20 69 66 28 20 70 52 65 73          if( pRes
1bd80 20 29 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20   ) *pRes = 0;.  
1bd90 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
1bda0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
1bdb0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1bdc0 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20    if( c<0 ){.   
1bdd0 20 20 20 20 20 6c 77 72 20 3d 20 70 43 75 72 2d       lwr = pCur-
1bde0 3e 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 7d 65  >idx+1;.      }e
1bdf0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75 70 72  lse{.        upr
1be00 20 3d 20 70 43 75 72 2d 3e 69 64 78 2d 31 3b 0a   = pCur->idx-1;.
1be10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1be20 28 20 6c 77 72 3e 75 70 72 20 29 7b 0a 20 20 20  ( lwr>upr ){.   
1be30 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1be40 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e    }.      pCur->
1be50 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f  idx = (lwr+upr)/
1be60 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  2;.    }.    ass
1be70 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20  ert( lwr==upr+1 
1be80 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1be90 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
1bea0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c      if( pPage->l
1beb0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 63 68 6c  eaf ){.      chl
1bec0 64 50 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  dPg = 0;.    }el
1bed0 73 65 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67  se if( lwr>=pPag
1bee0 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
1bef0 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62    chldPg = get4b
1bf00 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
1bf10 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
1bf20 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  et+8]);.    }els
1bf30 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  e{.      chldPg 
1bf40 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  = get4byte(findC
1bf50 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29  ell(pPage, lwr))
1bf60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1bf70 63 68 6c 64 50 67 3d 3d 30 20 29 7b 0a 20 20 20  chldPg==0 ){.   
1bf80 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1bf90 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d  >idx>=0 && pCur-
1bfa0 3e 69 64 78 3c 70 43 75 72 2d 3e 70 50 61 67 65  >idx<pCur->pPage
1bfb0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20  ->nCell );.     
1bfc0 20 69 66 28 20 70 52 65 73 20 29 20 2a 70 52 65   if( pRes ) *pRe
1bfd0 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 65 74  s = c;.      ret
1bfe0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1bff0 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69     }.    pCur->i
1c000 64 78 20 3d 20 6c 77 72 3b 0a 20 20 20 20 70 43  dx = lwr;.    pC
1c010 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
1c020 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76   0;.    rc = mov
1c030 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63  eToChild(pCur, c
1c040 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20  hldPg);.    if( 
1c050 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
1c060 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
1c070 0a 20 20 2f 2a 20 4e 4f 54 20 52 45 41 43 48 45  .  /* NOT REACHE
1c080 44 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  D */.}../*.** Re
1c090 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
1c0a0 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70   cursor is not p
1c0b0 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
1c0c0 74 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65  try of the table
1c0d0 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c  ..**.** TRUE wil
1c0e0 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 61 66  l be returned af
1c0f0 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
1c100 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29  lite3BtreeNext()
1c110 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74   moves.** past t
1c120 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
1c130 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71   the table or sq
1c140 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 28 29  lite3BtreePrev()
1c150 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74   moves past.** t
1c160 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20  he first entry. 
1c170 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65   TRUE is also re
1c180 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 74 61  turned if the ta
1c190 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
1c1a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1c1b0 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70  eEof(BtCursor *p
1c1c0 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a  Cur){.  /* TODO:
1c1d0 20 57 68 61 74 20 69 66 20 74 68 65 20 63 75 72   What if the cur
1c1e0 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52  sor is in CURSOR
1c1f0 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62 75 74  _REQUIRESEEK but
1c200 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69   all table entri
1c210 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65  es.  ** have bee
1c220 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20  n deleted? This 
1c230 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  API will need to
1c240 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72   change to retur
1c250 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a  n an error code.
1c260 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20    ** as well as 
1c270 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75  the boolean resu
1c280 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20  lt value..  */. 
1c290 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f   return (CURSOR_
1c2a0 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74  VALID!=pCur->eSt
1c2b0 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ate);.}../*.** A
1c2c0 64 76 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f  dvance the curso
1c2d0 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e  r to the next en
1c2e0 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
1c2f0 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63  ase.  If.** succ
1c300 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20  essful then set 
1c310 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65  *pRes=0.  If the
1c320 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61   cursor.** was a
1c330 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
1c340 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
1c350 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
1c360 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73  e before.** this
1c370 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
1c380 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70  led, then set *p
1c390 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71  Res=1..*/.int sq
1c3a0 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 42  lite3BtreeNext(B
1c3b0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
1c3c0 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
1c3d0 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
1c3e0 70 50 61 67 65 3b 0a 0a 20 20 72 63 20 3d 20 72  pPage;..  rc = r
1c3f0 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72  estoreOrClearCur
1c400 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
1c410 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1c420 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
1c430 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
1c440 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29  ssert( pRes!=0 )
1c450 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ;.  pPage = pCur
1c460 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66 28 20 43  ->pPage;.  if( C
1c470 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
1c480 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
1c490 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
1c4a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c4b0 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  OK;.  }.  if( pC
1c4c0 75 72 2d 3e 73 6b 69 70 3e 30 20 29 7b 0a 20 20  ur->skip>0 ){.  
1c4d0 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30    pCur->skip = 0
1c4e0 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b  ;.    *pRes = 0;
1c4f0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1c500 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75  TE_OK;.  }.  pCu
1c510 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 0a 20 20  r->skip = 0;..  
1c520 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
1c530 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72  sInit );.  asser
1c540 74 28 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61  t( pCur->idx<pPa
1c550 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20  ge->nCell );..  
1c560 70 43 75 72 2d 3e 69 64 78 2b 2b 3b 0a 20 20 70  pCur->idx++;.  p
1c570 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
1c580 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  = 0;.  if( pCur-
1c590 3e 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65  >idx>=pPage->nCe
1c5a0 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70  ll ){.    if( !p
1c5b0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1c5c0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
1c5d0 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62  hild(pCur, get4b
1c5e0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
1c5f0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
1c600 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69  et+8]));.      i
1c610 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1c620 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f  c;.      rc = mo
1c630 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
1c640 72 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20  r);.      *pRes 
1c650 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
1c660 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1c670 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73  do{.      if( is
1c680 52 6f 6f 74 50 61 67 65 28 70 50 61 67 65 29 20  RootPage(pPage) 
1c690 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  ){.        *pRes
1c6a0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43   = 1;.        pC
1c6b0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
1c6c0 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
1c6d0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1c6e0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
1c6f0 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e       moveToParen
1c700 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70  t(pCur);.      p
1c710 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
1c720 67 65 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  ge;.    }while( 
1c730 70 43 75 72 2d 3e 69 64 78 3e 3d 70 50 61 67 65  pCur->idx>=pPage
1c740 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 2a  ->nCell );.    *
1c750 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 69 66  pRes = 0;.    if
1c760 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74  ( pPage->leafDat
1c770 61 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  a ){.      rc = 
1c780 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
1c790 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20  (pCur, pRes);.  
1c7a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1c7b0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1c7c0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
1c7d0 72 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20  rc;.  }.  *pRes 
1c7e0 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65  = 0;.  if( pPage
1c7f0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65  ->leaf ){.    re
1c800 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1c810 20 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54    }.  rc = moveT
1c820 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
1c830 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1c840 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20  ./*.** Step the 
1c850 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61  cursor to the ba
1c860 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f  ck to the previo
1c870 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  us entry in the 
1c880 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a  database.  If.**
1c890 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e   successful then
1c8a0 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49   set *pRes=0.  I
1c8b0 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  f the cursor.** 
1c8c0 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e  was already poin
1c8d0 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73  ting to the firs
1c8e0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
1c8f0 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a  atabase before.*
1c900 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * this routine w
1c910 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  as called, then 
1c920 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a  set *pRes=1..*/.
1c930 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1c940 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f  Previous(BtCurso
1c950 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
1c960 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
1c970 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 4d 65   Pgno pgno;.  Me
1c980 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
1c990 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43   rc = restoreOrC
1c9a0 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
1c9b0 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
1c9c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1c9d0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1c9e0 20 20 7d 0a 20 20 69 66 28 20 43 55 52 53 4f 52    }.  if( CURSOR
1c9f0 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
1ca00 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70  eState ){.    *p
1ca10 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Res = 1;.    ret
1ca20 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1ca30 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73   }.  if( pCur->s
1ca40 6b 69 70 3c 30 20 29 7b 0a 20 20 20 20 70 43 75  kip<0 ){.    pCu
1ca50 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20  r->skip = 0;.   
1ca60 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
1ca70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1ca80 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b  ;.  }.  pCur->sk
1ca90 69 70 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65  ip = 0;..  pPage
1caa0 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
1cab0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
1cac0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73  >isInit );.  ass
1cad0 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d  ert( pCur->idx>=
1cae0 30 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  0 );.  if( !pPag
1caf0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70  e->leaf ){.    p
1cb00 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 20  gno = get4byte( 
1cb10 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
1cb20 70 43 75 72 2d 3e 69 64 78 29 20 29 3b 0a 20 20  pCur->idx) );.  
1cb30 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
1cb40 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
1cb50 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
1cb60 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  urn rc;.    rc =
1cb70 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
1cb80 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pCur);.  }else{
1cb90 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75 72  .    while( pCur
1cba0 2d 3e 69 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20  ->idx==0 ){.    
1cbb0 20 20 69 66 28 20 69 73 52 6f 6f 74 50 61 67 65    if( isRootPage
1cbc0 28 70 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20  (pPage) ){.     
1cbd0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
1cbe0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
1cbf0 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20  ;.        *pRes 
1cc00 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 1;.        ret
1cc10 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1cc20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76       }.      mov
1cc30 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b  eToParent(pCur);
1cc40 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70  .      pPage = p
1cc50 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20  Cur->pPage;.    
1cc60 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 64 78 2d  }.    pCur->idx-
1cc70 2d 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66  -;.    pCur->inf
1cc80 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  o.nSize = 0;.   
1cc90 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
1cca0 44 61 74 61 20 26 26 20 21 70 50 61 67 65 2d 3e  Data && !pPage->
1ccb0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
1ccc0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
1ccd0 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52  revious(pCur, pR
1cce0 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  es);.    }else{.
1ccf0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1cd00 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
1cd10 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 72    *pRes = 0;.  r
1cd20 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1cd30 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
1cd40 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  w page from the 
1cd50 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1cd60 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67  *.** The new pag
1cd70 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64  e is marked as d
1cd80 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72  irty.  (In other
1cd90 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50   words, sqlite3P
1cda0 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68  agerWrite().** h
1cdb0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1cdc0 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65  called on the ne
1cdd0 77 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65  w page.)  The ne
1cde0 77 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a  w page has also.
1cdf0 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63  ** been referenc
1ce00 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69  ed and the calli
1ce10 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65  ng routine is re
1ce20 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61  sponsible for ca
1ce30 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  lling.** sqlite3
1ce40 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20  PagerUnref() on 
1ce50 74 68 65 20 6e 65 77 20 70 61 67 65 20 77 68 65  the new page whe
1ce60 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a  n it is done..**
1ce70 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
1ce80 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
1ce90 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72  cess.  Any other
1cea0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e   return value in
1ceb0 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72  dicates.** an er
1cec0 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 61 6e  ror.  *ppPage an
1ced0 64 20 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e 64  d *pPgno are und
1cee0 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 65 76  efined in the ev
1cef0 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e  ent of an error.
1cf00 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b  .** Do not invok
1cf10 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  e sqlite3PagerUn
1cf20 72 65 66 28 29 20 6f 6e 20 2a 70 70 50 61 67 65  ref() on *ppPage
1cf30 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   if an error is 
1cf40 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
1cf50 49 66 20 74 68 65 20 22 6e 65 61 72 62 79 22 20  If the "nearby" 
1cf60 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
1cf70 20 30 2c 20 74 68 65 6e 20 61 20 28 66 65 65 62   0, then a (feeb
1cf80 6c 65 29 20 65 66 66 6f 72 74 20 69 73 20 6d 61  le) effort is ma
1cf90 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65  de to .** locate
1cfa0 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f   a page close to
1cfb0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
1cfc0 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73   "nearby".  This
1cfd0 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20   can be used in 
1cfe0 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f  an.** attempt to
1cff0 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70 61   keep related pa
1d000 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63  ges close to eac
1d010 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64  h other in the d
1d020 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a  atabase file,.**
1d030 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63   which in turn c
1d040 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65  an make database
1d050 20 61 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a   access faster..
1d060 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 65 78  **.** If the "ex
1d070 61 63 74 22 20 70 61 72 61 6d 65 74 65 72 20 69  act" parameter i
1d080 73 20 6e 6f 74 20 30 2c 20 61 6e 64 20 74 68 65  s not 0, and the
1d090 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 6e 65 61   page-number nea
1d0a0 72 62 79 20 65 78 69 73 74 73 20 0a 2a 2a 20 61  rby exists .** a
1d0b0 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66  nywhere on the f
1d0c0 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69  ree-list, then i
1d0d0 74 20 69 73 20 67 75 61 72 65 6e 74 65 65 64 20  t is guarenteed 
1d0e0 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20  to be returned. 
1d0f0 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  This.** is only 
1d100 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63  used by auto-vac
1d110 75 75 6d 20 64 61 74 61 62 61 73 65 73 20 77 68  uum databases wh
1d120 65 6e 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20  en allocating a 
1d130 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  new table..*/.st
1d140 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
1d150 65 42 74 72 65 65 50 61 67 65 28 0a 20 20 42 74  eBtreePage(.  Bt
1d160 53 68 61 72 65 64 20 2a 70 42 74 2c 20 0a 20 20  Shared *pBt, .  
1d170 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
1d180 2c 20 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  , .  Pgno *pPgno
1d190 2c 20 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79  , .  Pgno nearby
1d1a0 2c 0a 20 20 75 38 20 65 78 61 63 74 0a 29 7b 0a  ,.  u8 exact.){.
1d1b0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1d1c0 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  1;.  int rc;.  i
1d1d0 6e 74 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  nt n;     /* Num
1d1e0 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
1d1f0 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a  the freelist */.
1d200 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 2f 2a 20    int k;     /* 
1d210 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73  Number of leaves
1d220 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66   on the trunk of
1d230 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f   the freelist */
1d240 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75  .  MemPage *pTru
1d250 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  nk = 0;.  MemPag
1d260 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20  e *pPrevTrunk = 
1d270 30 3b 0a 0a 20 20 70 50 61 67 65 31 20 3d 20 70  0;..  pPage1 = p
1d280 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6e 20  Bt->pPage1;.  n 
1d290 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
1d2a0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
1d2b0 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20    if( n>0 ){.   
1d2c0 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70 61   /* There are pa
1d2d0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
1d2e0 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20  ist.  Reuse one 
1d2f0 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20  of those pages. 
1d300 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75  */.    Pgno iTru
1d310 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63  nk;.    u8 searc
1d320 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66  hList = 0; /* If
1d330 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d   the free-list m
1d340 75 73 74 20 62 65 20 73 65 61 72 63 68 65 64 20  ust be searched 
1d350 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a  for 'nearby' */.
1d360 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74      .    /* If t
1d370 68 65 20 27 65 78 61 63 74 27 20 70 61 72 61 6d  he 'exact' param
1d380 65 74 65 72 20 77 61 73 20 74 72 75 65 20 61 6e  eter was true an
1d390 64 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65  d a query of the
1d3a0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20   pointer-map.   
1d3b0 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74   ** shows that t
1d3c0 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27  he page 'nearby'
1d3d0 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e   is somewhere on
1d3e0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
1d3f0 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  then.    ** the 
1d400 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c  entire-list will
1d410 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72   be searched for
1d420 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20   that page..    
1d430 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1d440 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1d450 4d 0a 20 20 20 20 69 66 28 20 65 78 61 63 74 20  M.    if( exact 
1d460 29 7b 0a 20 20 20 20 20 20 75 38 20 65 54 79 70  ){.      u8 eTyp
1d470 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
1d480 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20   nearby>0 );.   
1d490 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
1d4a0 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20  autoVacuum );.  
1d4b0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
1d4c0 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20  et(pBt, nearby, 
1d4d0 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20  &eType, 0);.    
1d4e0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1d4f0 6e 20 72 63 3b 0a 20 20 20 20 20 20 69 66 28 20  n rc;.      if( 
1d500 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
1d510 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
1d520 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31    searchList = 1
1d530 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d540 2a 70 50 67 6e 6f 20 3d 20 6e 65 61 72 62 79 3b  *pPgno = nearby;
1d550 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
1d560 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
1d570 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f  the free-list co
1d580 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69 54  unt by 1. Set iT
1d590 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65  runk to the inde
1d5a0 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  x of the.    ** 
1d5b0 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20  first free-list 
1d5c0 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65  trunk page. iPre
1d5d0 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61  vTrunk is initia
1d5e0 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20  lly 1..    */.  
1d5f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1d600 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
1d610 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
1d620 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1d630 63 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  c;.    put4byte(
1d640 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
1d650 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f  6], n-1);..    /
1d660 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74 68 69  * The code withi
1d670 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72  n this loop is r
1d680 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20  un only once if 
1d690 74 68 65 20 27 73 65 61 72 63 68 4c 69 73 74 27  the 'searchList'
1d6a0 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a   variable.    **
1d6b0 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74   is not true. Ot
1d6c0 68 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73  herwise, it runs
1d6d0 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74   once for each t
1d6e0 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65  runk-page on the
1d6f0 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73  .    ** free-lis
1d700 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65  t until the page
1d710 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63   'nearby' is loc
1d720 61 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ated..    */.   
1d730 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65   do {.      pPre
1d740 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b  vTrunk = pTrunk;
1d750 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76  .      if( pPrev
1d760 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
1d770 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
1d780 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
1d790 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20  aData[0]);.     
1d7a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1d7b0 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
1d7c0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1d7d0 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  [32]);.      }. 
1d7e0 20 20 20 20 20 72 63 20 3d 20 67 65 74 50 61 67       rc = getPag
1d7f0 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26  e(pBt, iTrunk, &
1d800 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  pTrunk, 0);.    
1d810 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1d820 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
1d830 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1d840 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
1d850 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 6b        }..      k
1d860 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
1d870 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a  unk->aData[4]);.
1d880 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26        if( k==0 &
1d890 26 20 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b  & !searchList ){
1d8a0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
1d8b0 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61  trunk has no lea
1d8c0 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74  ves and the list
1d8d0 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65   is not being se
1d8e0 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20  arched. .       
1d8f0 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74   ** So extract t
1d900 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74  he trunk page it
1d910 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20  self and use it 
1d920 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20  as the newly .  
1d930 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74        ** allocat
1d940 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ed page */.     
1d950 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65 76     assert( pPrev
1d960 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  Trunk==0 );.    
1d970 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1d980 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
1d990 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
1d9a0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
1d9b0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
1d9c0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
1d9d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1d9e0 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75     *pPgno = iTru
1d9f0 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  nk;.        memc
1da00 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  py(&pPage1->aDat
1da10 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  a[32], &pTrunk->
1da20 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
1da30 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
1da40 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  pTrunk;.        
1da50 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pTrunk = 0;.    
1da60 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
1da70 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d  CATE: %d trunk -
1da80 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c   %d free pages l
1da90 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20  eft\n", *pPgno, 
1daa0 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  n-1));.      }el
1dab0 73 65 20 69 66 28 20 6b 3e 70 42 74 2d 3e 75 73  se if( k>pBt->us
1dac0 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29  ableSize/4 - 8 )
1dad0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c  {.        /* Val
1dae0 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f  ue of k is out o
1daf0 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61  f range.  Databa
1db00 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  se corruption */
1db10 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1db20 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1db30 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  T;.        goto 
1db40 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
1db50 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e;.#ifndef SQLIT
1db60 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1db70 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  M.      }else if
1db80 28 20 73 65 61 72 63 68 4c 69 73 74 20 26 26 20  ( searchList && 
1db90 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 29  nearby==iTrunk )
1dba0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
1dbb0 20 6c 69 73 74 20 69 73 20 62 65 69 6e 67 20 73   list is being s
1dbc0 65 61 72 63 68 65 64 20 61 6e 64 20 74 68 69 73  earched and this
1dbd0 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74   trunk page is t
1dbe0 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
1dbf0 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20  ** to allocate, 
1dc00 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  regardless of wh
1dc10 65 74 68 65 72 20 69 74 20 68 61 73 20 6c 65 61  ether it has lea
1dc20 76 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ves..        */.
1dc30 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1dc40 2a 70 50 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29  *pPgno==iTrunk )
1dc50 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67  ;.        *ppPag
1dc60 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  e = pTrunk;.    
1dc70 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
1dc80 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
1dc90 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1dca0 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
1dcb0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
1dcc0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
1dcd0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
1dce0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
1dcf0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b   }.        if( k
1dd00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1dd10 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b   if( !pPrevTrunk
1dd20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1dd30 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e  memcpy(&pPage1->
1dd40 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75  aData[32], &pTru
1dd50 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
1dd60 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
1dd70 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  e{.            m
1dd80 65 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e  emcpy(&pPrevTrun
1dd90 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54  k->aData[0], &pT
1dda0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
1ddb0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  4);.          }.
1ddc0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1ddd0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1dde0 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65  trunk page is re
1ddf0 71 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61  quired by the ca
1de00 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74  ller but it cont
1de10 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20  ains .          
1de20 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66  ** pointers to f
1de30 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e  ree-list leaves.
1de40 20 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20   The first leaf 
1de50 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a  becomes a trunk.
1de60 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67            ** pag
1de70 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  e in this case..
1de80 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
1de90 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
1dea0 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20  pNewTrunk;.     
1deb0 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72       Pgno iNewTr
1dec0 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
1ded0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d  pTrunk->aData[8]
1dee0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
1def0 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c 20 69  = getPage(pBt, i
1df00 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54  NewTrunk, &pNewT
1df10 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  runk, 0);.      
1df20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1df30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1df40 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
1df50 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
1df60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1df70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1df80 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 54 72  agerWrite(pNewTr
1df90 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
1dfa0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1dfb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1dfc0 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
1dfd0 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29  ePage(pNewTrunk)
1dfe0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
1dff0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
1e000 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
1e010 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  }.          memc
1e020 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  py(&pNewTrunk->a
1e030 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b  Data[0], &pTrunk
1e040 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
1e050 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
1e060 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  te(&pNewTrunk->a
1e070 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20  Data[4], k-1);. 
1e080 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
1e090 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74  &pNewTrunk->aDat
1e0a0 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[8], &pTrunk->a
1e0b0 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a  Data[12], (k-1)*
1e0c0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  4);.          re
1e0d0 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72  leasePage(pNewTr
1e0e0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
1e0f0 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20  if( !pPrevTrunk 
1e100 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
1e110 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
1e120 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77  >aData[32], iNew
1e130 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
1e140 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1e150 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1e160 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65  3PagerWrite(pPre
1e170 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  vTrunk->pDbPage)
1e180 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
1e190 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
1e1a0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
1e1b0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
1e1c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1e1d0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
1e1e0 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
1e1f0 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e  ata[0], iNewTrun
1e200 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  k);.          }.
1e210 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e220 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
1e230 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
1e240 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b  LOCATE: %d trunk
1e250 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73   - %d free pages
1e260 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f   left\n", *pPgno
1e270 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  , n-1));.#endif.
1e280 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1e290 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20       /* Extract 
1e2a0 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20  a leaf from the 
1e2b0 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20  trunk */.       
1e2c0 20 69 6e 74 20 63 6c 6f 73 65 73 74 3b 0a 20 20   int closest;.  
1e2d0 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65        Pgno iPage
1e2e0 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e  ;.        unsign
1e2f0 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d  ed char *aData =
1e300 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a   pTrunk->aData;.
1e310 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1e320 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1e330 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
1e340 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
1e350 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
1e360 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
1e370 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
1e380 20 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62         if( nearb
1e390 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  y>0 ){.         
1e3a0 20 69 6e 74 20 69 2c 20 64 69 73 74 3b 0a 20 20   int i, dist;.  
1e3b0 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
1e3c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64  = 0;.          d
1e3d0 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28 26  ist = get4byte(&
1e3e0 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72  aData[8]) - near
1e3f0 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  by;.          if
1e400 28 20 64 69 73 74 3c 30 20 29 20 64 69 73 74 20  ( dist<0 ) dist 
1e410 3d 20 2d 64 69 73 74 3b 0a 20 20 20 20 20 20 20  = -dist;.       
1e420 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b     for(i=1; i<k;
1e430 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
1e440 20 20 20 69 6e 74 20 64 32 20 3d 20 67 65 74 34     int d2 = get4
1e450 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a  byte(&aData[8+i*
1e460 34 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20  4]) - nearby;.  
1e470 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32            if( d2
1e480 3c 30 20 29 20 64 32 20 3d 20 2d 64 32 3b 0a 20  <0 ) d2 = -d2;. 
1e490 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64             if( d
1e4a0 32 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20  2<dist ){.      
1e4b0 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
1e4c0 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = i;.           
1e4d0 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20     dist = d2;.  
1e4e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1e4f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e500 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1e510 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20   closest = 0;.  
1e520 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
1e530 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74   iPage = get4byt
1e540 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65  e(&aData[8+close
1e550 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20  st*4]);.        
1e560 69 66 28 20 21 73 65 61 72 63 68 4c 69 73 74 20  if( !searchList 
1e570 7c 7c 20 69 50 61 67 65 3d 3d 6e 65 61 72 62 79  || iPage==nearby
1e580 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   ){.          *p
1e590 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20  Pgno = iPage;.  
1e5a0 20 20 20 20 20 20 20 20 69 66 28 20 2a 70 50 67          if( *pPg
1e5b0 6e 6f 3e 73 71 6c 69 74 65 33 50 61 67 65 72 50  no>sqlite3PagerP
1e5c0 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
1e5d0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
1e5e0 20 20 20 20 20 2f 2a 20 46 72 65 65 20 70 61 67       /* Free pag
1e5f0 65 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66  e off the end of
1e600 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20   the file */.   
1e610 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1e620 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1e630 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  KPT;.          }
1e640 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45  .          TRACE
1e650 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
1e660 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25  was leaf %d of %
1e670 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20  d on trunk %d". 
1e680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e690 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20  ": %d more free 
1e6a0 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20  pages\n",.      
1e6b0 20 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e             *pPgn
1e6c0 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c  o, closest+1, k,
1e6d0 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e   pTrunk->pgno, n
1e6e0 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1));.          
1e6f0 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20  if( closest<k-1 
1e700 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
1e710 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63  emcpy(&aData[8+c
1e720 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74  losest*4], &aDat
1e730 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20  a[4+k*4], 4);.  
1e740 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e750 20 20 20 20 70 75 74 34 62 79 74 65 28 26 61 44      put4byte(&aD
1e760 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20  ata[4], k-1);.  
1e770 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74          rc = get
1e780 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f  Page(pBt, *pPgno
1e790 2c 20 70 70 50 61 67 65 2c 20 31 29 3b 0a 20 20  , ppPage, 1);.  
1e7a0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1e7b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e7c0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1e7d0 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63  PagerDontRollbac
1e7e0 6b 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  k((*ppPage)->pDb
1e7f0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1e800 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1e810 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61  agerWrite((*ppPa
1e820 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge)->pDbPage);. 
1e830 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
1e840 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1e850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1e860 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
1e870 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
1e880 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
1e890 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
1e8a0 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
1e8b0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1e8c0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65  releasePage(pPre
1e8d0 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70  vTrunk);.      p
1e8e0 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  PrevTrunk = 0;. 
1e8f0 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63     }while( searc
1e900 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65  hList );.  }else
1e910 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61  {.    /* There a
1e920 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74  re no pages on t
1e930 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20  he freelist, so 
1e940 63 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67  create a new pag
1e950 65 20 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  e at the.    ** 
1e960 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
1e970 2a 2f 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20  */.    *pPgno = 
1e980 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
1e990 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
1e9a0 72 29 20 2b 20 31 3b 0a 0a 23 69 66 6e 64 65 66  r) + 1;..#ifndef
1e9b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1e9c0 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
1e9d0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
1e9e0 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  && PTRMAP_ISPAGE
1e9f0 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 20 29 7b  (pBt, *pPgno) ){
1ea00 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50  .      /* If *pP
1ea10 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20  gno refers to a 
1ea20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
1ea30 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e  , allocate two n
1ea40 65 77 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a  ew pages.      *
1ea50 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
1ea60 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64  the file instead
1ea70 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72   of one. The fir
1ea80 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  st allocated pag
1ea90 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d  e.      ** becom
1eaa0 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72  es a new pointer
1eab0 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65 20 73  -map page, the s
1eac0 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79  econd is used by
1ead0 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20   the caller..   
1eae0 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 52 41 43     */.      TRAC
1eaf0 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
1eb00 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c   from end of fil
1eb10 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  e (pointer-map p
1eb20 61 67 65 29 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29  age)\n", *pPgno)
1eb30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1eb40 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47   *pPgno!=PENDING
1eb50 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1eb60 29 3b 0a 20 20 20 20 20 20 28 2a 70 50 67 6e 6f  );.      (*pPgno
1eb70 29 2b 2b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  )++;.    }.#endi
1eb80 66 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a  f..    assert( *
1eb90 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42  pPgno!=PENDING_B
1eba0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
1ebb0 0a 20 20 20 20 72 63 20 3d 20 67 65 74 50 61 67  .    rc = getPag
1ebc0 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70  e(pBt, *pPgno, p
1ebd0 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69  pPage, 0);.    i
1ebe0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1ebf0 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  c;.    rc = sqli
1ec00 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a  te3PagerWrite((*
1ec10 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
1ec20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1ec30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ec40 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
1ec50 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
1ec60 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
1ec70 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20  TE: %d from end 
1ec80 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67  of file\n", *pPg
1ec90 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  no));.  }..  ass
1eca0 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e  ert( *pPgno!=PEN
1ecb0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1ecc0 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f  Bt) );..end_allo
1ecd0 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c  cate_page:.  rel
1ece0 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29  easePage(pTrunk)
1ecf0 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
1ed00 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 72  pPrevTrunk);.  r
1ed10 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1ed20 2a 2a 20 41 64 64 20 61 20 70 61 67 65 20 6f 66  ** Add a page of
1ed30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1ed40 6c 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  le to the freeli
1ed50 73 74 2e 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65  st..**.** sqlite
1ed60 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 69 73  3PagerUnref() is
1ed70 20 4e 4f 54 20 63 61 6c 6c 65 64 20 66 6f 72 20   NOT called for 
1ed80 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  pPage..*/.static
1ed90 20 69 6e 74 20 66 72 65 65 50 61 67 65 28 4d 65   int freePage(Me
1eda0 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
1edb0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1edc0 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 4d   pPage->pBt;.  M
1edd0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d  emPage *pPage1 =
1ede0 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
1edf0 69 6e 74 20 72 63 2c 20 6e 2c 20 6b 3b 0a 0a 20  int rc, n, k;.. 
1ee00 20 2f 2a 20 50 72 65 70 61 72 65 20 74 68 65 20   /* Prepare the 
1ee10 70 61 67 65 20 66 6f 72 20 66 72 65 65 69 6e 67  page for freeing
1ee20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
1ee30 61 67 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20  age->pgno>1 );. 
1ee40 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
1ee50 20 30 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67   0;.  releasePag
1ee60 65 28 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  e(pPage->pParent
1ee70 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 50 61 72  );.  pPage->pPar
1ee80 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49  ent = 0;..  /* I
1ee90 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65  ncrement the fre
1eea0 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20  e page count on 
1eeb0 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d  pPage1 */.  rc =
1eec0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1eed0 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  te(pPage1->pDbPa
1eee0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
1eef0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6e 20 3d  return rc;.  n =
1ef00 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
1ef10 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
1ef20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
1ef30 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2b  1->aData[36], n+
1ef40 31 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  1);..#ifdef SQLI
1ef50 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
1ef60 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 53 51 4c  .  /* If the SQL
1ef70 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  ITE_SECURE_DELET
1ef80 45 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  E compile-time o
1ef90 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ption is enabled
1efa0 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6c 77 61  , then.  ** alwa
1efb0 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69  ys fully overwri
1efc0 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72  te deleted infor
1efd0 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f  mation with zero
1efe0 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  s..  */.  rc = s
1eff0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1f000 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
1f010 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
1f020 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 73 65 74  urn rc;.  memset
1f030 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30  (pPage->aData, 0
1f040 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61  , pPage->pBt->pa
1f050 67 65 53 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a  geSize);.#endif.
1f060 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1f070 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1f080 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
1f090 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
1f0a0 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65  to-vacuum, write
1f0b0 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
1f0c0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a   pointer-map.  *
1f0d0 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  * to indicate th
1f0e0 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66  at the page is f
1f0f0 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ree..  */.  if( 
1f100 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
1f110 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d  ){.    rc = ptrm
1f120 61 70 50 75 74 28 70 42 74 2c 20 70 50 61 67 65  apPut(pBt, pPage
1f130 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 46  ->pgno, PTRMAP_F
1f140 52 45 45 50 41 47 45 2c 20 30 29 3b 0a 20 20 20  REEPAGE, 0);.   
1f150 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1f160 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   rc;.  }.#endif.
1f170 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20  .  if( n==0 ){. 
1f180 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
1f190 65 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67  e first free pag
1f1a0 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  e */.    rc = sq
1f1b0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1f1c0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
1f1d0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
1f1e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6d 65 6d  turn rc;.    mem
1f1f0 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61  set(pPage->aData
1f200 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20 70 75 74  , 0, 8);.    put
1f210 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
1f220 44 61 74 61 5b 33 32 5d 2c 20 70 50 61 67 65 2d  Data[32], pPage-
1f230 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 54 52 41 43  >pgno);.    TRAC
1f240 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25  E(("FREE-PAGE: %
1f250 64 20 66 69 72 73 74 5c 6e 22 2c 20 70 50 61 67  d first\n", pPag
1f260 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c  e->pgno));.  }el
1f270 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 74 68 65 72  se{.    /* Other
1f280 20 66 72 65 65 20 70 61 67 65 73 20 61 6c 72 65   free pages alre
1f290 61 64 79 20 65 78 69 73 74 2e 20 20 52 65 74 72  ady exist.  Retr
1f2a0 69 76 65 20 74 68 65 20 66 69 72 73 74 20 74 72  ive the first tr
1f2b0 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 2a 2a 20  unk page.    ** 
1f2c0 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  of the freelist 
1f2d0 61 6e 64 20 66 69 6e 64 20 6f 75 74 20 68 6f 77  and find out how
1f2e0 20 6d 61 6e 79 20 6c 65 61 76 65 73 20 69 74 20   many leaves it 
1f2f0 68 61 73 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50  has. */.    MemP
1f300 61 67 65 20 2a 70 54 72 75 6e 6b 3b 0a 20 20 20  age *pTrunk;.   
1f310 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70 42   rc = getPage(pB
1f320 74 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61  t, get4byte(&pPa
1f330 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 2c  ge1->aData[32]),
1f340 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20   &pTrunk, 0);.  
1f350 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1f360 6e 20 72 63 3b 0a 20 20 20 20 6b 20 3d 20 67 65  n rc;.    k = ge
1f370 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
1f380 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 69  aData[4]);.    i
1f390 66 28 20 6b 3e 3d 70 42 74 2d 3e 75 73 61 62 6c  f( k>=pBt->usabl
1f3a0 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20  eSize/4 - 8 ){. 
1f3b0 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e       /* The trun
1f3c0 6b 20 69 73 20 66 75 6c 6c 2e 20 20 54 75 72 6e  k is full.  Turn
1f3d0 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   the page being 
1f3e0 66 72 65 65 64 20 69 6e 74 6f 20 61 20 6e 65 77  freed into a new
1f3f0 0a 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 6b 20  .      ** trunk 
1f400 70 61 67 65 20 77 69 74 68 20 6e 6f 20 6c 65 61  page with no lea
1f410 76 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63  ves. */.      rc
1f420 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1f430 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
1f440 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
1f450 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1f460 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
1f470 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 70 54 72  Page->aData, pTr
1f480 75 6e 6b 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  unk->pgno);.    
1f490 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
1f4a0 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b  e->aData[4], 0);
1f4b0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
1f4c0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
1f4d0 32 5d 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  2], pPage->pgno)
1f4e0 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  ;.      TRACE(("
1f4f0 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65  FREE-PAGE: %d ne
1f500 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70  w trunk page rep
1f510 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 0a 20 20  lacing %d\n",.  
1f520 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
1f530 65 2d 3e 70 67 6e 6f 2c 20 70 54 72 75 6e 6b 2d  e->pgno, pTrunk-
1f540 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c  >pgno));.    }el
1f550 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 64  se{.      /* Add
1f560 20 74 68 65 20 6e 65 77 6c 79 20 66 72 65 65 64   the newly freed
1f570 20 70 61 67 65 20 61 73 20 61 20 6c 65 61 66 20   page as a leaf 
1f580 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  on the current t
1f590 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63  runk */.      rc
1f5a0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1f5b0 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
1f5c0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
1f5d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1f5e0 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  {.        put4by
1f5f0 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
1f600 61 5b 34 5d 2c 20 6b 2b 31 29 3b 0a 20 20 20 20  a[4], k+1);.    
1f610 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54      put4byte(&pT
1f620 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6b 2a  runk->aData[8+k*
1f630 34 5d 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  4], pPage->pgno)
1f640 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1f650 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20  _SECURE_DELETE. 
1f660 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
1f670 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61  gerDontWrite(pPa
1f680 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 23 65  ge->pDbPage);.#e
1f690 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20  ndif.      }.   
1f6a0 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d     TRACE(("FREE-
1f6b0 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e  PAGE: %d leaf on
1f6c0 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e   trunk page %d\n
1f6d0 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54  ",pPage->pgno,pT
1f6e0 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  runk->pgno));.  
1f6f0 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 50    }.    releaseP
1f700 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 7d  age(pTrunk);.  }
1f710 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1f720 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20  ./*.** Free any 
1f730 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
1f740 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
1f750 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a  he given Cell..*
1f760 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65  /.static int cle
1f770 61 72 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a  arCell(MemPage *
1f780 70 50 61 67 65 2c 20 75 6e 73 69 67 6e 65 64 20  pPage, unsigned 
1f790 63 68 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20 20  char *pCell){.  
1f7a0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1f7b0 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65  pPage->pBt;.  Ce
1f7c0 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50  llInfo info;.  P
1f7d0 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20  gno ovflPgno;.  
1f7e0 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f  int rc;.  int nO
1f7f0 76 66 6c 3b 0a 20 20 69 6e 74 20 6f 76 66 6c 50  vfl;.  int ovflP
1f800 61 67 65 53 69 7a 65 3b 0a 0a 20 20 70 61 72 73  ageSize;..  pars
1f810 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
1f820 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
1f830 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
1f840 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  low==0 ){.    re
1f850 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
1f860 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20   /* No overflow 
1f870 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69  pages. Return wi
1f880 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74  thout doing anyt
1f890 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76  hing */.  }.  ov
1f8a0 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  flPgno = get4byt
1f8b0 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
1f8c0 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 6f 76 66  verflow]);.  ovf
1f8d0 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d  lPageSize = pBt-
1f8e0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
1f8f0 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f  .  nOvfl = (info
1f900 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f  .nPayload - info
1f910 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61  .nLocal + ovflPa
1f920 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c  geSize - 1)/ovfl
1f930 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65  PageSize;.  asse
1f940 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20  rt( ovflPgno==0 
1f950 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20  || nOvfl>0 );.  
1f960 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29  while( nOvfl-- )
1f970 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  {.    MemPage *p
1f980 4f 76 66 6c 3b 0a 20 20 20 20 69 66 28 20 6f 76  Ovfl;.    if( ov
1f990 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6f 76 66  flPgno==0 || ovf
1f9a0 6c 50 67 6e 6f 3e 73 71 6c 69 74 65 33 50 61 67  lPgno>sqlite3Pag
1f9b0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
1f9c0 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  >pPager) ){.    
1f9d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f9e0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1f9f0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 67 65 74    }.    rc = get
1fa00 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67  Page(pBt, ovflPg
1fa10 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 6e 4f 76 66  no, &pOvfl, nOvf
1fa20 6c 3d 3d 30 29 3b 0a 20 20 20 20 69 66 28 20 72  l==0);.    if( r
1fa30 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1fa40 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a     if( nOvfl ){.
1fa50 20 20 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d        ovflPgno =
1fa60 20 67 65 74 34 62 79 74 65 28 70 4f 76 66 6c 2d   get4byte(pOvfl-
1fa70 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20  >aData);.    }. 
1fa80 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
1fa90 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 73 71 6c  (pOvfl);.    sql
1faa0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
1fab0 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Ovfl->pDbPage);.
1fac0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
1fad0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65  urn rc;.  }.  re
1fae0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1faf0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
1fb00 74 68 65 20 62 79 74 65 20 73 65 71 75 65 6e 63  the byte sequenc
1fb10 65 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73  e used to repres
1fb20 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61  ent a cell on pa
1fb30 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20  ge pPage.** and 
1fb40 77 72 69 74 65 20 74 68 61 74 20 62 79 74 65 20  write that byte 
1fb50 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43  sequence into pC
1fb60 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77  ell[].  Overflow
1fb70 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c   pages are.** al
1fb80 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c  located and fill
1fb90 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61  ed in as necessa
1fba0 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67  ry.  The calling
1fbb0 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73   procedure.** is
1fbc0 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
1fbd0 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66   making sure suf
1fbe0 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 68 61  ficient space ha
1fbf0 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
1fc00 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e  .** for pCell[].
1fc10 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
1fc20 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20   pCell does not 
1fc30 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64 20 74  necessary need t
1fc40 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70  o point to the p
1fc50 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61  Page->aData.** a
1fc60 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68  rea.  pCell migh
1fc70 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20  t point to some 
1fc80 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67  temporary storag
1fc90 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c  e.  The cell wil
1fca0 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63  l.** be construc
1fcb0 74 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70  ted in this temp
1fcc0 6f 72 61 72 79 20 61 72 65 61 20 74 68 65 6e 20  orary area then 
1fcd0 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67  copied into pPag
1fce0 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65  e->aData.** late
1fcf0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
1fd00 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d   fillInCell(.  M
1fd10 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
1fd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fd30 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
1fd40 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c  ontains the cell
1fd50 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
1fd60 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20  har *pCell,     
1fd70 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65       /* Complete
1fd80 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c   text of the cel
1fd90 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  l */.  const voi
1fda0 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65  d *pKey, i64 nKe
1fdb0 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79  y,    /* The key
1fdc0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
1fdd0 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61 74   *pData,int nDat
1fde0 61 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61  a,   /* The data
1fdf0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a   */.  int *pnSiz
1fe00 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
1fe10 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65       /* Write ce
1fe20 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a  ll size here */.
1fe30 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61  ){.  int nPayloa
1fe40 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  d;.  const u8 *p
1fe50 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c  Src;.  int nSrc,
1fe60 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73 70   n, rc;.  int sp
1fe70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61  aceLeft;.  MemPa
1fe80 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20  ge *pOvfl = 0;. 
1fe90 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c   MemPage *pToRel
1fea0 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69  ease = 0;.  unsi
1feb0 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f  gned char *pPrio
1fec0 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  r;.  unsigned ch
1fed0 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20  ar *pPayload;.  
1fee0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1fef0 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67  pPage->pBt;.  Pg
1ff00 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b  no pgnoOvfl = 0;
1ff10 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a  .  int nHeader;.
1ff20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
1ff30 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74  ..  /* Fill in t
1ff40 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20  he header. */.  
1ff50 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 69  nHeader = 0;.  i
1ff60 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
1ff70 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b  ){.    nHeader +
1ff80 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 4;.  }.  if( p
1ff90 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b  Page->hasData ){
1ffa0 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20  .    nHeader += 
1ffb0 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  putVarint(&pCell
1ffc0 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44 61 74 61  [nHeader], nData
1ffd0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1ffe0 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 0a 20  nData = 0;.  }. 
1fff0 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56   nHeader += putV
20000 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65  arint(&pCell[nHe
20010 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e  ader], *(u64*)&n
20020 4b 65 79 29 3b 0a 20 20 70 61 72 73 65 43 65 6c  Key);.  parseCel
20030 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
20040 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73  l, &info);.  ass
20050 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65 61 64 65  ert( info.nHeade
20060 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b 0a 20 20  r==nHeader );.  
20070 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65  assert( info.nKe
20080 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 61 73 73  y==nKey );.  ass
20090 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61 74 61 3d  ert( info.nData=
200a0 3d 6e 44 61 74 61 20 29 3b 0a 20 20 0a 20 20 2f  =nData );.  .  /
200b0 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61  * Fill in the pa
200c0 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50 61 79 6c  yload */.  nPayl
200d0 6f 61 64 20 3d 20 6e 44 61 74 61 3b 0a 20 20 69  oad = nData;.  i
200e0 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
200f0 20 29 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 70   ){.    pSrc = p
20100 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d  Data;.    nSrc =
20110 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44 61 74   nData;.    nDat
20120 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  a = 0;.  }else{.
20130 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20      nPayload += 
20140 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d  nKey;.    pSrc =
20150 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63 20   pKey;.    nSrc 
20160 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70  = nKey;.  }.  *p
20170 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69  nSize = info.nSi
20180 7a 65 3b 0a 20 20 73 70 61 63 65 4c 65 66 74 20  ze;.  spaceLeft 
20190 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  = info.nLocal;. 
201a0 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65   pPayload = &pCe
201b0 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70  ll[nHeader];.  p
201c0 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69  Prior = &pCell[i
201d0 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a  nfo.iOverflow];.
201e0 0a 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f  .  while( nPaylo
201f0 61 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20  ad>0 ){.    if( 
20200 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a  spaceLeft==0 ){.
20210 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
20220 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
20230 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74       Pgno pgnoPt
20240 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b  rmap = pgnoOvfl;
20250 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67   /* Overflow pag
20260 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
20270 74 72 79 20 70 61 67 65 20 2a 2f 0a 23 65 6e 64  try page */.#end
20280 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c  if.      rc = al
20290 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
202a0 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67  pBt, &pOvfl, &pg
202b0 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c  noOvfl, pgnoOvfl
202c0 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  , 0);.#ifndef SQ
202d0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
202e0 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66  CUUM.      /* If
202f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75   the database su
20300 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75  pports auto-vacu
20310 75 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f  um, and the seco
20320 6e 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74  nd or subsequent
20330 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  .      ** overfl
20340 6f 77 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  ow page is being
20350 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20   allocated, add 
20360 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20  an entry to the 
20370 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20  pointer-map.    
20380 20 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61    ** for that pa
20390 67 65 20 6e 6f 77 2e 20 54 68 65 20 65 6e 74 72  ge now. The entr
203a0 79 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  y for the first 
203b0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 77 69  overflow page wi
203c0 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 61  ll be.      ** a
203d0 64 64 65 64 20 6c 61 74 65 72 2c 20 62 79 20 74  dded later, by t
203e0 68 65 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 20  he insertCell() 
203f0 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20 20 20 2a  routine..      *
20400 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
20410 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 70  >autoVacuum && p
20420 67 6e 6f 50 74 72 6d 61 70 21 3d 30 20 26 26 20  gnoPtrmap!=0 && 
20430 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
20440 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74  .        rc = pt
20450 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e  rmapPut(pBt, pgn
20460 6f 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56  oOvfl, PTRMAP_OV
20470 45 52 46 4c 4f 57 32 2c 20 70 67 6e 6f 50 74 72  ERFLOW2, pgnoPtr
20480 6d 61 70 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  map);.      }.#e
20490 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 72  ndif.      if( r
204a0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  c ){.        rel
204b0 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
204c0 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ase);.        re
204d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
204e0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
204f0 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c  pPrior, pgnoOvfl
20500 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  );.      release
20510 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
20520 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61  ;.      pToRelea
20530 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20  se = pOvfl;.    
20540 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c    pPrior = pOvfl
20550 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 70  ->aData;.      p
20560 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20  ut4byte(pPrior, 
20570 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c 6f  0);.      pPaylo
20580 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61  ad = &pOvfl->aDa
20590 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70 61  ta[4];.      spa
205a0 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75 73  ceLeft = pBt->us
205b0 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
205c0 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79    }.    n = nPay
205d0 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e  load;.    if( n>
205e0 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20  spaceLeft ) n = 
205f0 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 20 20 69  spaceLeft;.    i
20600 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20  f( n>nSrc ) n = 
20610 6e 53 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74  nSrc;.    assert
20620 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20 6d 65  ( pSrc );.    me
20630 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70  mcpy(pPayload, p
20640 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 6e 50 61  Src, n);.    nPa
20650 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20  yload -= n;.    
20660 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20  pPayload += n;. 
20670 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20     pSrc += n;.  
20680 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20    nSrc -= n;.   
20690 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b   spaceLeft -= n;
206a0 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3d 3d 30  .    if( nSrc==0
206b0 20 29 7b 0a 20 20 20 20 20 20 6e 53 72 63 20 3d   ){.      nSrc =
206c0 20 6e 44 61 74 61 3b 0a 20 20 20 20 20 20 70 53   nData;.      pS
206d0 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20  rc = pData;.    
206e0 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50  }.  }.  releaseP
206f0 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
20700 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
20710 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  _OK;.}../*.** Ch
20720 61 6e 67 65 20 74 68 65 20 4d 65 6d 50 61 67 65  ange the MemPage
20730 2e 70 50 61 72 65 6e 74 20 70 6f 69 6e 74 65 72  .pParent pointer
20740 20 6f 6e 20 74 68 65 20 70 61 67 65 20 77 68 6f   on the page who
20750 73 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20  se number is.** 
20760 67 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63  given in the sec
20770 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 73 6f 20  ond argument so 
20780 74 68 61 74 20 4d 65 6d 50 61 67 65 2e 70 50 61  that MemPage.pPa
20790 72 65 6e 74 20 68 6f 6c 64 73 20 74 68 65 0a 2a  rent holds the.*
207a0 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65  * pointer in the
207b0 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 2e   third argument.
207c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
207d0 65 70 61 72 65 6e 74 50 61 67 65 28 42 74 53 68  eparentPage(BtSh
207e0 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
207f0 70 67 6e 6f 2c 20 4d 65 6d 50 61 67 65 20 2a 70  pgno, MemPage *p
20800 4e 65 77 50 61 72 65 6e 74 2c 20 69 6e 74 20 69  NewParent, int i
20810 64 78 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  dx){.  MemPage *
20820 70 54 68 69 73 3b 0a 20 20 44 62 50 61 67 65 20  pThis;.  DbPage 
20830 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73  *pDbPage;..  ass
20840 65 72 74 28 20 70 4e 65 77 50 61 72 65 6e 74 21  ert( pNewParent!
20850 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f  =0 );.  if( pgno
20860 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
20870 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
20880 28 20 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30  ( pBt->pPager!=0
20890 20 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20   );.  pDbPage = 
208a0 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
208b0 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  up(pBt->pPager, 
208c0 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62  pgno);.  if( pDb
208d0 50 61 67 65 20 29 7b 0a 20 20 20 20 70 54 68 69  Page ){.    pThi
208e0 73 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73  s = (MemPage *)s
208f0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
20900 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  tra(pDbPage);.  
20910 20 20 69 66 28 20 70 54 68 69 73 2d 3e 69 73 49    if( pThis->isI
20920 6e 69 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73  nit ){.      ass
20930 65 72 74 28 20 70 54 68 69 73 2d 3e 61 44 61 74  ert( pThis->aDat
20940 61 3d 3d 28 73 71 6c 69 74 65 33 50 61 67 65 72  a==(sqlite3Pager
20950 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
20960 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ) );.      if( p
20970 54 68 69 73 2d 3e 70 50 61 72 65 6e 74 21 3d 70  This->pParent!=p
20980 4e 65 77 50 61 72 65 6e 74 20 29 7b 0a 20 20 20  NewParent ){.   
20990 20 20 20 20 20 69 66 28 20 70 54 68 69 73 2d 3e       if( pThis->
209a0 70 50 61 72 65 6e 74 20 29 20 73 71 6c 69 74 65  pParent ) sqlite
209b0 33 50 61 67 65 72 55 6e 72 65 66 28 70 54 68 69  3PagerUnref(pThi
209c0 73 2d 3e 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  s->pParent->pDbP
209d0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 54  age);.        pT
209e0 68 69 73 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70  his->pParent = p
209f0 4e 65 77 50 61 72 65 6e 74 3b 0a 20 20 20 20 20  NewParent;.     
20a00 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
20a10 65 66 28 70 4e 65 77 50 61 72 65 6e 74 2d 3e 70  ef(pNewParent->p
20a20 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d  DbPage);.      }
20a30 0a 20 20 20 20 20 20 70 54 68 69 73 2d 3e 69 64  .      pThis->id
20a40 78 50 61 72 65 6e 74 20 3d 20 69 64 78 3b 0a 20  xParent = idx;. 
20a50 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
20a60 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
20a70 67 65 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  ge);.  }..#ifnde
20a80 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
20a90 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20 70  TOVACUUM.  if( p
20aa0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
20ab0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 74 72  {.    return ptr
20ac0 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
20ad0 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
20ae0 70 4e 65 77 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  pNewParent->pgno
20af0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
20b00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
20b10 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  ;.}..../*.** Cha
20b20 6e 67 65 20 74 68 65 20 70 50 61 72 65 6e 74 20  nge the pParent 
20b30 70 6f 69 6e 74 65 72 20 6f 66 20 61 6c 6c 20 63  pointer of all c
20b40 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 67 65  hildren of pPage
20b50 20 74 6f 20 70 6f 69 6e 74 20 62 61 63 6b 0a 2a   to point back.*
20b60 2a 20 74 6f 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a  * to pPage..**.*
20b70 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  * In other words
20b80 2c 20 66 6f 72 20 65 76 65 72 79 20 63 68 69 6c  , for every chil
20b90 64 20 6f 66 20 70 50 61 67 65 2c 20 69 6e 76 6f  d of pPage, invo
20ba0 6b 65 20 72 65 70 61 72 65 6e 74 50 61 67 65 28  ke reparentPage(
20bb0 29 0a 2a 2a 20 74 6f 20 6d 61 6b 65 20 73 75 72  ).** to make sur
20bc0 65 20 74 68 61 74 20 65 61 63 68 20 63 68 69 6c  e that each chil
20bd0 64 20 6b 6e 6f 77 73 20 74 68 61 74 20 70 50 61  d knows that pPa
20be0 67 65 20 69 73 20 69 74 73 20 70 61 72 65 6e 74  ge is its parent
20bf0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
20c00 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64  tine gets called
20c10 20 61 66 74 65 72 20 79 6f 75 20 6d 65 6d 63 70   after you memcp
20c20 79 28 29 20 6f 6e 65 20 70 61 67 65 20 69 6e 74  y() one page int
20c30 6f 0a 2a 2a 20 61 6e 6f 74 68 65 72 2e 0a 2a 2f  o.** another..*/
20c40 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 70 61  .static int repa
20c50 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73 28 4d  rentChildPages(M
20c60 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
20c70 20 20 69 6e 74 20 69 3b 0a 20 20 42 74 53 68 61    int i;.  BtSha
20c80 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
20c90 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
20ca0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
20cb0 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
20cc0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
20cd0 4f 4b 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  OK;..  for(i=0; 
20ce0 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20  i<pPage->nCell; 
20cf0 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43  i++){.    u8 *pC
20d00 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
20d10 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 69 66  Page, i);.    if
20d20 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
20d30 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 70  {.      rc = rep
20d40 61 72 65 6e 74 50 61 67 65 28 70 42 74 2c 20 67  arentPage(pBt, g
20d50 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 2c 20  et4byte(pCell), 
20d60 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20  pPage, i);.     
20d70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
20d80 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
20d90 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
20da0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
20db0 20 20 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e      rc = reparen
20dc0 74 50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62  tPage(pBt, get4b
20dd0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
20de0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
20df0 65 74 2b 38 5d 29 2c 20 0a 20 20 20 20 20 20 20  et+8]), .       
20e00 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 70  pPage, i);.    p
20e10 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d  Page->idxShift =
20e20 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
20e30 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
20e40 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20 63 65  move the i-th ce
20e50 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 20 20  ll from pPage.  
20e60 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 66 66  This routine eff
20e70 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e  ects pPage only.
20e80 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e  .** The cell con
20e90 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72 65 65  tent is not free
20ea0 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 64  d or deallocated
20eb0 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  .  It is assumed
20ec0 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c   that.** the cel
20ed0 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65  l content has be
20ee0 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c  en copied somepl
20ef0 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69 73 20  ace else.  This 
20f00 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20  routine just.** 
20f10 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65 66 65  removes the refe
20f20 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 65 6c  rence to the cel
20f30 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a  l from pPage..**
20f40 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20 62 65  .** "sz" must be
20f50 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
20f60 79 74 65 73 20 69 6e 20 74 68 65 20 63 65 6c 6c  ytes in the cell
20f70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
20f80 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67   dropCell(MemPag
20f90 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 64  e *pPage, int id
20fa0 78 2c 20 69 6e 74 20 73 7a 29 7b 0a 20 20 69 6e  x, int sz){.  in
20fb0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  t i;          /*
20fc0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
20fd0 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20  .  int pc;      
20fe0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
20ff0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20  cell content of 
21000 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74  cell being delet
21010 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  ed */.  u8 *data
21020 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65  ;       /* pPage
21030 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20  ->aData */.  u8 
21040 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  *ptr;        /* 
21050 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74  Used to move byt
21060 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e  es around within
21070 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 61 73   data[] */..  as
21080 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20  sert( idx>=0 && 
21090 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx<pPage->nCell
210a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a   );.  assert( sz
210b0 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67 65  ==cellSize(pPage
210c0 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73 65  , idx) );.  asse
210d0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
210e0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
210f0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
21100 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
21110 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 64  Data;.  ptr = &d
21120 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  ata[pPage->cellO
21130 66 66 73 65 74 20 2b 20 32 2a 69 64 78 5d 3b 0a  ffset + 2*idx];.
21140 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
21150 70 74 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ptr);.  assert( 
21160 70 63 3e 31 30 20 26 26 20 70 63 2b 73 7a 3c 3d  pc>10 && pc+sz<=
21170 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
21180 6c 65 53 69 7a 65 20 29 3b 0a 20 20 66 72 65 65  leSize );.  free
21190 53 70 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c  Space(pPage, pc,
211a0 20 73 7a 29 3b 0a 20 20 66 6f 72 28 69 3d 69 64   sz);.  for(i=id
211b0 78 2b 31 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43  x+1; i<pPage->nC
211c0 65 6c 6c 3b 20 69 2b 2b 2c 20 70 74 72 2b 3d 32  ell; i++, ptr+=2
211d0 29 7b 0a 20 20 20 20 70 74 72 5b 30 5d 20 3d 20  ){.    ptr[0] = 
211e0 70 74 72 5b 32 5d 3b 0a 20 20 20 20 70 74 72 5b  ptr[2];.    ptr[
211f0 31 5d 20 3d 20 70 74 72 5b 33 5d 3b 0a 20 20 7d  1] = ptr[3];.  }
21200 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d  .  pPage->nCell-
21210 2d 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  -;.  put2byte(&d
21220 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
21230 66 73 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e  fset+3], pPage->
21240 6e 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d  nCell);.  pPage-
21250 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20 70  >nFree += 2;.  p
21260 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d  Page->idxShift =
21270 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73   1;.}../*.** Ins
21280 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f  ert a new cell o
21290 6e 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20  n pPage at cell 
212a0 69 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c  index "i".  pCel
212b0 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a  l points to the.
212c0 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  ** content of th
212d0 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  e cell..**.** If
212e0 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
212f0 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68  t will fit on th
21300 65 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74  e page, then put
21310 20 69 74 20 74 68 65 72 65 2e 20 20 49 66 20 69   it there.  If i
21320 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69  t.** will not fi
21330 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63  t, then make a c
21340 6f 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  opy of the cell 
21350 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65  content into pTe
21360 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69  mp if.** pTemp i
21370 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67  s not null.  Reg
21380 61 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70  ardless of pTemp
21390 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  , allocate a new
213a0 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61   entry.** in pPa
213b0 67 65 2d 3e 61 4f 76 66 6c 5b 5d 20 61 6e 64 20  ge->aOvfl[] and 
213c0 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f  make it point to
213d0 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
213e0 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20  t (either.** in 
213f0 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69  pTemp or the ori
21400 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64  ginal pCell) and
21410 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73   also record its
21420 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f   index. .** Allo
21430 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74  cating a new ent
21440 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65  ry in pPage->aCe
21450 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61  ll[] implies tha
21460 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76  t .** pPage->nOv
21470 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d  erflow is increm
21480 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ented..**.** If 
21490 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  nSkip is non-zer
214a0 6f 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63  o, then do not c
214b0 6f 70 79 20 74 68 65 20 66 69 72 73 74 20 6e 53  opy the first nS
214c0 6b 69 70 20 62 79 74 65 73 20 6f 66 20 74 68 65  kip bytes of the
214d0 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 61  .** cell. The ca
214e0 6c 6c 65 72 20 77 69 6c 6c 20 6f 76 65 72 77 72  ller will overwr
214f0 69 74 65 20 74 68 65 6d 20 61 66 74 65 72 20 74  ite them after t
21500 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
21510 75 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69  urns. If.** nSki
21520 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  p is non-zero, t
21530 68 65 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f  hen pCell may no
21540 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e  t point to an in
21550 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63  valid memory loc
21560 61 74 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70  ation .** (but p
21570 43 65 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c  Cell+nSkip is al
21580 77 61 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a  ways valid)..*/.
21590 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 65 72  static int inser
215a0 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  tCell(.  MemPage
215b0 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61   *pPage,   /* Pa
215c0 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65  ge into which we
215d0 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a   are copying */.
215e0 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20    int i,        
215f0 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20      /* New cell 
21600 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68  becomes the i-th
21610 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67   cell of the pag
21620 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  e */.  u8 *pCell
21630 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74  ,        /* Cont
21640 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63  ent of the new c
21650 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c  ell */.  int sz,
21660 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
21670 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69  tes of content i
21680 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  n pCell */.  u8 
21690 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f  *pTemp,        /
216a0 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73  * Temp storage s
216b0 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20  pace for pCell, 
216c0 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 75  if needed */.  u
216d0 38 20 6e 53 6b 69 70 20 20 20 20 20 20 20 20 20  8 nSkip         
216e0 20 2f 2a 20 44 6f 20 6e 6f 74 20 77 72 69 74 65   /* Do not write
216f0 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70   the first nSkip
21700 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 63 65   bytes of the ce
21710 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ll */.){.  int i
21720 64 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dx;          /* 
21730 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e  Where to write n
21740 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  ew cell content 
21750 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  in data[] */.  i
21760 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  nt j;           
21770 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
21780 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20   */.  int top;  
21790 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
217a0 20 62 79 74 65 20 6f 66 20 63 6f 6e 74 65 6e 74   byte of content
217b0 20 66 6f 72 20 61 6e 79 20 63 65 6c 6c 20 69 6e   for any cell in
217c0 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
217d0 20 65 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f   end;          /
217e0 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73  * First byte pas
217f0 74 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20  t the last cell 
21800 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b  pointer in data[
21810 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 3b 20  ] */.  int ins; 
21820 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
21830 78 20 69 6e 20 64 61 74 61 5b 5d 20 77 68 65 72  x in data[] wher
21840 65 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74  e new cell point
21850 65 72 20 69 73 20 69 6e 73 65 72 74 65 64 20 2a  er is inserted *
21860 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
21870 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
21880 69 6e 74 6f 20 64 61 74 61 5b 5d 20 6f 66 20 74  into data[] of t
21890 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  he page header *
218a0 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73  /.  int cellOffs
218b0 65 74 3b 20 20 20 2f 2a 20 41 64 64 72 65 73 73  et;   /* Address
218c0 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 70   of first cell p
218d0 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d  ointer in data[]
218e0 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
218f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
21900 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68  ontent of the wh
21910 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  ole page */.  u8
21920 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 20 20   *ptr;          
21930 2f 2a 20 55 73 65 64 20 66 6f 72 20 6d 6f 76 69  /* Used for movi
21940 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ng information a
21950 72 6f 75 6e 64 20 69 6e 20 64 61 74 61 5b 5d 20  round in data[] 
21960 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 3e  */..  assert( i>
21970 3d 30 20 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e  =0 && i<=pPage->
21980 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76  nCell+pPage->nOv
21990 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65  erflow );.  asse
219a0 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65  rt( sz==cellSize
219b0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
219c0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
219d0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
219e0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
219f0 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20  bPage) );.  if( 
21a00 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
21a10 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e   || sz+2>pPage->
21a20 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 69 66 28  nFree ){.    if(
21a30 20 70 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20   pTemp ){.      
21a40 6d 65 6d 63 70 79 28 70 54 65 6d 70 2b 6e 53 6b  memcpy(pTemp+nSk
21a50 69 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c  ip, pCell+nSkip,
21a60 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20   sz-nSkip);.    
21a70 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b    pCell = pTemp;
21a80 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70  .    }.    j = p
21a90 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b  Page->nOverflow+
21aa0 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  +;.    assert( j
21ab0 3c 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61  <sizeof(pPage->a
21ac0 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61  Ovfl)/sizeof(pPa
21ad0 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 20 29 3b  ge->aOvfl[0]) );
21ae0 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66  .    pPage->aOvf
21af0 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d 20 70 43 65  l[j].pCell = pCe
21b00 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61  ll;.    pPage->a
21b10 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20 3d 20 69 3b  Ovfl[j].idx = i;
21b20 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
21b30 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 0;.  }else{.
21b40 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65      data = pPage
21b50 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 68 64 72  ->aData;.    hdr
21b60 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
21b70 73 65 74 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67  set;.    top = g
21b80 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
21b90 72 2b 35 5d 29 3b 0a 20 20 20 20 63 65 6c 6c 4f  r+5]);.    cellO
21ba0 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63  ffset = pPage->c
21bb0 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 65  ellOffset;.    e
21bc0 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  nd = cellOffset 
21bd0 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  + 2*pPage->nCell
21be0 20 2b 20 32 3b 0a 20 20 20 20 69 6e 73 20 3d 20   + 2;.    ins = 
21bf0 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69  cellOffset + 2*i
21c00 3b 0a 20 20 20 20 69 66 28 20 65 6e 64 20 3e 20  ;.    if( end > 
21c10 74 6f 70 20 2d 20 73 7a 20 29 7b 0a 20 20 20 20  top - sz ){.    
21c20 20 20 69 6e 74 20 72 63 20 3d 20 64 65 66 72 61    int rc = defra
21c30 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 29  gmentPage(pPage)
21c40 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
21c50 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
21c60 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 74 6f 70  rn rc;.      top
21c70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
21c80 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20  a[hdr+5]);.     
21c90 20 61 73 73 65 72 74 28 20 65 6e 64 20 2b 20 73   assert( end + s
21ca0 7a 20 3c 3d 20 74 6f 70 20 29 3b 0a 20 20 20 20  z <= top );.    
21cb0 7d 0a 20 20 20 20 69 64 78 20 3d 20 61 6c 6c 6f  }.    idx = allo
21cc0 63 61 74 65 53 70 61 63 65 28 70 50 61 67 65 2c  cateSpace(pPage,
21cd0 20 73 7a 29 3b 0a 20 20 20 20 61 73 73 65 72 74   sz);.    assert
21ce0 28 20 69 64 78 3e 30 20 29 3b 0a 20 20 20 20 61  ( idx>0 );.    a
21cf0 73 73 65 72 74 28 20 65 6e 64 20 3c 3d 20 67 65  ssert( end <= ge
21d00 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
21d10 2b 35 5d 29 20 29 3b 0a 20 20 20 20 70 50 61 67  +5]) );.    pPag
21d20 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20  e->nCell++;.    
21d30 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20  pPage->nFree -= 
21d40 32 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  2;.    memcpy(&d
21d50 61 74 61 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c 20  ata[idx+nSkip], 
21d60 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d  pCell+nSkip, sz-
21d70 6e 53 6b 69 70 29 3b 0a 20 20 20 20 66 6f 72 28  nSkip);.    for(
21d80 6a 3d 65 6e 64 2d 32 2c 20 70 74 72 3d 26 64 61  j=end-2, ptr=&da
21d90 74 61 5b 6a 5d 3b 20 6a 3e 69 6e 73 3b 20 6a 2d  ta[j]; j>ins; j-
21da0 3d 32 2c 20 70 74 72 2d 3d 32 29 7b 0a 20 20 20  =2, ptr-=2){.   
21db0 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b     ptr[0] = ptr[
21dc0 2d 32 5d 3b 0a 20 20 20 20 20 20 70 74 72 5b 31  -2];.      ptr[1
21dd0 5d 20 3d 20 70 74 72 5b 2d 31 5d 3b 0a 20 20 20  ] = ptr[-1];.   
21de0 20 7d 0a 20 20 20 20 70 75 74 32 62 79 74 65 28   }.    put2byte(
21df0 26 64 61 74 61 5b 69 6e 73 5d 2c 20 69 64 78 29  &data[ins], idx)
21e00 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
21e10 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61  data[hdr+3], pPa
21e20 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20 20  ge->nCell);.    
21e30 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20  pPage->idxShift 
21e40 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 1;.#ifndef SQL
21e50 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
21e60 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67  UUM.    if( pPag
21e70 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  e->pBt->autoVacu
21e80 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  um ){.      /* T
21e90 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74  he cell may cont
21ea0 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ain a pointer to
21eb0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
21ec0 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a  e. If so, write.
21ed0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74        ** the ent
21ee0 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ry for the overf
21ef0 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68  low page into th
21f00 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20  e pointer map.. 
21f10 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 43 65       */.      Ce
21f20 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
21f30 20 20 20 70 61 72 73 65 43 65 6c 6c 50 74 72 28     parseCellPtr(
21f40 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
21f50 6e 66 6f 29 3b 0a 20 20 20 20 20 20 61 73 73 65  nfo);.      asse
21f60 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b  rt( (info.nData+
21f70 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30  (pPage->intKey?0
21f80 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e  :info.nKey))==in
21f90 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20  fo.nPayload );. 
21fa0 20 20 20 20 20 69 66 28 20 28 69 6e 66 6f 2e 6e       if( (info.n
21fb0 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74  Data+(pPage->int
21fc0 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29  Key?0:info.nKey)
21fd0 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  )>info.nLocal ){
21fe0 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 70 67  .        Pgno pg
21ff0 6e 6f 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  noOvfl = get4byt
22000 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
22010 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20  verflow]);.     
22020 20 20 20 69 6e 74 20 72 63 20 3d 20 70 74 72 6d     int rc = ptrm
22030 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74  apPut(pPage->pBt
22040 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d  , pgnoOvfl, PTRM
22050 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50  AP_OVERFLOW1, pP
22060 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  age->pgno);.    
22070 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
22080 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
22090 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
220a0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 72  .#endif.  }..  r
220b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
220c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
220d0 6c 69 73 74 20 6f 66 20 63 65 6c 6c 73 20 74 6f  list of cells to
220e0 20 61 20 70 61 67 65 2e 20 20 54 68 65 20 70 61   a page.  The pa
220f0 67 65 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69  ge should be ini
22100 74 69 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a  tially empty..**
22110 20 54 68 65 20 63 65 6c 6c 73 20 61 72 65 20 67   The cells are g
22120 75 61 72 61 6e 74 65 65 64 20 74 6f 20 66 69 74  uaranteed to fit
22130 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f   on the page..*/
22140 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73  .static void ass
22150 65 6d 62 6c 65 50 61 67 65 28 0a 20 20 4d 65 6d  emblePage(.  Mem
22160 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f  Page *pPage,   /
22170 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20 62 65  * The page to be
22180 20 61 73 73 65 6d 62 6c 69 65 64 20 2a 2f 0a 20   assemblied */. 
22190 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20   int nCell,     
221a0 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72     /* The number
221b0 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 64 64   of cells to add
221c0 20 74 6f 20 74 68 69 73 20 70 61 67 65 20 2a 2f   to this page */
221d0 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20  .  u8 **apCell, 
221e0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73       /* Pointers
221f0 20 74 6f 20 63 65 6c 6c 20 62 6f 64 69 65 73 20   to cell bodies 
22200 2a 2f 0a 20 20 69 6e 74 20 2a 61 53 69 7a 65 20  */.  int *aSize 
22210 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20         /* Sizes 
22220 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 2a 2f 0a  of the cells */.
22230 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
22240 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
22250 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
22260 74 6f 74 61 6c 53 69 7a 65 3b 20 20 20 20 2f 2a  totalSize;    /*
22270 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 61   Total size of a
22280 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 69 6e  ll cells */.  in
22290 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  t hdr;          
222a0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 70 61 67 65  /* Index of page
222b0 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
222c0 20 63 65 6c 6c 70 74 72 3b 20 20 20 20 20 20 2f   cellptr;      /
222d0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78  * Address of nex
222e0 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  t cell pointer *
222f0 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 62 6f 64 79  /.  int cellbody
22300 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  ;     /* Address
22310 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 62 6f   of next cell bo
22320 64 79 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  dy */.  u8 *data
22330 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  ;         /* Dat
22340 61 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a  a for the page *
22350 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
22360 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
22370 20 29 3b 0a 20 20 74 6f 74 61 6c 53 69 7a 65 20   );.  totalSize 
22380 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
22390 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
223a0 20 20 20 74 6f 74 61 6c 53 69 7a 65 20 2b 3d 20     totalSize += 
223b0 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 7d 0a 20 20  aSize[i];.  }.  
223c0 61 73 73 65 72 74 28 20 74 6f 74 61 6c 53 69 7a  assert( totalSiz
223d0 65 2b 32 2a 6e 43 65 6c 6c 3c 3d 70 50 61 67 65  e+2*nCell<=pPage
223e0 2d 3e 6e 46 72 65 65 20 29 3b 0a 20 20 61 73 73  ->nFree );.  ass
223f0 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
22400 6c 3d 3d 30 20 29 3b 0a 20 20 63 65 6c 6c 70 74  l==0 );.  cellpt
22410 72 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  r = pPage->cellO
22420 66 66 73 65 74 3b 0a 20 20 64 61 74 61 20 3d 20  ffset;.  data = 
22430 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
22440 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
22450 4f 66 66 73 65 74 3b 0a 20 20 70 75 74 32 62 79  Offset;.  put2by
22460 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c  te(&data[hdr+3],
22470 20 6e 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20 6e   nCell);.  if( n
22480 43 65 6c 6c 20 29 7b 0a 20 20 20 20 63 65 6c 6c  Cell ){.    cell
22490 62 6f 64 79 20 3d 20 61 6c 6c 6f 63 61 74 65 53  body = allocateS
224a0 70 61 63 65 28 70 50 61 67 65 2c 20 74 6f 74 61  pace(pPage, tota
224b0 6c 53 69 7a 65 29 3b 0a 20 20 20 20 61 73 73 65  lSize);.    asse
224c0 72 74 28 20 63 65 6c 6c 62 6f 64 79 3e 30 20 29  rt( cellbody>0 )
224d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
224e0 61 67 65 2d 3e 6e 46 72 65 65 20 3e 3d 20 32 2a  age->nFree >= 2*
224f0 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 50 61  nCell );.    pPa
22500 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 32 2a 6e  ge->nFree -= 2*n
22510 43 65 6c 6c 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Cell;.    for(i=
22520 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
22530 7b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65  {.      put2byte
22540 28 26 64 61 74 61 5b 63 65 6c 6c 70 74 72 5d 2c  (&data[cellptr],
22550 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 20 20   cellbody);.    
22560 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63    memcpy(&data[c
22570 65 6c 6c 62 6f 64 79 5d 2c 20 61 70 43 65 6c 6c  ellbody], apCell
22580 5b 69 5d 2c 20 61 53 69 7a 65 5b 69 5d 29 3b 0a  [i], aSize[i]);.
22590 20 20 20 20 20 20 63 65 6c 6c 70 74 72 20 2b 3d        cellptr +=
225a0 20 32 3b 0a 20 20 20 20 20 20 63 65 6c 6c 62 6f   2;.      cellbo
225b0 64 79 20 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a  dy += aSize[i];.
225c0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
225d0 28 20 63 65 6c 6c 62 6f 64 79 3d 3d 70 50 61 67  ( cellbody==pPag
225e0 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
225f0 7a 65 20 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67  ze );.  }.  pPag
22600 65 2d 3e 6e 43 65 6c 6c 20 3d 20 6e 43 65 6c 6c  e->nCell = nCell
22610 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
22620 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65 74  ollowing paramet
22630 65 72 73 20 64 65 74 65 72 6d 69 6e 65 20 68 6f  ers determine ho
22640 77 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74 20  w many adjacent 
22650 70 61 67 65 73 20 67 65 74 20 69 6e 76 6f 6c 76  pages get involv
22660 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61 6e  ed.** in a balan
22670 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20  cing operation. 
22680 20 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65   NN is the numbe
22690 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f  r of neighbors o
226a0 6e 20 65 69 74 68 65 72 20 73 69 64 65 0a 2a 2a  n either side.**
226b0 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 68 61   of the page tha
226c0 74 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e  t participate in
226d0 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20 6f   the balancing o
226e0 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69 73  peration.  NB is
226f0 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75   the.** total nu
22700 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
22710 61 74 20 70 61 72 74 69 63 69 70 61 74 65 2c 20  at participate, 
22720 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 61  including the ta
22730 72 67 65 74 20 70 61 67 65 20 61 6e 64 0a 2a 2a  rget page and.**
22740 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e   NN neighbors on
22750 20 65 69 74 68 65 72 20 73 69 64 65 2e 0a 2a 2a   either side..**
22760 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20  .** The minimum 
22770 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20 31  value of NN is 1
22780 20 28 6f 66 20 63 6f 75 72 73 65 29 2e 20 20 49   (of course).  I
22790 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20 61 62 6f  ncreasing NN abo
227a0 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f 72  ve 1.** (to 2 or
227b0 20 33 29 20 67 69 76 65 73 20 61 20 6d 6f 64 65   3) gives a mode
227c0 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 69  st improvement i
227d0 6e 20 53 45 4c 45 43 54 20 61 6e 64 20 44 45 4c  n SELECT and DEL
227e0 45 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a  ETE performance.
227f0 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67 65 20 66  ** in exchange f
22800 6f 72 20 61 20 6c 61 72 67 65 72 20 64 65 67 72  or a larger degr
22810 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45 52  adation in INSER
22820 54 20 61 6e 64 20 55 50 44 41 54 45 20 70 65 72  T and UPDATE per
22830 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65  formance..** The
22840 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70 70   value of NN app
22850 65 61 72 73 20 74 6f 20 67 69 76 65 20 74 68 65  ears to give the
22860 20 62 65 73 74 20 72 65 73 75 6c 74 73 20 6f 76   best results ov
22870 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e  erall..*/.#defin
22880 65 20 4e 4e 20 31 20 20 20 20 20 20 20 20 20 20  e NN 1          
22890 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
228a0 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74  neighbors on eit
228b0 68 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67  her side of pPag
228c0 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42 20  e */.#define NB 
228d0 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f 2a  (NN*2+1)      /*
228e0 20 54 6f 74 61 6c 20 70 61 67 65 73 20 69 6e 76   Total pages inv
228f0 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 62 61 6c  olved in the bal
22900 61 6e 63 65 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77  ance */../* Forw
22910 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
22920 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61  .static int bala
22930 6e 63 65 28 4d 65 6d 50 61 67 65 2a 2c 20 69 6e  nce(MemPage*, in
22940 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  t);..#ifndef SQL
22950 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41  ITE_OMIT_QUICKBA
22960 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73  LANCE./*.** This
22970 20 76 65 72 73 69 6f 6e 20 6f 66 20 62 61 6c 61   version of bala
22980 6e 63 65 28 29 20 68 61 6e 64 6c 65 73 20 74 68  nce() handles th
22990 65 20 63 6f 6d 6d 6f 6e 20 73 70 65 63 69 61 6c  e common special
229a0 20 63 61 73 65 20 77 68 65 72 65 0a 2a 2a 20 61   case where.** a
229b0 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 62 65   new entry is be
229c0 69 6e 67 20 69 6e 73 65 72 74 65 64 20 6f 6e 20  ing inserted on 
229d0 74 68 65 20 65 78 74 72 65 6d 65 20 72 69 67 68  the extreme righ
229e0 74 2d 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  t-end of the.** 
229f0 74 72 65 65 2c 20 69 6e 20 6f 74 68 65 72 20 77  tree, in other w
22a00 6f 72 64 73 2c 20 77 68 65 6e 20 74 68 65 20 6e  ords, when the n
22a10 65 77 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65  ew entry will be
22a20 63 6f 6d 65 20 74 68 65 20 6c 61 72 67 65 73 74  come the largest
22a30 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74 68 65  .** entry in the
22a40 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73   tree..**.** Ins
22a50 74 65 61 64 20 6f 66 20 74 72 79 69 6e 67 20 62  tead of trying b
22a60 61 6c 61 6e 63 65 20 74 68 65 20 33 20 72 69 67  alance the 3 rig
22a70 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61 67  ht-most leaf pag
22a80 65 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20  es, just add.** 
22a90 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68  a new page to th
22aa0 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
22ab0 65 20 61 6e 64 20 70 75 74 20 74 68 65 20 6f 6e  e and put the on
22ac0 65 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a  e new entry in.*
22ad0 2a 20 74 68 61 74 20 70 61 67 65 2e 20 20 54 68  * that page.  Th
22ae0 69 73 20 6c 65 61 76 65 73 20 74 68 65 20 72 69  is leaves the ri
22af0 67 68 74 20 73 69 64 65 20 6f 66 20 74 68 65 20  ght side of the 
22b00 74 72 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a  tree somewhat.**
22b10 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42 75   unbalanced.  Bu
22b20 74 20 6f 64 64 73 20 61 72 65 20 74 68 61 74 20  t odds are that 
22b30 77 65 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72  we will be inser
22b40 74 69 6e 67 20 6e 65 77 20 65 6e 74 72 69 65 73  ting new entries
22b50 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 73  .** at the end s
22b60 6f 6f 6e 20 61 66 74 65 72 77 61 72 64 73 20 73  oon afterwards s
22b70 6f 20 74 68 65 20 6e 65 61 72 6c 79 20 65 6d 70  o the nearly emp
22b80 74 79 20 70 61 67 65 20 77 69 6c 6c 20 71 75 69  ty page will qui
22b90 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e  ckly.** fill up.
22ba0 20 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a    On average..**
22bb0 0a 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68 65  .** pPage is the
22bc0 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68   leaf page which
22bd0 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   is the right-mo
22be0 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 74  st page in the t
22bf0 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20  ree..** pParent 
22c00 69 73 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20  is its parent.  
22c10 70 50 61 67 65 20 6d 75 73 74 20 68 61 76 65 20  pPage must have 
22c20 61 20 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f  a single overflo
22c30 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68  w entry.** which
22c40 20 69 73 20 61 6c 73 6f 20 74 68 65 20 72 69 67   is also the rig
22c50 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e  ht-most entry on
22c60 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74   the page..*/.st
22c70 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
22c80 5f 71 75 69 63 6b 28 4d 65 6d 50 61 67 65 20 2a  _quick(MemPage *
22c90 70 50 61 67 65 2c 20 4d 65 6d 50 61 67 65 20 2a  pPage, MemPage *
22ca0 70 50 61 72 65 6e 74 29 7b 0a 20 20 69 6e 74 20  pParent){.  int 
22cb0 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  rc;.  MemPage *p
22cc0 4e 65 77 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  New;.  Pgno pgno
22cd0 4e 65 77 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c  New;.  u8 *pCell
22ce0 3b 0a 20 20 69 6e 74 20 73 7a 43 65 6c 6c 3b 0a  ;.  int szCell;.
22cf0 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
22d00 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
22d10 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
22d20 20 69 6e 74 20 70 61 72 65 6e 74 49 64 78 20 3d   int parentIdx =
22d30 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b   pParent->nCell;
22d40 20 20 20 2f 2a 20 70 50 61 72 65 6e 74 20 6e 65     /* pParent ne
22d50 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69  w divider cell i
22d60 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 70 61  ndex */.  int pa
22d70 72 65 6e 74 53 69 7a 65 3b 20 20 20 20 20 20 20  rentSize;       
22d80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
22d90 69 7a 65 20 6f 66 20 6e 65 77 20 64 69 76 69 64  ize of new divid
22da0 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  er cell */.  u8 
22db0 70 61 72 65 6e 74 43 65 6c 6c 5b 36 34 5d 3b 20  parentCell[64]; 
22dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22dd0 2a 20 53 70 61 63 65 20 66 6f 72 20 74 68 65 20  * Space for the 
22de0 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c  new divider cell
22df0 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   */..  /* Alloca
22e00 74 65 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49  te a new page. I
22e10 6e 73 65 72 74 20 74 68 65 20 6f 76 65 72 66 6c  nsert the overfl
22e20 6f 77 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61  ow cell from pPa
22e30 67 65 0a 20 20 2a 2a 20 69 6e 74 6f 20 69 74 2e  ge.  ** into it.
22e40 20 54 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65   Then remove the
22e50 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 66   overflow cell f
22e60 72 6f 6d 20 70 50 61 67 65 2e 0a 20 20 2a 2f 0a  rom pPage..  */.
22e70 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
22e80 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
22e90 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20 30  New, &pgnoNew, 0
22ea0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
22eb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22ec0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
22ed0 20 20 70 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d    pCell = pPage-
22ee0 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b  >aOvfl[0].pCell;
22ef0 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c  .  szCell = cell
22f00 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70  SizePtr(pPage, p
22f10 43 65 6c 6c 29 3b 0a 20 20 7a 65 72 6f 50 61 67  Cell);.  zeroPag
22f20 65 28 70 4e 65 77 2c 20 70 50 61 67 65 2d 3e 61  e(pNew, pPage->a
22f30 44 61 74 61 5b 30 5d 29 3b 0a 20 20 61 73 73 65  Data[0]);.  asse
22f40 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 31  mblePage(pNew, 1
22f50 2c 20 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65 6c  , &pCell, &szCel
22f60 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76  l);.  pPage->nOv
22f70 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 2f  erflow = 0;..  /
22f80 2a 20 53 65 74 20 74 68 65 20 70 61 72 65 6e 74  * Set the parent
22f90 20 6f 66 20 74 68 65 20 6e 65 77 6c 79 20 61 6c   of the newly al
22fa0 6c 6f 63 61 74 65 64 20 70 61 67 65 20 74 6f 20  located page to 
22fb0 70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 70 4e  pParent. */.  pN
22fc0 65 77 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 50  ew->pParent = pP
22fd0 61 72 65 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33  arent;.  sqlite3
22fe0 50 61 67 65 72 52 65 66 28 70 50 61 72 65 6e 74  PagerRef(pParent
22ff0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 2f  ->pDbPage);..  /
23000 2a 20 70 50 61 67 65 20 69 73 20 63 75 72 72 65  * pPage is curre
23010 6e 74 6c 79 20 74 68 65 20 72 69 67 68 74 2d 63  ntly the right-c
23020 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 2e  hild of pParent.
23030 20 43 68 61 6e 67 65 20 74 68 69 73 0a 20 20 2a   Change this.  *
23040 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 69  * so that the ri
23050 67 68 74 2d 63 68 69 6c 64 20 69 73 20 74 68 65  ght-child is the
23060 20 6e 65 77 20 70 61 67 65 20 61 6c 6c 6f 63 61   new page alloca
23070 74 65 64 20 61 62 6f 76 65 20 61 6e 64 0a 20 20  ted above and.  
23080 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68 65 20  ** pPage is the 
23090 6e 65 78 74 2d 74 6f 2d 72 69 67 68 74 20 63 68  next-to-right ch
230a0 69 6c 64 2e 20 0a 20 20 2a 2f 0a 20 20 61 73 73  ild. .  */.  ass
230b0 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
230c0 6c 3e 30 20 29 3b 0a 20 20 70 61 72 73 65 43 65  l>0 );.  parseCe
230d0 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 66 69 6e  llPtr(pPage, fin
230e0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 50 61  dCell(pPage, pPa
230f0 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 2c 20 26 69  ge->nCell-1), &i
23100 6e 66 6f 29 3b 0a 20 20 72 63 20 3d 20 66 69 6c  nfo);.  rc = fil
23110 6c 49 6e 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  lInCell(pParent,
23120 20 70 61 72 65 6e 74 43 65 6c 6c 2c 20 30 2c 20   parentCell, 0, 
23130 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c  info.nKey, 0, 0,
23140 20 26 70 61 72 65 6e 74 53 69 7a 65 29 3b 0a 20   &parentSize);. 
23150 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
23160 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
23170 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
23180 74 28 20 70 61 72 65 6e 74 53 69 7a 65 3c 36 34  t( parentSize<64
23190 20 29 3b 0a 20 20 72 63 20 3d 20 69 6e 73 65 72   );.  rc = inser
231a0 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70  tCell(pParent, p
231b0 61 72 65 6e 74 49 64 78 2c 20 70 61 72 65 6e 74  arentIdx, parent
231c0 43 65 6c 6c 2c 20 70 61 72 65 6e 74 53 69 7a 65  Cell, parentSize
231d0 2c 20 30 2c 20 34 29 3b 0a 20 20 69 66 28 20 72  , 0, 4);.  if( r
231e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
231f0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
23200 20 7d 0a 20 20 70 75 74 34 62 79 74 65 28 66 69   }.  put4byte(fi
23210 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70  ndOverflowCell(p
23220 50 61 72 65 6e 74 2c 70 61 72 65 6e 74 49 64 78  Parent,parentIdx
23230 29 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  ), pPage->pgno);
23240 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
23250 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
23260 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
23270 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a 0a 23 69  ], pgnoNew);..#i
23280 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
23290 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f  T_AUTOVACUUM.  /
232a0 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
232b0 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
232c0 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68 65  base, update the
232d0 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20 2a   pointer map.  *
232e0 2a 20 77 69 74 68 20 65 6e 74 72 69 65 73 20 66  * with entries f
232f0 6f 72 20 74 68 65 20 6e 65 77 20 70 61 67 65 2c  or the new page,
23300 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65 72   and any pointer
23310 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 2a 2a 20   from the .  ** 
23320 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61 67 65  cell on the page
23330 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
23340 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  page..  */.  if(
23350 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
23360 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 74 72   ){.    rc = ptr
23370 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
23380 4e 65 77 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  New, PTRMAP_BTRE
23390 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  E, pParent->pgno
233a0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
233b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
233c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
233d0 20 7d 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d   }.    rc = ptrm
233e0 61 70 50 75 74 4f 76 66 6c 28 70 4e 65 77 2c 20  apPutOvfl(pNew, 
233f0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
23400 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23410 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
23420 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
23430 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65    /* Release the
23440 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
23450 65 20 6e 65 77 20 70 61 67 65 20 61 6e 64 20 62  e new page and b
23460 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e  alance the paren
23470 74 20 70 61 67 65 2c 0a 20 20 2a 2a 20 69 6e 20  t page,.  ** in 
23480 63 61 73 65 20 74 68 65 20 64 69 76 69 64 65 72  case the divider
23490 20 63 65 6c 6c 20 69 6e 73 65 72 74 65 64 20 63   cell inserted c
234a0 61 75 73 65 64 20 69 74 20 74 6f 20 62 65 63 6f  aused it to beco
234b0 6d 65 20 6f 76 65 72 66 75 6c 6c 2e 0a 20 20 2a  me overfull..  *
234c0 2f 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  /.  releasePage(
234d0 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20  pNew);.  return 
234e0 62 61 6c 61 6e 63 65 28 70 50 61 72 65 6e 74 2c  balance(pParent,
234f0 20 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   0);.}.#endif /*
23500 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49   SQLITE_OMIT_QUI
23510 43 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 2f 2a  CKBALANCE */../*
23520 0a 2a 2a 20 54 68 65 20 49 53 41 55 54 4f 56 41  .** The ISAUTOVA
23530 43 55 55 4d 20 6d 61 63 72 6f 20 69 73 20 75 73  CUUM macro is us
23540 65 64 20 77 69 74 68 69 6e 20 62 61 6c 61 6e 63  ed within balanc
23550 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 74 6f 20 64  e_nonroot() to d
23560 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 69 66 20 74  etermine.** if t
23570 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70  he database supp
23580 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
23590 20 6f 72 20 6e 6f 74 2e 20 42 65 63 61 75 73 65   or not. Because
235a0 20 69 74 20 69 73 20 75 73 65 64 0a 2a 2a 20 77   it is used.** w
235b0 69 74 68 69 6e 20 61 6e 20 65 78 70 72 65 73 73  ithin an express
235c0 69 6f 6e 20 74 68 61 74 20 69 73 20 61 6e 20 61  ion that is an a
235d0 72 67 75 6d 65 6e 74 20 74 6f 20 61 6e 6f 74 68  rgument to anoth
235e0 65 72 20 6d 61 63 72 6f 20 0a 2a 2a 20 28 73 71  er macro .** (sq
235f0 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 29 2c 20  liteMallocRaw), 
23600 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
23610 6c 65 20 74 6f 20 75 73 65 20 63 6f 6e 64 69 74  le to use condit
23620 69 6f 6e 61 6c 20 63 6f 6d 70 69 6c 61 74 69 6f  ional compilatio
23630 6e 2e 0a 2a 2a 20 53 6f 2c 20 74 68 69 73 20 6d  n..** So, this m
23640 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65 64 20  acro is defined 
23650 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a 23 69 66 6e  instead..*/.#ifn
23660 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
23670 41 55 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69  AUTOVACUUM.#defi
23680 6e 65 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  ne ISAUTOVACUUM 
23690 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  (pBt->autoVacuum
236a0 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ).#else.#define 
236b0 49 53 41 55 54 4f 56 41 43 55 55 4d 20 30 0a 23  ISAUTOVACUUM 0.#
236c0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
236d0 73 20 72 6f 75 74 69 6e 65 20 72 65 64 69 73 74  s routine redist
236e0 72 69 62 75 74 65 73 20 43 65 6c 6c 73 20 6f 6e  ributes Cells on
236f0 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f   pPage and up to
23700 20 4e 4e 2a 32 20 73 69 62 6c 69 6e 67 73 0a 2a   NN*2 siblings.*
23710 2a 20 6f 66 20 70 50 61 67 65 20 73 6f 20 74 68  * of pPage so th
23720 61 74 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76  at all pages hav
23730 65 20 61 62 6f 75 74 20 74 68 65 20 73 61 6d 65  e about the same
23740 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65 20   amount of free 
23750 73 70 61 63 65 2e 0a 2a 2a 20 55 73 75 61 6c 6c  space..** Usuall
23760 79 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e  y NN siblings on
23770 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20   either side of 
23780 70 50 61 67 65 20 69 73 20 75 73 65 64 20 69 6e  pPage is used in
23790 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c 0a   the balancing,.
237a0 2a 2a 20 74 68 6f 75 67 68 20 6d 6f 72 65 20 73  ** though more s
237b0 69 62 6c 69 6e 67 73 20 6d 69 67 68 74 20 63 6f  iblings might co
237c0 6d 65 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65  me from one side
237d0 20 69 66 20 70 50 61 67 65 20 69 73 20 74 68 65   if pPage is the
237e0 20 66 69 72 73 74 0a 2a 2a 20 6f 72 20 6c 61 73   first.** or las
237f0 74 20 63 68 69 6c 64 20 6f 66 20 69 74 73 20 70  t child of its p
23800 61 72 65 6e 74 2e 20 20 49 66 20 70 50 61 67 65  arent.  If pPage
23810 20 68 61 73 20 66 65 77 65 72 20 74 68 61 6e 20   has fewer than 
23820 32 2a 4e 4e 20 73 69 62 6c 69 6e 67 73 0a 2a 2a  2*NN siblings.**
23830 20 28 73 6f 6d 65 74 68 69 6e 67 20 77 68 69 63   (something whic
23840 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  h can only happe
23850 6e 20 69 66 20 70 50 61 67 65 20 69 73 20 74 68  n if pPage is th
23860 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 72 20 61  e root page or a
23870 20 0a 2a 2a 20 63 68 69 6c 64 20 6f 66 20 72 6f   .** child of ro
23880 6f 74 29 20 74 68 65 6e 20 61 6c 6c 20 61 76 61  ot) then all ava
23890 69 6c 61 62 6c 65 20 73 69 62 6c 69 6e 67 73 20  ilable siblings 
238a0 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 74  participate in t
238b0 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a  he balancing..**
238c0 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  .** The number o
238d0 66 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 70 50  f siblings of pP
238e0 61 67 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63  age might be inc
238f0 72 65 61 73 65 64 20 6f 72 20 64 65 63 72 65 61  reased or decrea
23900 73 65 64 20 62 79 20 6f 6e 65 20 6f 72 0a 2a 2a  sed by one or.**
23910 20 74 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72   two in an effor
23920 74 20 74 6f 20 6b 65 65 70 20 70 61 67 65 73 20  t to keep pages 
23930 6e 65 61 72 6c 79 20 66 75 6c 6c 20 62 75 74 20  nearly full but 
23940 6e 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20 54  not over full. T
23950 68 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20  he root page.** 
23960 69 73 20 73 70 65 63 69 61 6c 20 61 6e 64 20 69  is special and i
23970 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20  s allowed to be 
23980 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20 49 66  nearly empty. If
23990 20 70 50 61 67 65 20 69 73 20 0a 2a 2a 20 74 68   pPage is .** th
239a0 65 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65  e root page, the
239b0 6e 20 74 68 65 20 64 65 70 74 68 20 6f 66 20 74  n the depth of t
239c0 68 65 20 74 72 65 65 20 6d 69 67 68 74 20 62 65  he tree might be
239d0 20 69 6e 63 72 65 61 73 65 64 0a 2a 2a 20 6f 72   increased.** or
239e0 20 64 65 63 72 65 61 73 65 64 20 62 79 20 6f 6e   decreased by on
239f0 65 2c 20 61 73 20 6e 65 63 65 73 73 61 72 79 2c  e, as necessary,
23a00 20 74 6f 20 6b 65 65 70 20 74 68 65 20 72 6f 6f   to keep the roo
23a10 74 20 70 61 67 65 20 66 72 6f 6d 20 62 65 69 6e  t page from bein
23a20 67 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c 20 6f 72  g.** overfull or
23a30 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74   completely empt
23a40 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  y..**.** Note th
23a50 61 74 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  at when this rou
23a60 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
23a70 73 6f 6d 65 20 6f 66 20 74 68 65 20 43 65 6c 6c  some of the Cell
23a80 73 20 6f 6e 20 70 50 61 67 65 0a 2a 2a 20 6d 69  s on pPage.** mi
23a90 67 68 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  ght not actually
23aa0 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 70 50   be stored in pP
23ab0 61 67 65 2d 3e 61 44 61 74 61 5b 5d 2e 20 20 54  age->aData[].  T
23ac0 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a  his can happen.*
23ad0 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  * if the page is
23ae0 20 6f 76 65 72 66 75 6c 6c 2e 20 20 50 61 72 74   overfull.  Part
23af0 20 6f 66 20 74 68 65 20 6a 6f 62 20 6f 66 20 74   of the job of t
23b00 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
23b10 6f 0a 2a 2a 20 6d 61 6b 65 20 73 75 72 65 20 61  o.** make sure a
23b20 6c 6c 20 43 65 6c 6c 73 20 66 6f 72 20 70 50 61  ll Cells for pPa
23b30 67 65 20 6f 6e 63 65 20 61 67 61 69 6e 20 66 69  ge once again fi
23b40 74 20 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74  t in pPage->aDat
23b50 61 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  a[]..**.** In th
23b60 65 20 63 6f 75 72 73 65 20 6f 66 20 62 61 6c 61  e course of bala
23b70 6e 63 69 6e 67 20 74 68 65 20 73 69 62 6c 69 6e  ncing the siblin
23b80 67 73 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65  gs of pPage, the
23b90 20 70 61 72 65 6e 74 20 6f 66 20 70 50 61 67 65   parent of pPage
23ba0 0a 2a 2a 20 6d 69 67 68 74 20 62 65 63 6f 6d 65  .** might become
23bb0 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64   overfull or und
23bc0 65 72 66 75 6c 6c 2e 20 20 49 66 20 74 68 61 74  erfull.  If that
23bd0 20 68 61 70 70 65 6e 73 2c 20 74 68 65 6e 20 74   happens, then t
23be0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
23bf0 73 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69  s called recursi
23c00 76 65 6c 79 20 6f 6e 20 74 68 65 20 70 61 72 65  vely on the pare
23c10 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  nt..**.** If thi
23c20 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20  s routine fails 
23c30 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20  for any reason, 
23c40 69 74 20 6d 69 67 68 74 20 6c 65 61 76 65 20 74  it might leave t
23c50 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69  he database.** i
23c60 6e 20 61 20 63 6f 72 72 75 70 74 65 64 20 73 74  n a corrupted st
23c70 61 74 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73  ate.  So if this
23c80 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 2c 20   routine fails, 
23c90 74 68 65 20 64 61 74 61 62 61 73 65 20 73 68 6f  the database sho
23ca0 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65 64  uld.** be rolled
23cb0 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   back..*/.static
23cc0 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e   int balance_non
23cd0 72 6f 6f 74 28 4d 65 6d 50 61 67 65 20 2a 70 50  root(MemPage *pP
23ce0 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  age){.  MemPage 
23cf0 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20  *pParent;       
23d00 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65       /* The pare
23d10 6e 74 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 20  nt of pPage */. 
23d20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
23d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d40 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 64 61   /* The whole da
23d50 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
23d60 6e 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20  nCell = 0;      
23d70 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
23d80 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61  er of cells in a
23d90 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74  pCell[] */.  int
23da0 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20   nMaxCells = 0; 
23db0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
23dc0 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61  ocated size of a
23dd0 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61  pCell, szCell, a
23de0 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e  From. */.  int n
23df0 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  Old;            
23e00 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
23e10 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70  r of pages in ap
23e20 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  Old[] */.  int n
23e30 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
23e40 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
23e50 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70  r of pages in ap
23e60 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  New[] */.  int n
23e70 44 69 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  Div;            
23e80 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
23e90 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70  r of cells in ap
23ea0 44 69 76 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69  Div[] */.  int i
23eb0 2c 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20  , j, k;         
23ec0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
23ed0 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
23ee0 74 20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20  t idx;          
23ef0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
23f00 64 65 78 20 6f 66 20 70 50 61 67 65 20 69 6e 20  dex of pPage in 
23f10 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d  pParent->aCell[]
23f20 20 2a 2f 0a 20 20 69 6e 74 20 6e 78 44 69 76 3b   */.  int nxDiv;
23f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f40 20 20 20 2f 2a 20 4e 65 78 74 20 64 69 76 69 64     /* Next divid
23f50 65 72 20 73 6c 6f 74 20 69 6e 20 70 50 61 72 65  er slot in pPare
23f60 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20  nt->aCell[] */. 
23f70 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
23f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23f90 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   The return code
23fa0 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66 43 6f   */.  int leafCo
23fb0 72 72 65 63 74 69 6f 6e 3b 20 20 20 20 20 20 20  rrection;       
23fc0 20 20 20 2f 2a 20 34 20 69 66 20 70 50 61 67 65     /* 4 if pPage
23fd0 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69   is a leaf.  0 i
23fe0 66 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6c  f not */.  int l
23ff0 65 61 66 44 61 74 61 3b 20 20 20 20 20 20 20 20  eafData;        
24000 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
24010 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65  if pPage is a le
24020 61 66 20 6f 66 20 61 20 4c 45 41 46 44 41 54 41  af of a LEAFDATA
24030 20 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75   tree */.  int u
24040 73 61 62 6c 65 53 70 61 63 65 3b 20 20 20 20 20  sableSpace;     
24050 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
24060 20 69 6e 20 70 50 61 67 65 20 62 65 79 6f 6e 64   in pPage beyond
24070 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20   the header */. 
24080 20 69 6e 74 20 70 61 67 65 46 6c 61 67 73 3b 20   int pageFlags; 
24090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
240a0 20 56 61 6c 75 65 20 6f 66 20 70 50 61 67 65 2d   Value of pPage-
240b0 3e 61 44 61 74 61 5b 30 5d 20 2a 2f 0a 20 20 69  >aData[0] */.  i
240c0 6e 74 20 73 75 62 74 6f 74 61 6c 3b 20 20 20 20  nt subtotal;    
240d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
240e0 75 62 74 6f 74 61 6c 20 6f 66 20 62 79 74 65 73  ubtotal of bytes
240f0 20 69 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65   in cells on one
24100 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69   page */.  int i
24110 53 70 61 63 65 20 3d 20 30 3b 20 20 20 20 20 20  Space = 0;      
24120 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
24130 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20   unused byte of 
24140 61 53 70 61 63 65 5b 5d 20 2a 2f 0a 20 20 4d 65  aSpace[] */.  Me
24150 6d 50 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d  mPage *apOld[NB]
24160 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 50  ;          /* pP
24170 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 74 77  age and up to tw
24180 6f 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20  o siblings */.  
24190 50 67 6e 6f 20 70 67 6e 6f 4f 6c 64 5b 4e 42 5d  Pgno pgnoOld[NB]
241a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
241b0 50 61 67 65 20 6e 75 6d 62 65 72 73 20 66 6f 72  Page numbers for
241c0 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 61 70   each page in ap
241d0 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61  Old[] */.  MemPa
241e0 67 65 20 2a 61 70 43 6f 70 79 5b 4e 42 5d 3b 20  ge *apCopy[NB]; 
241f0 20 20 20 20 20 20 20 20 2f 2a 20 50 72 69 76 61          /* Priva
24200 74 65 20 63 6f 70 69 65 73 20 6f 66 20 61 70 4f  te copies of apO
24210 6c 64 5b 5d 20 70 61 67 65 73 20 2a 2f 0a 20 20  ld[] pages */.  
24220 4d 65 6d 50 61 67 65 20 2a 61 70 4e 65 77 5b 4e  MemPage *apNew[N
24230 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20  B+2];        /* 
24240 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20  pPage and up to 
24250 4e 42 20 73 69 62 6c 69 6e 67 73 20 61 66 74 65  NB siblings afte
24260 72 20 62 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20  r balancing */. 
24270 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 5b 4e 42   Pgno pgnoNew[NB
24280 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  +2];          /*
24290 20 50 61 67 65 20 6e 75 6d 62 65 72 73 20 66 6f   Page numbers fo
242a0 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 61  r each page in a
242b0 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  pNew[] */.  u8 *
242c0 61 70 44 69 76 5b 4e 42 5d 3b 20 20 20 20 20 20  apDiv[NB];      
242d0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 76 69           /* Divi
242e0 64 65 72 20 63 65 6c 6c 73 20 69 6e 20 70 50 61  der cells in pPa
242f0 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6e  rent */.  int cn
24300 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20  tNew[NB+2];     
24310 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
24320 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63 65  in aCell[] of ce
24330 6c 6c 20 61 66 74 65 72 20 69 2d 74 68 20 70 61  ll after i-th pa
24340 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65  ge */.  int szNe
24350 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20  w[NB+2];        
24360 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64       /* Combined
24370 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70   size of cells p
24380 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20 70 61 67  lace on i-th pag
24390 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
243a0 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ll = 0;         
243b0 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73      /* All cells
243c0 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20   begin balanced 
243d0 2a 2f 0a 20 20 69 6e 74 20 2a 73 7a 43 65 6c 6c  */.  int *szCell
243e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
243f0 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20    /* Local size 
24400 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20  of all cells in 
24410 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38  apCell[] */.  u8
24420 20 2a 61 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20   *aCopy[NB];    
24430 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
24440 61 63 65 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20  ace for holding 
24450 64 61 74 61 20 6f 66 20 61 70 43 6f 70 79 5b 5d  data of apCopy[]
24460 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61 63 65   */.  u8 *aSpace
24470 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24480 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 68     /* Space to h
24490 6f 6c 64 20 63 6f 70 69 65 73 20 6f 66 20 64 69  old copies of di
244a0 76 69 64 65 72 73 20 63 65 6c 6c 73 20 2a 2f 0a  viders cells */.
244b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
244c0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
244d0 20 75 38 20 2a 61 46 72 6f 6d 20 3d 20 30 3b 0a   u8 *aFrom = 0;.
244e0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 0a 20 20  #endif..  /* .  
244f0 2a 2a 20 46 69 6e 64 20 74 68 65 20 70 61 72 65  ** Find the pare
24500 6e 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  nt page..  */.  
24510 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
24520 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72  sInit );.  asser
24530 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
24540 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
24550 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
24560 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
24570 3b 0a 20 20 70 50 61 72 65 6e 74 20 3d 20 70 50  ;.  pParent = pP
24580 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20  age->pParent;.  
24590 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 20  assert( pParent 
245a0 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
245b0 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
245c0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 72  3PagerWrite(pPar
245d0 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 29 20 29  ent->pDbPage)) )
245e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
245f0 0a 20 20 7d 0a 20 20 54 52 41 43 45 28 28 22 42  .  }.  TRACE(("B
24600 41 4c 41 4e 43 45 3a 20 62 65 67 69 6e 20 70 61  ALANCE: begin pa
24610 67 65 20 25 64 20 63 68 69 6c 64 20 6f 66 20 25  ge %d child of %
24620 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e  d\n", pPage->pgn
24630 6f 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  o, pParent->pgno
24640 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ));..#ifndef SQL
24650 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41  ITE_OMIT_QUICKBA
24660 4c 41 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20  LANCE.  /*.  ** 
24670 41 20 73 70 65 63 69 61 6c 20 63 61 73 65 3a 20  A special case: 
24680 20 49 66 20 61 20 6e 65 77 20 65 6e 74 72 79 20   If a new entry 
24690 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 69 6e  has just been in
246a0 73 65 72 74 65 64 20 69 6e 74 6f 20 61 0a 20 20  serted into a.  
246b0 2a 2a 20 74 61 62 6c 65 20 28 74 68 61 74 20 69  ** table (that i
246c0 73 2c 20 61 20 62 74 72 65 65 20 77 69 74 68 20  s, a btree with 
246d0 69 6e 74 65 67 65 72 20 6b 65 79 73 20 61 6e 64  integer keys and
246e0 20 61 6c 6c 20 64 61 74 61 20 61 74 20 74 68 65   all data at the
246f0 20 6c 65 61 76 65 73 29 0a 20 20 2a 2a 20 61 6e   leaves).  ** an
24700 64 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  d the new entry 
24710 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  is the right-mos
24720 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
24730 72 65 65 20 28 69 74 20 68 61 73 20 74 68 65 0a  ree (it has the.
24740 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 6b 65 79    ** largest key
24750 29 20 74 68 65 6e 20 75 73 65 20 74 68 65 20 73  ) then use the s
24760 70 65 63 69 61 6c 20 62 61 6c 61 6e 63 65 5f 71  pecial balance_q
24770 75 69 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66  uick() routine f
24780 6f 72 0a 20 20 2a 2a 20 62 61 6c 61 6e 63 69 6e  or.  ** balancin
24790 67 2e 20 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  g.  balance_quic
247a0 6b 28 29 20 69 73 20 6d 75 63 68 20 66 61 73 74  k() is much fast
247b0 65 72 20 61 6e 64 20 72 65 73 75 6c 74 73 20 69  er and results i
247c0 6e 20 61 20 74 69 67 68 74 65 72 0a 20 20 2a 2a  n a tighter.  **
247d0 20 70 61 63 6b 69 6e 67 20 6f 66 20 64 61 74 61   packing of data
247e0 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   in the common c
247f0 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ase..  */.  if( 
24800 70 50 61 67 65 2d 3e 6c 65 61 66 20 26 26 0a 20  pPage->leaf &&. 
24810 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b       pPage->intK
24820 65 79 20 26 26 0a 20 20 20 20 20 20 70 50 61 67  ey &&.      pPag
24830 65 2d 3e 6c 65 61 66 44 61 74 61 20 26 26 0a 20  e->leafData &&. 
24840 20 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65       pPage->nOve
24850 72 66 6c 6f 77 3d 3d 31 20 26 26 0a 20 20 20 20  rflow==1 &&.    
24860 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30    pPage->aOvfl[0
24870 5d 2e 69 64 78 3d 3d 70 50 61 67 65 2d 3e 6e 43  ].idx==pPage->nC
24880 65 6c 6c 20 26 26 0a 20 20 20 20 20 20 70 50 61  ell &&.      pPa
24890 67 65 2d 3e 70 50 61 72 65 6e 74 2d 3e 70 67 6e  ge->pParent->pgn
248a0 6f 21 3d 31 20 26 26 0a 20 20 20 20 20 20 67 65  o!=1 &&.      ge
248b0 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
248c0 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
248d0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 70  hdrOffset+8])==p
248e0 50 61 67 65 2d 3e 70 67 6e 6f 0a 20 20 29 7b 0a  Page->pgno.  ){.
248f0 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 4f      /*.    ** TO
24900 44 4f 3a 20 43 68 65 63 6b 20 74 68 65 20 73 69  DO: Check the si
24910 62 6c 69 6e 67 73 20 74 6f 20 74 68 65 20 6c 65  blings to the le
24920 66 74 20 6f 66 20 70 50 61 67 65 2e 20 49 74 20  ft of pPage. It 
24930 6d 61 79 20 62 65 20 74 68 61 74 0a 20 20 20 20  may be that.    
24940 2a 2a 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20  ** they are not 
24950 66 75 6c 6c 20 61 6e 64 20 6e 6f 20 6e 65 77 20  full and no new 
24960 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64  page is required
24970 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74  ..    */.    ret
24980 75 72 6e 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  urn balance_quic
24990 6b 28 70 50 61 67 65 2c 20 70 50 61 72 65 6e 74  k(pPage, pParent
249a0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
249b0 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68   /*.  ** Find th
249c0 65 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 70 61  e cell in the pa
249d0 72 65 6e 74 20 70 61 67 65 20 77 68 6f 73 65 20  rent page whose 
249e0 6c 65 66 74 20 63 68 69 6c 64 20 70 6f 69 6e 74  left child point
249f0 73 20 62 61 63 6b 0a 20 20 2a 2a 20 74 6f 20 70  s back.  ** to p
24a00 50 61 67 65 2e 20 20 54 68 65 20 22 69 64 78 22  Page.  The "idx"
24a10 20 76 61 72 69 61 62 6c 65 20 69 73 20 74 68 65   variable is the
24a20 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20 63   index of that c
24a30 65 6c 6c 2e 20 20 49 66 20 70 50 61 67 65 0a 20  ell.  If pPage. 
24a40 20 2a 2a 20 69 73 20 74 68 65 20 72 69 67 68 74   ** is the right
24a50 6d 6f 73 74 20 63 68 69 6c 64 20 6f 66 20 70 50  most child of pP
24a60 61 72 65 6e 74 20 74 68 65 6e 20 73 65 74 20 69  arent then set i
24a70 64 78 20 74 6f 20 70 50 61 72 65 6e 74 2d 3e 6e  dx to pParent->n
24a80 43 65 6c 6c 20 0a 20 20 2a 2f 0a 20 20 69 66 28  Cell .  */.  if(
24a90 20 70 50 61 72 65 6e 74 2d 3e 69 64 78 53 68 69   pParent->idxShi
24aa0 66 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70  ft ){.    Pgno p
24ab0 67 6e 6f 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20  gno;.    pgno = 
24ac0 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 20  pPage->pgno;.   
24ad0 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3d 3d 73   assert( pgno==s
24ae0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
24af0 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62  umber(pPage->pDb
24b00 50 61 67 65 29 20 29 3b 0a 20 20 20 20 66 6f 72  Page) );.    for
24b10 28 69 64 78 3d 30 3b 20 69 64 78 3c 70 50 61 72  (idx=0; idx<pPar
24b20 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 20 69 64 78 2b  ent->nCell; idx+
24b30 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 67 65  +){.      if( ge
24b40 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
24b50 70 50 61 72 65 6e 74 2c 20 69 64 78 29 29 3d 3d  pParent, idx))==
24b60 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  pgno ){.        
24b70 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
24b80 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
24b90 20 69 64 78 3c 70 50 61 72 65 6e 74 2d 3e 6e 43   idx<pParent->nC
24ba0 65 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ell.            
24bb0 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70 50   || get4byte(&pP
24bc0 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61  arent->aData[pPa
24bd0 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  rent->hdrOffset+
24be0 38 5d 29 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 7d  8])==pgno );.  }
24bf0 65 6c 73 65 7b 0a 20 20 20 20 69 64 78 20 3d 20  else{.    idx = 
24c00 70 50 61 67 65 2d 3e 69 64 78 50 61 72 65 6e 74  pPage->idxParent
24c10 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
24c20 20 49 6e 69 74 69 61 6c 69 7a 65 20 76 61 72 69   Initialize vari
24c30 61 62 6c 65 73 20 73 6f 20 74 68 61 74 20 69 74  ables so that it
24c40 20 77 69 6c 6c 20 62 65 20 73 61 66 65 20 74 6f   will be safe to
24c50 20 6a 75 6d 70 0a 20 20 2a 2a 20 64 69 72 65 63   jump.  ** direc
24c60 74 6c 79 20 74 6f 20 62 61 6c 61 6e 63 65 5f 63  tly to balance_c
24c70 6c 65 61 6e 75 70 20 61 74 20 61 6e 79 20 6d 6f  leanup at any mo
24c80 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 6c  ment..  */.  nOl
24c90 64 20 3d 20 6e 4e 65 77 20 3d 20 30 3b 0a 20 20  d = nNew = 0;.  
24ca0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
24cb0 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
24cc0 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69  );..  /*.  ** Fi
24cd0 6e 64 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  nd sibling pages
24ce0 20 74 6f 20 70 50 61 67 65 20 61 6e 64 20 74 68   to pPage and th
24cf0 65 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65  e cells in pPare
24d00 6e 74 20 74 68 61 74 20 64 69 76 69 64 65 0a 20  nt that divide. 
24d10 20 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67 73   ** the siblings
24d20 2e 20 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73  .  An attempt is
24d30 20 6d 61 64 65 20 74 6f 20 66 69 6e 64 20 4e 4e   made to find NN
24d40 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65 69 74   siblings on eit
24d50 68 65 72 0a 20 20 2a 2a 20 73 69 64 65 20 6f 66  her.  ** side of
24d60 20 70 50 61 67 65 2e 20 20 4d 6f 72 65 20 73 69   pPage.  More si
24d70 62 6c 69 6e 67 73 20 61 72 65 20 74 61 6b 65 6e  blings are taken
24d80 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c 20   from one side, 
24d90 68 6f 77 65 76 65 72 2c 20 69 66 0a 20 20 2a 2a  however, if.  **
24da0 20 70 50 61 67 65 20 74 68 65 72 65 20 61 72 65   pPage there are
24db0 20 66 65 77 65 72 20 74 68 61 6e 20 4e 4e 20 73   fewer than NN s
24dc0 69 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f  iblings on the o
24dd0 74 68 65 72 20 73 69 64 65 2e 20 20 49 66 20 70  ther side.  If p
24de0 50 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61 73 20  Parent.  ** has 
24df0 4e 42 20 6f 72 20 66 65 77 65 72 20 63 68 69 6c  NB or fewer chil
24e00 64 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20 63 68  dren then all ch
24e10 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 72 65 6e  ildren of pParen
24e20 74 20 61 72 65 20 74 61 6b 65 6e 2e 0a 20 20 2a  t are taken..  *
24e30 2f 0a 20 20 6e 78 44 69 76 20 3d 20 69 64 78 20  /.  nxDiv = idx 
24e40 2d 20 4e 4e 3b 0a 20 20 69 66 28 20 6e 78 44 69  - NN;.  if( nxDi
24e50 76 20 2b 20 4e 42 20 3e 20 70 50 61 72 65 6e 74  v + NB > pParent
24e60 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 6e  ->nCell ){.    n
24e70 78 44 69 76 20 3d 20 70 50 61 72 65 6e 74 2d 3e  xDiv = pParent->
24e80 6e 43 65 6c 6c 20 2d 20 4e 42 20 2b 20 31 3b 0a  nCell - NB + 1;.
24e90 20 20 7d 0a 20 20 69 66 28 20 6e 78 44 69 76 3c    }.  if( nxDiv<
24ea0 30 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d  0 ){.    nxDiv =
24eb0 20 30 3b 0a 20 20 7d 0a 20 20 6e 44 69 76 20 3d   0;.  }.  nDiv =
24ec0 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6b   0;.  for(i=0, k
24ed0 3d 6e 78 44 69 76 3b 20 69 3c 4e 42 3b 20 69 2b  =nxDiv; i<NB; i+
24ee0 2b 2c 20 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, k++){.    if(
24ef0 20 6b 3c 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c   k<pParent->nCel
24f00 6c 20 29 7b 0a 20 20 20 20 20 20 61 70 44 69 76  l ){.      apDiv
24f10 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  [i] = findCell(p
24f20 50 61 72 65 6e 74 2c 20 6b 29 3b 0a 20 20 20 20  Parent, k);.    
24f30 20 20 6e 44 69 76 2b 2b 3b 0a 20 20 20 20 20 20    nDiv++;.      
24f40 61 73 73 65 72 74 28 20 21 70 50 61 72 65 6e 74  assert( !pParent
24f50 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20 20 20  ->leaf );.      
24f60 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65 74  pgnoOld[i] = get
24f70 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b  4byte(apDiv[i]);
24f80 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b  .    }else if( k
24f90 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  ==pParent->nCell
24fa0 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f 4f 6c   ){.      pgnoOl
24fb0 64 5b 69 5d 20 3d 20 67 65 74 34 62 79 74 65 28  d[i] = get4byte(
24fc0 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
24fd0 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
24fe0 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  et+8]);.    }els
24ff0 65 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e{.      break;.
25000 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 67      }.    rc = g
25010 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
25020 74 2c 20 70 67 6e 6f 4f 6c 64 5b 69 5d 2c 20 26  t, pgnoOld[i], &
25030 61 70 4f 6c 64 5b 69 5d 2c 20 70 50 61 72 65 6e  apOld[i], pParen
25040 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  t);.    if( rc )
25050 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
25060 65 61 6e 75 70 3b 0a 20 20 20 20 61 70 4f 6c 64  eanup;.    apOld
25070 5b 69 5d 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d  [i]->idxParent =
25080 20 6b 3b 0a 20 20 20 20 61 70 43 6f 70 79 5b 69   k;.    apCopy[i
25090 5d 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  ] = 0;.    asser
250a0 74 28 20 69 3d 3d 6e 4f 6c 64 20 29 3b 0a 20 20  t( i==nOld );.  
250b0 20 20 6e 4f 6c 64 2b 2b 3b 0a 20 20 20 20 6e 4d    nOld++;.    nM
250c0 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f  axCells += 1+apO
250d0 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f  ld[i]->nCell+apO
250e0 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77  ld[i]->nOverflow
250f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
25100 20 6e 4d 61 78 43 65 6c 6c 73 20 61 20 6d 75 6c   nMaxCells a mul
25110 74 69 70 6c 65 20 6f 66 20 32 20 69 6e 20 6f 72  tiple of 2 in or
25120 64 65 72 20 74 6f 20 70 72 65 73 65 72 76 65 20  der to preserve 
25130 38 2d 62 79 74 65 0a 20 20 2a 2a 20 61 6c 69 67  8-byte.  ** alig
25140 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78 43  nment */.  nMaxC
25150 65 6c 6c 73 20 3d 20 28 6e 4d 61 78 43 65 6c 6c  ells = (nMaxCell
25160 73 20 2b 20 31 29 26 7e 31 3b 0a 0a 20 20 2f 2a  s + 1)&~1;..  /*
25170 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  ** Allocate s
25180 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20  pace for memory 
25190 73 74 72 75 63 74 75 72 65 73 0a 20 20 2a 2f 0a  structures.  */.
251a0 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74    apCell = sqlit
251b0 65 4d 61 6c 6c 6f 63 52 61 77 28 20 0a 20 20 20  eMallocRaw( .   
251c0 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69      nMaxCells*si
251d0 7a 65 6f 66 28 75 38 2a 29 20 20 20 20 20 20 20  zeof(u8*)       
251e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251f0 20 20 20 20 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f      /* apCell */
25200 0a 20 20 20 20 20 2b 20 6e 4d 61 78 43 65 6c 6c  .     + nMaxCell
25210 73 2a 73 69 7a 65 6f 66 28 69 6e 74 29 20 20 20  s*sizeof(int)   
25220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25230 20 20 20 20 20 20 20 20 2f 2a 20 73 7a 43 65 6c          /* szCel
25240 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 52 4f 55 4e  l */.     + ROUN
25250 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67  D8(sizeof(MemPag
25260 65 29 29 2a 4e 42 20 20 20 20 20 20 20 20 20 20  e))*NB          
25270 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
25280 43 6f 70 79 20 2a 2f 0a 20 20 20 20 20 2b 20 70  Copy */.     + p
25290 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 35 2b  Bt->pageSize*(5+
252a0 4e 42 29 20 20 20 20 20 20 20 20 20 20 20 20 20  NB)             
252b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
252c0 2a 20 61 53 70 61 63 65 20 2a 2f 0a 20 20 20 20  * aSpace */.    
252d0 20 2b 20 28 49 53 41 55 54 4f 56 41 43 55 55 4d   + (ISAUTOVACUUM
252e0 20 3f 20 6e 4d 61 78 43 65 6c 6c 73 20 3a 20 30   ? nMaxCells : 0
252f0 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
25300 20 20 20 2f 2a 20 61 46 72 6f 6d 20 2a 2f 0a 20     /* aFrom */. 
25310 20 29 3b 0a 20 20 69 66 28 20 61 70 43 65 6c 6c   );.  if( apCell
25320 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
25330 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
25340 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
25350 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 7a  leanup;.  }.  sz
25360 43 65 6c 6c 20 3d 20 28 69 6e 74 2a 29 26 61 70  Cell = (int*)&ap
25370 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b  Cell[nMaxCells];
25380 0a 20 20 61 43 6f 70 79 5b 30 5d 20 3d 20 28 75  .  aCopy[0] = (u
25390 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43  8*)&szCell[nMaxC
253a0 65 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74 28  ells];.  assert(
253b0 20 28 28 61 43 6f 70 79 5b 30 5d 20 2d 20 28 75   ((aCopy[0] - (u
253c0 38 2a 29 61 70 43 65 6c 6c 29 20 26 20 37 29 3d  8*)apCell) & 7)=
253d0 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20  =0 ); /* 8-byte 
253e0 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72  alignment requir
253f0 65 64 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b  ed */.  for(i=1;
25400 20 69 3c 4e 42 3b 20 69 2b 2b 29 7b 0a 20 20 20   i<NB; i++){.   
25410 20 61 43 6f 70 79 5b 69 5d 20 3d 20 26 61 43 6f   aCopy[i] = &aCo
25420 70 79 5b 69 2d 31 5d 5b 70 42 74 2d 3e 70 61 67  py[i-1][pBt->pag
25430 65 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a  eSize+ROUND8(siz
25440 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a  eof(MemPage))];.
25450 20 20 20 20 61 73 73 65 72 74 28 20 28 28 61 43      assert( ((aC
25460 6f 70 79 5b 69 5d 20 2d 20 28 75 38 2a 29 61 70  opy[i] - (u8*)ap
25470 43 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29 3b  Cell) & 7)==0 );
25480 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   /* 8-byte align
25490 6d 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a 2f  ment required */
254a0 0a 20 20 7d 0a 20 20 61 53 70 61 63 65 20 3d 20  .  }.  aSpace = 
254b0 26 61 43 6f 70 79 5b 4e 42 2d 31 5d 5b 70 42 74  &aCopy[NB-1][pBt
254c0 2d 3e 70 61 67 65 53 69 7a 65 2b 52 4f 55 4e 44  ->pageSize+ROUND
254d0 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65  8(sizeof(MemPage
254e0 29 29 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28  ))];.  assert( (
254f0 28 61 53 70 61 63 65 20 2d 20 28 75 38 2a 29 61  (aSpace - (u8*)a
25500 70 43 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29  pCell) & 7)==0 )
25510 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67  ; /* 8-byte alig
25520 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a  nment required *
25530 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
25540 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
25550 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f  .  if( pBt->auto
25560 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 61 46  Vacuum ){.    aF
25570 72 6f 6d 20 3d 20 26 61 53 70 61 63 65 5b 35 2a  rom = &aSpace[5*
25580 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a  pBt->pageSize];.
25590 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
255a0 2f 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 63 6f 70  /*.  ** Make cop
255b0 69 65 73 20 6f 66 20 74 68 65 20 63 6f 6e 74 65  ies of the conte
255c0 6e 74 20 6f 66 20 70 50 61 67 65 20 61 6e 64 20  nt of pPage and 
255d0 69 74 73 20 73 69 62 6c 69 6e 67 73 20 69 6e 74  its siblings int
255e0 6f 20 61 4f 6c 64 5b 5d 2e 0a 20 20 2a 2a 20 54  o aOld[]..  ** T
255f0 68 65 20 72 65 73 74 20 6f 66 20 74 68 69 73 20  he rest of this 
25600 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73  function will us
25610 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  e data from the 
25620 63 6f 70 69 65 73 20 72 61 74 68 65 72 0a 20 20  copies rather.  
25630 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 72 69 67  ** that the orig
25640 69 6e 61 6c 20 70 61 67 65 73 20 73 69 6e 63 65  inal pages since
25650 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
25660 67 65 73 20 77 69 6c 6c 20 62 65 20 69 6e 20 74  ges will be in t
25670 68 65 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 20  he.  ** process 
25680 6f 66 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69  of being overwri
25690 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  tten..  */.  for
256a0 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b  (i=0; i<nOld; i+
256b0 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  +){.    MemPage 
256c0 2a 70 20 3d 20 61 70 43 6f 70 79 5b 69 5d 20 3d  *p = apCopy[i] =
256d0 20 28 4d 65 6d 50 61 67 65 2a 29 26 61 43 6f 70   (MemPage*)&aCop
256e0 79 5b 69 5d 5b 70 42 74 2d 3e 70 61 67 65 53 69  y[i][pBt->pageSi
256f0 7a 65 5d 3b 0a 20 20 20 20 70 2d 3e 61 44 61 74  ze];.    p->aDat
25700 61 20 3d 20 26 28 28 75 38 2a 29 70 29 5b 2d 70  a = &((u8*)p)[-p
25710 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20  Bt->pageSize];. 
25720 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 61 44 61     memcpy(p->aDa
25730 74 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e 61 44  ta, apOld[i]->aD
25740 61 74 61 2c 20 70 42 74 2d 3e 70 61 67 65 53 69  ata, pBt->pageSi
25750 7a 65 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 50  ze + sizeof(MemP
25760 61 67 65 29 29 3b 0a 20 20 20 20 2f 2a 20 54 68  age));.    /* Th
25770 65 20 6d 65 6d 63 70 79 28 29 20 61 62 6f 76 65  e memcpy() above
25780 20 63 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c   changes the val
25790 75 65 20 6f 66 20 70 2d 3e 61 44 61 74 61 20 73  ue of p->aData s
257a0 6f 20 77 65 20 68 61 76 65 20 74 6f 0a 20 20 20  o we have to.   
257b0 20 2a 2a 20 73 65 74 20 69 74 20 61 67 61 69 6e   ** set it again
257c0 2e 20 2a 2f 0a 20 20 20 20 70 2d 3e 61 44 61 74  . */.    p->aDat
257d0 61 20 3d 20 26 28 28 75 38 2a 29 70 29 5b 2d 70  a = &((u8*)p)[-p
257e0 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20  Bt->pageSize];. 
257f0 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f   }..  /*.  ** Lo
25800 61 64 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61  ad pointers to a
25810 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c  ll cells on sibl
25820 69 6e 67 20 70 61 67 65 73 20 61 6e 64 20 74 68  ing pages and th
25830 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a  e divider cells.
25840 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f    ** into the lo
25850 63 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72  cal apCell[] arr
25860 61 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65 73  ay.  Make copies
25870 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20   of the divider 
25880 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20  cells.  ** into 
25890 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66  space obtained f
258a0 6f 72 6d 20 61 53 70 61 63 65 5b 5d 20 61 6e 64  orm aSpace[] and
258b0 20 72 65 6d 6f 76 65 20 74 68 65 20 74 68 65 20   remove the the 
258c0 64 69 76 69 64 65 72 20 43 65 6c 6c 73 0a 20 20  divider Cells.  
258d0 2a 2a 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2e  ** from pParent.
258e0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
258f0 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6f  e siblings are o
25900 6e 20 6c 65 61 66 20 70 61 67 65 73 2c 20 74 68  n leaf pages, th
25910 65 6e 20 74 68 65 20 63 68 69 6c 64 20 70 6f 69  en the child poi
25920 6e 74 65 72 73 20 6f 66 20 74 68 65 0a 20 20 2a  nters of the.  *
25930 2a 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20  * divider cells 
25940 61 72 65 20 73 74 72 69 70 70 65 64 20 66 72 6f  are stripped fro
25950 6d 20 74 68 65 20 63 65 6c 6c 73 20 62 65 66 6f  m the cells befo
25960 72 65 20 74 68 65 79 20 61 72 65 20 63 6f 70 69  re they are copi
25970 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 53 70  ed.  ** into aSp
25980 61 63 65 5b 5d 2e 20 20 49 6e 20 74 68 69 73 20  ace[].  In this 
25990 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69  way, all cells i
259a0 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 72 65 20 77  n apCell[] are w
259b0 69 74 68 6f 75 74 0a 20 20 2a 2a 20 63 68 69 6c  ithout.  ** chil
259c0 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 49 66 20  d pointers.  If 
259d0 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74  siblings are not
259e0 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 61 6c   leaves, then al
259f0 6c 20 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61  l cell in.  ** a
25a00 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65 20  pCell[] include 
25a10 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20  child pointers. 
25a20 20 45 69 74 68 65 72 20 77 61 79 2c 20 61 6c 6c   Either way, all
25a30 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
25a40 5b 5d 0a 20 20 2a 2a 20 61 72 65 20 61 6c 69 6b  [].  ** are alik
25a50 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61  e..  **.  ** lea
25a60 66 43 6f 72 72 65 63 74 69 6f 6e 3a 20 20 34 20  fCorrection:  4 
25a70 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65  if pPage is a le
25a80 61 66 2e 20 20 30 20 69 66 20 70 50 61 67 65 20  af.  0 if pPage 
25a90 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 2e 0a 20  is not a leaf.. 
25aa0 20 2a 2a 20 20 20 20 20 20 20 6c 65 61 66 44 61   **       leafDa
25ab0 74 61 3a 20 20 31 20 69 66 20 70 50 61 67 65 20  ta:  1 if pPage 
25ac0 68 6f 6c 64 73 20 6b 65 79 2b 64 61 74 61 20 61  holds key+data a
25ad0 6e 64 20 70 50 61 72 65 6e 74 20 68 6f 6c 64 73  nd pParent holds
25ae0 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20 20 2a 2f   only keys..  */
25af0 0a 20 20 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20  .  nCell = 0;.  
25b00 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 3d  leafCorrection =
25b10 20 70 50 61 67 65 2d 3e 6c 65 61 66 2a 34 3b 0a   pPage->leaf*4;.
25b20 20 20 6c 65 61 66 44 61 74 61 20 3d 20 70 50 61    leafData = pPa
25b30 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 26 26 20  ge->leafData && 
25b40 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 66  pPage->leaf;.  f
25b50 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20  or(i=0; i<nOld; 
25b60 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  i++){.    MemPag
25b70 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79  e *pOld = apCopy
25b80 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6c 69 6d  [i];.    int lim
25b90 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c  it = pOld->nCell
25ba0 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77  +pOld->nOverflow
25bb0 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
25bc0 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20  <limit; j++){.  
25bd0 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
25be0 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  l<nMaxCells );. 
25bf0 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c       apCell[nCel
25c00 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f  l] = findOverflo
25c10 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a  wCell(pOld, j);.
25c20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
25c30 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ll] = cellSizePt
25c40 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e  r(pOld, apCell[n
25c50 43 65 6c 6c 5d 29 3b 0a 23 69 66 6e 64 65 66 20  Cell]);.#ifndef 
25c60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
25c70 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28  VACUUM.      if(
25c80 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
25c90 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
25ca0 61 3b 0a 20 20 20 20 20 20 20 20 61 46 72 6f 6d  a;.        aFrom
25cb0 5b 6e 43 65 6c 6c 5d 20 3d 20 69 3b 0a 20 20 20  [nCell] = i;.   
25cc0 20 20 20 20 20 66 6f 72 28 61 3d 30 3b 20 61 3c       for(a=0; a<
25cd0 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  pOld->nOverflow;
25ce0 20 61 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   a++){.         
25cf0 20 69 66 28 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c   if( pOld->aOvfl
25d00 5b 61 5d 2e 70 43 65 6c 6c 3d 3d 61 70 43 65 6c  [a].pCell==apCel
25d10 6c 5b 6e 43 65 6c 6c 5d 20 29 7b 0a 20 20 20 20  l[nCell] ){.    
25d20 20 20 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43          aFrom[nC
25d30 65 6c 6c 5d 20 3d 20 30 78 46 46 3b 0a 20 20 20  ell] = 0xFF;.   
25d40 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
25d50 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
25d60 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65      }.      }.#e
25d70 6e 64 69 66 0a 20 20 20 20 20 20 6e 43 65 6c 6c  ndif.      nCell
25d80 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ++;.    }.    if
25d90 28 20 69 3c 6e 4f 6c 64 2d 31 20 29 7b 0a 20 20  ( i<nOld-1 ){.  
25da0 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 63 65 6c      int sz = cel
25db0 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74  lSizePtr(pParent
25dc0 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20  , apDiv[i]);.   
25dd0 20 20 20 69 66 28 20 6c 65 61 66 44 61 74 61 20     if( leafData 
25de0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 69  ){.        /* Wi
25df0 74 68 20 74 68 65 20 4c 45 41 46 44 41 54 41 20  th the LEAFDATA 
25e00 66 6c 61 67 2c 20 70 50 61 72 65 6e 74 20 63 65  flag, pParent ce
25e10 6c 6c 73 20 68 6f 6c 64 20 6f 6e 6c 79 20 49 4e  lls hold only IN
25e20 54 4b 45 59 73 20 74 68 61 74 0a 20 20 20 20 20  TKEYs that.     
25e30 20 20 20 2a 2a 20 61 72 65 20 64 75 70 6c 69 63     ** are duplic
25e40 61 74 65 73 20 6f 66 20 6b 65 79 73 20 6f 6e 20  ates of keys on 
25e50 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 73 2e  the child pages.
25e60 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 65 6d    We need to rem
25e70 6f 76 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ove.        ** t
25e80 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  he divider cells
25e90 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2c 20 62   from pParent, b
25ea0 75 74 20 74 68 65 20 64 69 76 69 64 65 72 73 20  ut the dividers 
25eb0 63 65 6c 6c 73 20 61 72 65 20 6e 6f 74 0a 20 20  cells are not.  
25ec0 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20 74        ** added t
25ed0 6f 20 61 70 43 65 6c 6c 5b 5d 20 62 65 63 61 75  o apCell[] becau
25ee0 73 65 20 74 68 65 79 20 61 72 65 20 64 75 70 6c  se they are dupl
25ef0 69 63 61 74 65 73 20 6f 66 20 63 68 69 6c 64 20  icates of child 
25f00 63 65 6c 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a  cells..        *
25f10 2f 0a 20 20 20 20 20 20 20 20 64 72 6f 70 43 65  /.        dropCe
25f20 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69  ll(pParent, nxDi
25f30 76 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 7d 65  v, sz);.      }e
25f40 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75 38 20  lse{.        u8 
25f50 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20  *pTemp;.        
25f60 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d  assert( nCell<nM
25f70 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20  axCells );.     
25f80 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     szCell[nCell]
25f90 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 70   = sz;.        p
25fa0 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65 5b 69  Temp = &aSpace[i
25fb0 53 70 61 63 65 5d 3b 0a 20 20 20 20 20 20 20 20  Space];.        
25fc0 69 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20  iSpace += sz;.  
25fd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53        assert( iS
25fe0 70 61 63 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53  pace<=pBt->pageS
25ff0 69 7a 65 2a 35 20 29 3b 0a 20 20 20 20 20 20 20  ize*5 );.       
26000 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20 61   memcpy(pTemp, a
26010 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20  pDiv[i], sz);.  
26020 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65        apCell[nCe
26030 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61 66  ll] = pTemp+leaf
26040 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 23 69 66 6e  Correction;.#ifn
26050 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
26060 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
26070 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
26080 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
26090 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d      aFrom[nCell]
260a0 20 3d 20 30 78 46 46 3b 0a 20 20 20 20 20 20 20   = 0xFF;.       
260b0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
260c0 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65    dropCell(pPare
260d0 6e 74 2c 20 6e 78 44 69 76 2c 20 73 7a 29 3b 0a  nt, nxDiv, sz);.
260e0 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e          szCell[n
260f0 43 65 6c 6c 5d 20 2d 3d 20 6c 65 61 66 43 6f 72  Cell] -= leafCor
26100 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20  rection;.       
26110 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74   assert( get4byt
26120 65 28 70 54 65 6d 70 29 3d 3d 70 67 6e 6f 4f 6c  e(pTemp)==pgnoOl
26130 64 5b 69 5d 20 29 3b 0a 20 20 20 20 20 20 20 20  d[i] );.        
26140 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66 20  if( !pOld->leaf 
26150 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
26160 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74  ert( leafCorrect
26170 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ion==0 );.      
26180 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
26190 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20   pointer of the 
261a0 63 68 69 6c 64 20 70 61 67 65 20 70 4f 6c 64 20  child page pOld 
261b0 62 65 63 6f 6d 65 73 20 74 68 65 20 6c 65 66 74  becomes the left
261c0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  .          ** po
261d0 69 6e 74 65 72 20 6f 66 20 74 68 65 20 64 69 76  inter of the div
261e0 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 20  ider cell */.   
261f0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 70         memcpy(ap
26200 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f  Cell[nCell], &pO
26210 6c 64 2d 3e 61 44 61 74 61 5b 70 4f 6c 64 2d 3e  ld->aData[pOld->
26220 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 34 29  hdrOffset+8], 4)
26230 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
26240 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
26250 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  t( leafCorrectio
26260 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20 20  n==4 );.        
26270 7d 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 2b  }.        nCell+
26280 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
26290 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
262a0 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 6e  Figure out the n
262b0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6e  umber of pages n
262c0 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c  eeded to hold al
262d0 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20  l nCell cells.. 
262e0 20 2a 2a 20 53 74 6f 72 65 20 74 68 69 73 20 6e   ** Store this n
262f0 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20 20 41  umber in "k".  A
26300 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65  lso compute szNe
26310 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68 65  w[] which is the
26320 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65   total.  ** size
26330 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e   of all cells on
26340 20 74 68 65 20 69 2d 74 68 20 70 61 67 65 20 61   the i-th page a
26350 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63  nd cntNew[] whic
26360 68 20 69 73 20 74 68 65 20 69 6e 64 65 78 0a 20  h is the index. 
26370 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20   ** in apCell[] 
26380 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68 61 74  of the cell that
26390 20 64 69 76 69 64 65 73 20 70 61 67 65 20 69 20   divides page i 
263a0 66 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e 20 20  from page i+1.  
263b0 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20  .  ** cntNew[k] 
263c0 73 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e 43 65  should equal nCe
263d0 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61  ll..  **.  ** Va
263e0 6c 75 65 73 20 63 6f 6d 70 75 74 65 64 20 62 79  lues computed by
263f0 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a   this block:.  *
26400 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  *.  **          
26410 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20 6e 75   k: The total nu
26420 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 20  mber of sibling 
26430 70 61 67 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a  pages.  **    sz
26440 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65 64 20 75  New[i]: Spaced u
26450 73 65 64 20 6f 6e 20 74 68 65 20 69 2d 74 68 20  sed on the i-th 
26460 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20  sibling page..  
26470 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20  **   cntNew[i]: 
26480 49 6e 64 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b  Index in apCell[
26490 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66  ] and szCell[] f
264a0 6f 72 20 74 68 65 20 66 69 72 73 74 20 63 65 6c  or the first cel
264b0 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20  l to.  **       
264c0 20 20 20 20 20 20 20 74 68 65 20 72 69 67 68 74         the right
264d0 20 6f 66 20 74 68 65 20 69 2d 74 68 20 73 69 62   of the i-th sib
264e0 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20  ling page..  ** 
264f0 75 73 61 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d  usableSpace: Num
26500 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
26510 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20  space available 
26520 6f 6e 20 65 61 63 68 20 73 69 62 6c 69 6e 67 2e  on each sibling.
26530 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73  .  ** .  */.  us
26540 61 62 6c 65 53 70 61 63 65 20 3d 20 70 42 74 2d  ableSpace = pBt-
26550 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 31 32  >usableSize - 12
26560 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f   + leafCorrectio
26570 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f 74 61  n;.  for(subtota
26580 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  l=k=i=0; i<nCell
26590 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
265a0 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( i<nMaxCells 
265b0 29 3b 0a 20 20 20 20 73 75 62 74 6f 74 61 6c 20  );.    subtotal 
265c0 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32  += szCell[i] + 2
265d0 3b 0a 20 20 20 20 69 66 28 20 73 75 62 74 6f 74  ;.    if( subtot
265e0 61 6c 20 3e 20 75 73 61 62 6c 65 53 70 61 63 65  al > usableSpace
265f0 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b   ){.      szNew[
26600 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20  k] = subtotal - 
26610 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20  szCell[i];.     
26620 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a   cntNew[k] = i;.
26630 20 20 20 20 20 20 69 66 28 20 6c 65 61 66 44 61        if( leafDa
26640 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20  ta ){ i--; }.   
26650 20 20 20 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b     subtotal = 0;
26660 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20  .      k++;.    
26670 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d  }.  }.  szNew[k]
26680 20 3d 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63   = subtotal;.  c
26690 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c  ntNew[k] = nCell
266a0 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20  ;.  k++;..  /*. 
266b0 20 2a 2a 20 54 68 65 20 70 61 63 6b 69 6e 67 20   ** The packing 
266c0 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68 65 20  computed by the 
266d0 70 72 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69  previous block i
266e0 73 20 62 69 61 73 65 64 20 74 6f 77 61 72 64 20  s biased toward 
266f0 74 68 65 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a  the siblings.  *
26700 2a 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 73 69  * on the left si
26710 64 65 2e 20 20 54 68 65 20 6c 65 66 74 20 73 69  de.  The left si
26720 62 6c 69 6e 67 73 20 61 72 65 20 61 6c 77 61 79  blings are alway
26730 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77  s nearly full, w
26740 68 69 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72 69  hile the.  ** ri
26750 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67  ght-most sibling
26760 20 6d 69 67 68 74 20 62 65 20 6e 65 61 72 6c 79   might be nearly
26770 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20 62 6c   empty.  This bl
26780 6f 63 6b 20 6f 66 20 63 6f 64 65 20 61 74 74 65  ock of code atte
26790 6d 70 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a  mpts.  ** to adj
267a0 75 73 74 20 74 68 65 20 70 61 63 6b 69 6e 67 20  ust the packing 
267b0 6f 66 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 67  of siblings to g
267c0 65 74 20 61 20 62 65 74 74 65 72 20 62 61 6c 61  et a better bala
267d0 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  nce..  **.  ** T
267e0 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69  his adjustment i
267f0 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f  s more than an o
26800 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68  ptimization.  Th
26810 65 20 70 61 63 6b 69 6e 67 20 61 62 6f 76 65 20  e packing above 
26820 6d 69 67 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f  might.  ** be so
26830 20 6f 75 74 20 6f 66 20 62 61 6c 61 6e 63 65 20   out of balance 
26840 61 73 20 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c  as to be illegal
26850 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
26860 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20  the right-most. 
26870 20 2a 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67 68   ** sibling migh
26880 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20  t be completely 
26890 65 6d 70 74 79 2e 20 20 54 68 69 73 20 61 64 6a  empty.  This adj
268a0 75 73 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f  ustment is not o
268b0 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20  ptional..  */.  
268c0 66 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20  for(i=k-1; i>0; 
268d0 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a  i--){.    int sz
268e0 52 69 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d  Right = szNew[i]
268f0 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69  ;  /* Size of si
26900 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 72 69 67  bling on the rig
26910 68 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a  ht */.    int sz
26920 4c 65 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31  Left = szNew[i-1
26930 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69  ]; /* Size of si
26940 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66  bling on the lef
26950 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20  t */.    int r; 
26960 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26970 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d 6d  Index of right-m
26980 6f 73 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74  ost cell in left
26990 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20   sibling */.    
269a0 69 6e 74 20 64 3b 20 20 20 20 20 20 20 20 20 20  int d;          
269b0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
269c0 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 20 74 68  first cell to th
269d0 65 20 6c 65 66 74 20 6f 66 20 72 69 67 68 74 20  e left of right 
269e0 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20  sibling */..    
269f0 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20  r = cntNew[i-1] 
26a00 2d 20 31 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b  - 1;.    d = r +
26a10 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20   1 - leafData;. 
26a20 20 20 20 61 73 73 65 72 74 28 20 64 3c 6e 4d 61     assert( d<nMa
26a30 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73  xCells );.    as
26a40 73 65 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c  sert( r<nMaxCell
26a50 73 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  s );.    while( 
26a60 73 7a 52 69 67 68 74 3d 3d 30 20 7c 7c 20 73 7a  szRight==0 || sz
26a70 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b  Right+szCell[d]+
26a80 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a 43 65 6c  2<=szLeft-(szCel
26a90 6c 5b 72 5d 2b 32 29 20 29 7b 0a 20 20 20 20 20  l[r]+2) ){.     
26aa0 20 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a 43 65   szRight += szCe
26ab0 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20 20 20  ll[d] + 2;.     
26ac0 20 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43 65 6c   szLeft -= szCel
26ad0 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20  l[r] + 2;.      
26ae0 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20  cntNew[i-1]--;. 
26af0 20 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b       r = cntNew[
26b00 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 20 20  i-1] - 1;.      
26b10 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66  d = r + 1 - leaf
26b20 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Data;.    }.    
26b30 73 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69 67  szNew[i] = szRig
26b40 68 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b 69 2d  ht;.    szNew[i-
26b50 31 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20 20 7d  1] = szLeft;.  }
26b60 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 77 65  ..  /* Either we
26b70 20 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f   found one or mo
26b80 72 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e 65 77  re cells (cntnew
26b90 5b 30 5d 29 3e 30 29 20 6f 72 20 77 65 20 61 72  [0])>0) or we ar
26ba0 65 20 74 68 65 0a 20 20 2a 2a 20 61 20 76 69 72  e the.  ** a vir
26bb0 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20  tual root page. 
26bc0 20 41 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20   A virtual root 
26bd0 70 61 67 65 20 69 73 20 77 68 65 6e 20 74 68 65  page is when the
26be0 20 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20   real root.  ** 
26bf0 70 61 67 65 20 69 73 20 70 61 67 65 20 31 20 61  page is page 1 a
26c00 6e 64 20 77 65 20 61 72 65 20 74 68 65 20 6f 6e  nd we are the on
26c10 6c 79 20 63 68 69 6c 64 20 6f 66 20 74 68 61 74  ly child of that
26c20 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   page..  */.  as
26c30 73 65 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e  sert( cntNew[0]>
26c40 30 20 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70  0 || (pParent->p
26c50 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 72 65 6e  gno==1 && pParen
26c60 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a  t->nCell==0) );.
26c70 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63  .  /*.  ** Alloc
26c80 61 74 65 20 6b 20 6e 65 77 20 70 61 67 65 73 2e  ate k new pages.
26c90 20 20 52 65 75 73 65 20 6f 6c 64 20 70 61 67 65    Reuse old page
26ca0 73 20 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65  s where possible
26cb0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
26cc0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3e 31 20 29   pPage->pgno>1 )
26cd0 3b 0a 20 20 70 61 67 65 46 6c 61 67 73 20 3d 20  ;.  pageFlags = 
26ce0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3b  pPage->aData[0];
26cf0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b  .  for(i=0; i<k;
26d00 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61   i++){.    MemPa
26d10 67 65 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66  ge *pNew;.    if
26d20 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20  ( i<nOld ){.    
26d30 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69    pNew = apNew[i
26d40 5d 20 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20  ] = apOld[i];.  
26d50 20 20 20 20 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d      pgnoNew[i] =
26d60 20 70 67 6e 6f 4f 6c 64 5b 69 5d 3b 0a 20 20 20   pgnoOld[i];.   
26d70 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b     apOld[i] = 0;
26d80 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
26d90 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e  te3PagerWrite(pN
26da0 65 77 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ew->pDbPage);.  
26db0 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20      nNew++;.    
26dc0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
26dd0 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
26de0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
26df0 20 20 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b    assert( i>0 );
26e00 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f  .      rc = allo
26e10 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
26e20 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e  t, &pNew, &pgnoN
26e30 65 77 5b 69 5d 2c 20 70 67 6e 6f 4e 65 77 5b 69  ew[i], pgnoNew[i
26e40 2d 31 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  -1], 0);.      i
26e50 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c  f( rc ) goto bal
26e60 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
26e70 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 70      apNew[i] = p
26e80 4e 65 77 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b  New;.      nNew+
26e90 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 65 72  +;.    }.    zer
26ea0 6f 50 61 67 65 28 70 4e 65 77 2c 20 70 61 67 65  oPage(pNew, page
26eb0 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Flags);.  }..  /
26ec0 2a 20 46 72 65 65 20 61 6e 79 20 6f 6c 64 20 70  * Free any old p
26ed0 61 67 65 73 20 74 68 61 74 20 77 65 72 65 20 6e  ages that were n
26ee0 6f 74 20 72 65 75 73 65 64 20 61 73 20 6e 65 77  ot reused as new
26ef0 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77   pages..  */.  w
26f00 68 69 6c 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a  hile( i<nOld ){.
26f10 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
26f20 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20  e(apOld[i]);.   
26f30 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
26f40 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
26f50 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
26f60 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61  apOld[i]);.    a
26f70 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  pOld[i] = 0;.   
26f80 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a   i++;.  }..  /*.
26f90 20 20 2a 2a 20 50 75 74 20 74 68 65 20 6e 65 77    ** Put the new
26fa0 20 70 61 67 65 73 20 69 6e 20 61 63 63 65 6e 64   pages in accend
26fb0 69 6e 67 20 6f 72 64 65 72 2e 20 20 54 68 69 73  ing order.  This
26fc0 20 68 65 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b   helps to.  ** k
26fd0 65 65 70 20 65 6e 74 72 69 65 73 20 69 6e 20 74  eep entries in t
26fe0 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69 6e 20  he disk file in 
26ff0 6f 72 64 65 72 20 73 6f 20 74 68 61 74 20 61 20  order so that a 
27000 73 63 61 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65  scan.  ** of the
27010 20 74 61 62 6c 65 20 69 73 20 61 20 6c 69 6e 65   table is a line
27020 61 72 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20  ar scan through 
27030 74 68 65 20 66 69 6c 65 2e 20 20 54 68 61 74 0a  the file.  That.
27040 20 20 2a 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c    ** in turn hel
27050 70 73 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  ps the operating
27060 20 73 79 73 74 65 6d 20 74 6f 20 64 65 6c 69 76   system to deliv
27070 65 72 20 70 61 67 65 73 0a 20 20 2a 2a 20 66 72  er pages.  ** fr
27080 6f 6d 20 74 68 65 20 64 69 73 6b 20 6d 6f 72 65  om the disk more
27090 20 72 61 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20   rapidly..  **. 
270a0 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29 20 69 6e   ** An O(n^2) in
270b0 73 65 72 74 69 6f 6e 20 73 6f 72 74 20 61 6c 67  sertion sort alg
270c0 6f 72 69 74 68 6d 20 69 73 20 75 73 65 64 2c 20  orithm is used, 
270d0 62 75 74 20 73 69 6e 63 65 0a 20 20 2a 2a 20 6e  but since.  ** n
270e0 20 69 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 74   is never more t
270f0 68 61 6e 20 4e 42 20 28 61 20 73 6d 61 6c 6c 20  han NB (a small 
27100 63 6f 6e 73 74 61 6e 74 29 2c 20 74 68 61 74 20  constant), that 
27110 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20  should.  ** not 
27120 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20  be a problem..  
27130 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 4e 42 3d  **.  ** When NB=
27140 3d 33 2c 20 74 68 69 73 20 6f 6e 65 20 6f 70 74  =3, this one opt
27150 69 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b 65 73 20  imization makes 
27160 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a  the database.  *
27170 2a 20 61 62 6f 75 74 20 32 35 25 20 66 61 73 74  * about 25% fast
27180 65 72 20 66 6f 72 20 6c 61 72 67 65 20 69 6e 73  er for large ins
27190 65 72 74 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65  ertions and dele
271a0 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  tions..  */.  fo
271b0 72 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b  r(i=0; i<k-1; i+
271c0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 56  +){.    int minV
271d0 20 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20   = pgnoNew[i];. 
271e0 20 20 20 69 6e 74 20 6d 69 6e 49 20 3d 20 69 3b     int minI = i;
271f0 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20  .    for(j=i+1; 
27200 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  j<k; j++){.     
27210 20 69 66 28 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3c   if( pgnoNew[j]<
27220 28 75 6e 73 69 67 6e 65 64 29 6d 69 6e 56 20 29  (unsigned)minV )
27230 7b 0a 20 20 20 20 20 20 20 20 6d 69 6e 49 20 3d  {.        minI =
27240 20 6a 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e 56   j;.        minV
27250 20 3d 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3b 0a 20   = pgnoNew[j];. 
27260 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
27270 20 69 66 28 20 6d 69 6e 49 3e 69 20 29 7b 0a 20   if( minI>i ){. 
27280 20 20 20 20 20 69 6e 74 20 74 3b 0a 20 20 20 20       int t;.    
27290 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 3b 0a 20    MemPage *pT;. 
272a0 20 20 20 20 20 74 20 3d 20 70 67 6e 6f 4e 65 77       t = pgnoNew
272b0 5b 69 5d 3b 0a 20 20 20 20 20 20 70 54 20 3d 20  [i];.      pT = 
272c0 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20  apNew[i];.      
272d0 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70 67 6e  pgnoNew[i] = pgn
272e0 6f 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20  oNew[minI];.    
272f0 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4e    apNew[i] = apN
27300 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20  ew[minI];.      
27310 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20  pgnoNew[minI] = 
27320 74 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 6d  t;.      apNew[m
27330 69 6e 49 5d 20 3d 20 70 54 3b 0a 20 20 20 20 7d  inI] = pT;.    }
27340 0a 20 20 7d 0a 20 20 54 52 41 43 45 28 28 22 42  .  }.  TRACE(("B
27350 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20  ALANCE: old: %d 
27360 25 64 20 25 64 20 20 6e 65 77 3a 20 25 64 28 25  %d %d  new: %d(%
27370 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29  d) %d(%d) %d(%d)
27380 20 25 64 28 25 64 29 20 25 64 28 25 64 29 5c 6e   %d(%d) %d(%d)\n
27390 22 2c 0a 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 30  ",.    pgnoOld[0
273a0 5d 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32 20  ], .    nOld>=2 
273b0 3f 20 70 67 6e 6f 4f 6c 64 5b 31 5d 20 3a 20 30  ? pgnoOld[1] : 0
273c0 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20  ,.    nOld>=3 ? 
273d0 70 67 6e 6f 4f 6c 64 5b 32 5d 20 3a 20 30 2c 0a  pgnoOld[2] : 0,.
273e0 20 20 20 20 70 67 6e 6f 4e 65 77 5b 30 5d 2c 20      pgnoNew[0], 
273f0 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e  szNew[0],.    nN
27400 65 77 3e 3d 32 20 3f 20 70 67 6e 6f 4e 65 77 5b  ew>=2 ? pgnoNew[
27410 31 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32 20  1] : 0, nNew>=2 
27420 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a  ? szNew[1] : 0,.
27430 20 20 20 20 6e 4e 65 77 3e 3d 33 20 3f 20 70 67      nNew>=3 ? pg
27440 6e 6f 4e 65 77 5b 32 5d 20 3a 20 30 2c 20 6e 4e  noNew[2] : 0, nN
27450 65 77 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b 32 5d  ew>=3 ? szNew[2]
27460 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d   : 0,.    nNew>=
27470 34 20 3f 20 70 67 6e 6f 4e 65 77 5b 33 5d 20 3a  4 ? pgnoNew[3] :
27480 20 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a   0, nNew>=4 ? sz
27490 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a 20 20 20 20  New[3] : 0,.    
274a0 6e 4e 65 77 3e 3d 35 20 3f 20 70 67 6e 6f 4e 65  nNew>=5 ? pgnoNe
274b0 77 5b 34 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d  w[4] : 0, nNew>=
274c0 35 20 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a 20 30  5 ? szNew[4] : 0
274d0 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45  ));..  /*.  ** E
274e0 76 65 6e 6c 79 20 64 69 73 74 72 69 62 75 74 65  venly distribute
274f0 20 74 68 65 20 64 61 74 61 20 69 6e 20 61 70 43   the data in apC
27500 65 6c 6c 5b 5d 20 61 63 72 6f 73 73 20 74 68 65  ell[] across the
27510 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a   new pages..  **
27520 20 49 6e 73 65 72 74 20 64 69 76 69 64 65 72 20   Insert divider 
27530 63 65 6c 6c 73 20 69 6e 74 6f 20 70 50 61 72 65  cells into pPare
27540 6e 74 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  nt as necessary.
27550 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20  .  */.  j = 0;. 
27560 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77   for(i=0; i<nNew
27570 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 41  ; i++){.    /* A
27580 73 73 65 6d 62 6c 65 20 74 68 65 20 6e 65 77 20  ssemble the new 
27590 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f  sibling page. */
275a0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  .    MemPage *pN
275b0 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20  ew = apNew[i];. 
275c0 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61     assert( j<nMa
275d0 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73  xCells );.    as
275e0 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 67 6e 6f  sert( pNew->pgno
275f0 3d 3d 70 67 6e 6f 4e 65 77 5b 69 5d 20 29 3b 0a  ==pgnoNew[i] );.
27600 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65      assemblePage
27610 28 70 4e 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d  (pNew, cntNew[i]
27620 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20  -j, &apCell[j], 
27630 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20  &szCell[j]);.   
27640 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e   assert( pNew->n
27650 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d  Cell>0 || (nNew=
27660 3d 31 20 26 26 20 63 6e 74 4e 65 77 5b 30 5d 3d  =1 && cntNew[0]=
27670 3d 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  =0) );.    asser
27680 74 28 20 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c  t( pNew->nOverfl
27690 6f 77 3d 3d 30 20 29 3b 0a 0a 23 69 66 6e 64 65  ow==0 );..#ifnde
276a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
276b0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 2f 2a 20  TOVACUUM.    /* 
276c0 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75  If this is an au
276d0 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
276e0 73 65 2c 20 75 70 64 61 74 65 20 74 68 65 20 70  se, update the p
276f0 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69  ointer map entri
27700 65 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 70  es.    ** that p
27710 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 69 62 6c  oint to the sibl
27720 69 6e 67 73 20 74 68 61 74 20 77 65 72 65 20 72  ings that were r
27730 65 61 72 72 61 6e 67 65 64 2e 20 54 68 65 73 65  earranged. These
27740 20 63 61 6e 20 62 65 3a 20 6c 65 66 74 0a 20 20   can be: left.  
27750 20 20 2a 2a 20 63 68 69 6c 64 72 65 6e 20 6f 66    ** children of
27760 20 63 65 6c 6c 73 2c 20 74 68 65 20 72 69 67 68   cells, the righ
27770 74 2d 63 68 69 6c 64 20 6f 66 20 74 68 65 20 70  t-child of the p
27780 61 67 65 2c 20 6f 72 20 6f 76 65 72 66 6c 6f 77  age, or overflow
27790 20 70 61 67 65 73 0a 20 20 20 20 2a 2a 20 70 6f   pages.    ** po
277a0 69 6e 74 65 64 20 74 6f 20 62 79 20 63 65 6c 6c  inted to by cell
277b0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
277c0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
277d0 6d 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6b  m ){.      for(k
277e0 3d 6a 3b 20 6b 3c 63 6e 74 4e 65 77 5b 69 5d 3b  =j; k<cntNew[i];
277f0 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61   k++){.        a
27800 73 73 65 72 74 28 20 6b 3c 6e 4d 61 78 43 65 6c  ssert( k<nMaxCel
27810 6c 73 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ls );.        if
27820 28 20 61 46 72 6f 6d 5b 6b 5d 3d 3d 30 78 46 46  ( aFrom[k]==0xFF
27830 20 7c 7c 20 61 70 43 6f 70 79 5b 61 46 72 6f 6d   || apCopy[aFrom
27840 5b 6b 5d 5d 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77  [k]]->pgno!=pNew
27850 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  ->pgno ){.      
27860 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
27870 75 74 4f 76 66 6c 28 70 4e 65 77 2c 20 6b 2d 6a  utOvfl(pNew, k-j
27880 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
27890 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
278a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  {.            go
278b0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
278c0 75 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  up;.          }.
278d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
278e0 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
278f0 20 20 20 20 6a 20 3d 20 63 6e 74 4e 65 77 5b 69      j = cntNew[i
27900 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  ];..    /* If th
27910 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 61  e sibling page a
27920 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 77  ssembled above w
27930 61 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74  as not the right
27940 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 2c 0a 20  -most sibling,. 
27950 20 20 20 2a 2a 20 69 6e 73 65 72 74 20 61 20 64     ** insert a d
27960 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f  ivider cell into
27970 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
27980 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
27990 20 69 3c 6e 4e 65 77 2d 31 20 26 26 20 6a 3c 6e   i<nNew-1 && j<n
279a0 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 75 38  Cell ){.      u8
279b0 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 75   *pCell;.      u
279c0 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20  8 *pTemp;.      
279d0 69 6e 74 20 73 7a 3b 0a 0a 20 20 20 20 20 20 61  int sz;..      a
279e0 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c  ssert( j<nMaxCel
279f0 6c 73 20 29 3b 0a 20 20 20 20 20 20 70 43 65 6c  ls );.      pCel
27a00 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20  l = apCell[j];. 
27a10 20 20 20 20 20 73 7a 20 3d 20 73 7a 43 65 6c 6c       sz = szCell
27a20 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f 72 72 65 63  [j] + leafCorrec
27a30 74 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  tion;.      if( 
27a40 21 70 4e 65 77 2d 3e 6c 65 61 66 20 29 7b 0a 20  !pNew->leaf ){. 
27a50 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
27a60 4e 65 77 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 70  New->aData[8], p
27a70 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20  Cell, 4);.      
27a80 20 20 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20    pTemp = 0;.   
27a90 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 65 61     }else if( lea
27aa0 66 44 61 74 61 20 29 7b 0a 09 2f 2a 20 49 66 20  fData ){../* If 
27ab0 74 68 65 20 74 72 65 65 20 69 73 20 61 20 6c 65  the tree is a le
27ac0 61 66 2d 64 61 74 61 20 74 72 65 65 2c 20 61 6e  af-data tree, an
27ad0 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61  d the siblings a
27ae0 72 65 20 6c 65 61 76 65 73 2c 20 0a 20 20 20 20  re leaves, .    
27af0 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72      ** then ther
27b00 65 20 69 73 20 6e 6f 20 64 69 76 69 64 65 72 20  e is no divider 
27b10 63 65 6c 6c 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  cell in apCell[]
27b20 2e 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 64  . Instead, the d
27b30 69 76 69 64 65 72 20 0a 20 20 20 20 20 20 20 20  ivider .        
27b40 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73  ** cell consists
27b50 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20   of the integer 
27b60 6b 65 79 20 66 6f 72 20 74 68 65 20 72 69 67 68  key for the righ
27b70 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f 66 20 0a  t-most cell of .
27b80 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73          ** the s
27b90 69 62 6c 69 6e 67 2d 70 61 67 65 20 61 73 73 65  ibling-page asse
27ba0 6d 62 6c 65 64 20 61 62 6f 76 65 20 6f 6e 6c 79  mbled above only
27bb0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
27bc0 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e       CellInfo in
27bd0 66 6f 3b 0a 20 20 20 20 20 20 20 20 6a 2d 2d 3b  fo;.        j--;
27be0 0a 20 20 20 20 20 20 20 20 70 61 72 73 65 43 65  .        parseCe
27bf0 6c 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43 65  llPtr(pNew, apCe
27c00 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20  ll[j], &info);. 
27c10 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 26         pCell = &
27c20 61 53 70 61 63 65 5b 69 53 70 61 63 65 5d 3b 0a  aSpace[iSpace];.
27c30 20 20 20 20 20 20 20 20 66 69 6c 6c 49 6e 43 65          fillInCe
27c40 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 43 65 6c  ll(pParent, pCel
27c50 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c  l, 0, info.nKey,
27c60 20 30 2c 20 30 2c 20 26 73 7a 29 3b 0a 20 20 20   0, 0, &sz);.   
27c70 20 20 20 20 20 69 53 70 61 63 65 20 2b 3d 20 73       iSpace += s
27c80 7a 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  z;.        asser
27c90 74 28 20 69 53 70 61 63 65 3c 3d 70 42 74 2d 3e  t( iSpace<=pBt->
27ca0 70 61 67 65 53 69 7a 65 2a 35 20 29 3b 0a 20 20  pageSize*5 );.  
27cb0 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 30 3b        pTemp = 0;
27cc0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
27cd0 20 20 20 20 20 20 70 43 65 6c 6c 20 2d 3d 20 34        pCell -= 4
27ce0 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70 20  ;.        pTemp 
27cf0 3d 20 26 61 53 70 61 63 65 5b 69 53 70 61 63 65  = &aSpace[iSpace
27d00 5d 3b 0a 20 20 20 20 20 20 20 20 69 53 70 61 63  ];.        iSpac
27d10 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20  e += sz;.       
27d20 20 61 73 73 65 72 74 28 20 69 53 70 61 63 65 3c   assert( iSpace<
27d30 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 35  =pBt->pageSize*5
27d40 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
27d50 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c    rc = insertCel
27d60 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76  l(pParent, nxDiv
27d70 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54 65  , pCell, sz, pTe
27d80 6d 70 2c 20 34 29 3b 0a 20 20 20 20 20 20 69 66  mp, 4);.      if
27d90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
27da0 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
27db0 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 70 75  leanup;.      pu
27dc0 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66  t4byte(findOverf
27dd0 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  lowCell(pParent,
27de0 6e 78 44 69 76 29 2c 20 70 4e 65 77 2d 3e 70 67  nxDiv), pNew->pg
27df0 6e 6f 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  no);.#ifndef SQL
27e00 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
27e10 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  UUM.      /* If 
27e20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d  this is an auto-
27e30 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c  vacuum database,
27e40 20 61 6e 64 20 6e 6f 74 20 61 20 6c 65 61 66 2d   and not a leaf-
27e50 64 61 74 61 20 74 72 65 65 2c 0a 20 20 20 20 20  data tree,.     
27e60 20 2a 2a 20 74 68 65 6e 20 75 70 64 61 74 65 20   ** then update 
27e70 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
27e80 77 69 74 68 20 61 6e 20 65 6e 74 72 79 20 66 6f  with an entry fo
27e90 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
27ea0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  age.      ** tha
27eb0 74 20 74 68 65 20 63 65 6c 6c 20 6a 75 73 74 20  t the cell just 
27ec0 69 6e 73 65 72 74 65 64 20 70 6f 69 6e 74 73 20  inserted points 
27ed0 74 6f 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20  to (if any)..   
27ee0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
27ef0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
27f00 26 26 20 21 6c 65 61 66 44 61 74 61 20 29 7b 0a  && !leafData ){.
27f10 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72          rc = ptr
27f20 6d 61 70 50 75 74 4f 76 66 6c 28 70 50 61 72 65  mapPutOvfl(pPare
27f30 6e 74 2c 20 6e 78 44 69 76 29 3b 0a 20 20 20 20  nt, nxDiv);.    
27f40 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
27f50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
27f60 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
27f70 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20  cleanup;.       
27f80 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
27f90 66 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20  f.      j++;.   
27fa0 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20 20 20     nxDiv++;.    
27fb0 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
27fc0 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  j==nCell );.  as
27fd0 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20 29 3b 0a  sert( nOld>0 );.
27fe0 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 30    assert( nNew>0
27ff0 20 29 3b 0a 20 20 69 66 28 20 28 70 61 67 65 46   );.  if( (pageF
28000 6c 61 67 73 20 26 20 50 54 46 5f 4c 45 41 46 29  lags & PTF_LEAF)
28010 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  ==0 ){.    memcp
28020 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d  y(&apNew[nNew-1]
28030 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 61 70 43  ->aData[8], &apC
28040 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61  opy[nOld-1]->aDa
28050 74 61 5b 38 5d 2c 20 34 29 3b 0a 20 20 7d 0a 20  ta[8], 4);.  }. 
28060 20 69 66 28 20 6e 78 44 69 76 3d 3d 70 50 61 72   if( nxDiv==pPar
28070 65 6e 74 2d 3e 6e 43 65 6c 6c 2b 70 50 61 72 65  ent->nCell+pPare
28080 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b  nt->nOverflow ){
28090 0a 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 6d 6f  .    /* Right-mo
280a0 73 74 20 73 69 62 6c 69 6e 67 20 69 73 20 74 68  st sibling is th
280b0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69  e right-most chi
280c0 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 20 2a 2f  ld of pParent */
280d0 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70  .    put4byte(&p
280e0 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
280f0 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
28100 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e 65  +8], pgnoNew[nNe
28110 77 2d 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  w-1]);.  }else{.
28120 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 6d 6f 73      /* Right-mos
28130 74 20 73 69 62 6c 69 6e 67 20 69 73 20 74 68 65  t sibling is the
28140 20 6c 65 66 74 20 63 68 69 6c 64 20 6f 66 20 74   left child of t
28150 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
28160 6e 20 70 50 61 72 65 6e 74 0a 20 20 20 20 2a 2a  n pParent.    **
28170 20 70 61 73 74 20 74 68 65 20 72 69 67 68 74 2d   past the right-
28180 6d 6f 73 74 20 64 69 76 69 64 65 72 20 65 6e 74  most divider ent
28190 72 79 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79  ry */.    put4by
281a0 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43  te(findOverflowC
281b0 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44  ell(pParent, nxD
281c0 69 76 29 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e 65  iv), pgnoNew[nNe
281d0 77 2d 31 5d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  w-1]);.  }..  /*
281e0 0a 20 20 2a 2a 20 52 65 70 61 72 65 6e 74 20 63  .  ** Reparent c
281f0 68 69 6c 64 72 65 6e 20 6f 66 20 61 6c 6c 20 63  hildren of all c
28200 65 6c 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ells..  */.  for
28210 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b  (i=0; i<nNew; i+
28220 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 70  +){.    rc = rep
28230 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73 28  arentChildPages(
28240 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 69  apNew[i]);.    i
28250 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
28260 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
28270 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 72  cleanup;.  }.  r
28280 63 20 3d 20 72 65 70 61 72 65 6e 74 43 68 69 6c  c = reparentChil
28290 64 50 61 67 65 73 28 70 50 61 72 65 6e 74 29 3b  dPages(pParent);
282a0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
282b0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61  E_OK ) goto bala
282c0 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 0a 20 20  nce_cleanup;..  
282d0 2f 2a 0a 20 20 2a 2a 20 42 61 6c 61 6e 63 65 20  /*.  ** Balance 
282e0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
282f0 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20    Note that the 
28300 63 75 72 72 65 6e 74 20 70 61 67 65 20 28 70 50  current page (pP
28310 61 67 65 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20  age) might.  ** 
28320 68 61 76 65 20 62 65 65 6e 20 61 64 64 65 64 20  have been added 
28330 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  to the freelist 
28340 73 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f 20 6c  so it might no l
28350 6f 6e 67 65 72 20 62 65 20 69 6e 69 74 69 61 6c  onger be initial
28360 69 7a 65 64 2e 0a 20 20 2a 2a 20 42 75 74 20 74  ized..  ** But t
28370 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 77  he parent page w
28380 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 69 6e  ill always be in
28390 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a  itialized..  */.
283a0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
283b0 74 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 72  t->isInit );.  r
283c0 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61 72  c = balance(pPar
283d0 65 6e 74 2c 20 30 29 3b 0a 20 20 0a 20 20 2f 2a  ent, 0);.  .  /*
283e0 0a 20 20 2a 2a 20 43 6c 65 61 6e 75 70 20 62 65  .  ** Cleanup be
283f0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
28400 20 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f 63 6c 65    */.balance_cle
28410 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 46 72  anup:.  sqliteFr
28420 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 66 6f  ee(apCell);.  fo
28430 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69  r(i=0; i<nOld; i
28440 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  ++){.    release
28450 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a  Page(apOld[i]);.
28460 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
28470 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nNew; i++){.   
28480 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4e   releasePage(apN
28490 65 77 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65  ew[i]);.  }.  re
284a0 6c 65 61 73 65 50 61 67 65 28 70 50 61 72 65 6e  leasePage(pParen
284b0 74 29 3b 0a 20 20 54 52 41 43 45 28 28 22 42 41  t);.  TRACE(("BA
284c0 4c 41 4e 43 45 3a 20 66 69 6e 69 73 68 65 64 20  LANCE: finished 
284d0 77 69 74 68 20 25 64 3a 20 6f 6c 64 3d 25 64 20  with %d: old=%d 
284e0 6e 65 77 3d 25 64 20 63 65 6c 6c 73 3d 25 64 5c  new=%d cells=%d\
284f0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 50  n",.          pP
28500 61 67 65 2d 3e 70 67 6e 6f 2c 20 6e 4f 6c 64 2c  age->pgno, nOld,
28510 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c 29 29 3b 0a   nNew, nCell));.
28520 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
28530 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
28540 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  ne is called for
28550 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
28560 66 20 61 20 62 74 72 65 65 20 77 68 65 6e 20 74  f a btree when t
28570 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20  he root.** page 
28580 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c  contains no cell
28590 73 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20 6f  s.  This is an o
285a0 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 6d 61  pportunity to ma
285b0 6b 65 20 74 68 65 20 74 72 65 65 0a 2a 2a 20 73  ke the tree.** s
285c0 68 61 6c 6c 6f 77 65 72 20 62 79 20 6f 6e 65 20  hallower by one 
285d0 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
285e0 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 73 68 61   int balance_sha
285f0 6c 6c 6f 77 65 72 28 4d 65 6d 50 61 67 65 20 2a  llower(MemPage *
28600 70 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67  pPage){.  MemPag
28610 65 20 2a 70 43 68 69 6c 64 3b 20 20 20 20 20 20  e *pChild;      
28620 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e         /* The on
28630 6c 79 20 63 68 69 6c 64 20 70 61 67 65 20 6f 66  ly child page of
28640 20 70 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f   pPage */.  Pgno
28650 20 70 67 6e 6f 43 68 69 6c 64 3b 20 20 20 20 20   pgnoChild;     
28660 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
28670 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 43 68 69   number for pChi
28680 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ld */.  int rc =
28690 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
286a0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
286b0 6f 64 65 20 66 72 6f 6d 20 73 75 62 70 72 6f 63  ode from subproc
286c0 65 64 75 72 65 73 20 2a 2f 0a 20 20 42 74 53 68  edures */.  BtSh
286d0 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20  ared *pBt;      
286e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
286f0 68 65 20 6d 61 69 6e 20 42 54 72 65 65 20 73 74  he main BTree st
28700 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74  ructure */.  int
28710 20 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 3b 20   mxCellPerPage; 
28720 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
28730 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63  imum number of c
28740 65 6c 6c 73 20 70 65 72 20 70 61 67 65 20 2a 2f  ells per page */
28750 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 3b 20  .  u8 **apCell; 
28760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28770 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 66 72 6f  /* All cells fro
28780 6d 20 70 61 67 65 73 20 62 65 69 6e 67 20 62 61  m pages being ba
28790 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20  lanced */.  int 
287a0 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  *szCell;        
287b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61           /* Loca
287c0 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65  l size of all ce
287d0 6c 6c 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  lls */..  assert
287e0 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  ( pPage->pParent
287f0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
28800 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30   pPage->nCell==0
28810 20 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67   );.  pBt = pPag
28820 65 2d 3e 70 42 74 3b 0a 20 20 6d 78 43 65 6c 6c  e->pBt;.  mxCell
28830 50 65 72 50 61 67 65 20 3d 20 4d 58 5f 43 45 4c  PerPage = MX_CEL
28840 4c 28 70 42 74 29 3b 0a 20 20 61 70 43 65 6c 6c  L(pBt);.  apCell
28850 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
28860 61 77 28 20 6d 78 43 65 6c 6c 50 65 72 50 61 67  aw( mxCellPerPag
28870 65 2a 28 73 69 7a 65 6f 66 28 75 38 2a 29 2b 73  e*(sizeof(u8*)+s
28880 69 7a 65 6f 66 28 69 6e 74 29 29 20 29 3b 0a 20  izeof(int)) );. 
28890 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29   if( apCell==0 )
288a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
288b0 4f 4d 45 4d 3b 0a 20 20 73 7a 43 65 6c 6c 20 3d  OMEM;.  szCell =
288c0 20 28 69 6e 74 2a 29 26 61 70 43 65 6c 6c 5b 6d   (int*)&apCell[m
288d0 78 43 65 6c 6c 50 65 72 50 61 67 65 5d 3b 0a 20  xCellPerPage];. 
288e0 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
288f0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 74   ){.    /* The t
28900 61 62 6c 65 20 69 73 20 63 6f 6d 70 6c 65 74 65  able is complete
28910 6c 79 20 65 6d 70 74 79 20 2a 2f 0a 20 20 20 20  ly empty */.    
28920 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
28930 20 65 6d 70 74 79 20 74 61 62 6c 65 20 25 64 5c   empty table %d\
28940 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  n", pPage->pgno)
28950 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
28960 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65  /* The root page
28970 20 69 73 20 65 6d 70 74 79 20 62 75 74 20 68 61   is empty but ha
28980 73 20 6f 6e 65 20 63 68 69 6c 64 2e 20 20 54 72  s one child.  Tr
28990 61 6e 73 66 65 72 20 74 68 65 0a 20 20 20 20 2a  ansfer the.    *
289a0 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  * information fr
289b0 6f 6d 20 74 68 61 74 20 6f 6e 65 20 63 68 69 6c  om that one chil
289c0 64 20 69 6e 74 6f 20 74 68 65 20 72 6f 6f 74 20  d into the root 
289d0 70 61 67 65 20 69 66 20 69 74 20 0a 20 20 20 20  page if it .    
289e0 2a 2a 20 77 69 6c 6c 20 66 69 74 2e 20 20 54 68  ** will fit.  Th
289f0 69 73 20 72 65 64 75 63 65 73 20 74 68 65 20 64  is reduces the d
28a00 65 70 74 68 20 6f 66 20 74 68 65 20 74 72 65 65  epth of the tree
28a10 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a   by one..    **.
28a20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 72 6f      ** If the ro
28a30 6f 74 20 70 61 67 65 20 69 73 20 70 61 67 65 20  ot page is page 
28a40 31 2c 20 69 74 20 68 61 73 20 6c 65 73 73 20 73  1, it has less s
28a50 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 74  pace available t
28a60 68 61 6e 0a 20 20 20 20 2a 2a 20 69 74 73 20 63  han.    ** its c
28a70 68 69 6c 64 20 28 64 75 65 20 74 6f 20 74 68 65  hild (due to the
28a80 20 31 30 30 20 62 79 74 65 20 68 65 61 64 65 72   100 byte header
28a90 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 74 20   that occurs at 
28aa0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20  the beginning.  
28ab0 20 20 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61    ** of the data
28ac0 62 61 73 65 20 66 6c 65 29 2c 20 73 6f 20 69 74  base fle), so it
28ad0 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61 62   might not be ab
28ae0 6c 65 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6f  le to hold all o
28af0 66 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 69 6e  f the .    ** in
28b00 66 6f 72 6d 61 74 69 6f 6e 20 63 75 72 72 65 6e  formation curren
28b10 74 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  tly contained in
28b20 20 74 68 65 20 63 68 69 6c 64 2e 20 20 49 66 20   the child.  If 
28b30 74 68 69 73 20 69 73 20 74 68 65 20 0a 20 20 20  this is the .   
28b40 20 2a 2a 20 63 61 73 65 2c 20 74 68 65 6e 20 64   ** case, then d
28b50 6f 20 6e 6f 74 20 64 6f 20 74 68 65 20 74 72 61  o not do the tra
28b60 6e 73 66 65 72 2e 20 20 4c 65 61 76 65 20 70 61  nsfer.  Leave pa
28b70 67 65 20 31 20 65 6d 70 74 79 20 65 78 63 65 70  ge 1 empty excep
28b80 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65  t.    ** for the
28b90 20 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 20 74   right-pointer t
28ba0 6f 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  o the child page
28bb0 2e 20 20 54 68 65 20 63 68 69 6c 64 20 70 61 67  .  The child pag
28bc0 65 20 62 65 63 6f 6d 65 73 0a 20 20 20 20 2a 2a  e becomes.    **
28bd0 20 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f   the virtual roo
28be0 74 20 6f 66 20 74 68 65 20 74 72 65 65 2e 0a 20  t of the tree.. 
28bf0 20 20 20 2a 2f 0a 20 20 20 20 70 67 6e 6f 43 68     */.    pgnoCh
28c00 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28 26  ild = get4byte(&
28c10 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
28c20 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
28c30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
28c40 67 6e 6f 43 68 69 6c 64 3e 30 20 29 3b 0a 20 20  gnoChild>0 );.  
28c50 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 43 68    assert( pgnoCh
28c60 69 6c 64 3c 3d 73 71 6c 69 74 65 33 50 61 67 65  ild<=sqlite3Page
28c70 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
28c80 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29  ->pBt->pPager) )
28c90 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 50 61  ;.    rc = getPa
28ca0 67 65 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70  ge(pPage->pBt, p
28cb0 67 6e 6f 43 68 69 6c 64 2c 20 26 70 43 68 69 6c  gnoChild, &pChil
28cc0 64 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  d, 0);.    if( r
28cd0 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61  c ) goto end_sha
28ce0 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20  llow_balance;.  
28cf0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 67 6e    if( pPage->pgn
28d00 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 63  o==1 ){.      rc
28d10 20 3d 20 69 6e 69 74 50 61 67 65 28 70 43 68 69   = initPage(pChi
28d20 6c 64 2c 20 70 50 61 67 65 29 3b 0a 20 20 20 20  ld, pPage);.    
28d30 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
28d40 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61  end_shallow_bala
28d50 6e 63 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nce;.      asser
28d60 74 28 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72  t( pChild->nOver
28d70 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20  flow==0 );.     
28d80 20 69 66 28 20 70 43 68 69 6c 64 2d 3e 6e 46 72   if( pChild->nFr
28d90 65 65 3e 3d 31 30 30 20 29 7b 0a 20 20 20 20 20  ee>=100 ){.     
28da0 20 20 20 2f 2a 20 54 68 65 20 63 68 69 6c 64 20     /* The child 
28db0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 6c 6c  information will
28dc0 20 66 69 74 20 6f 6e 20 74 68 65 20 72 6f 6f 74   fit on the root
28dd0 20 70 61 67 65 2c 20 73 6f 20 64 6f 20 74 68 65   page, so do the
28de0 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 79  .        ** copy
28df0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
28e00 69 3b 0a 20 20 20 20 20 20 20 20 7a 65 72 6f 50  i;.        zeroP
28e10 61 67 65 28 70 50 61 67 65 2c 20 70 43 68 69 6c  age(pPage, pChil
28e20 64 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20  d->aData[0]);.  
28e30 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
28e40 3c 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20  <pChild->nCell; 
28e50 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
28e60 61 70 43 65 6c 6c 5b 69 5d 20 3d 20 66 69 6e 64  apCell[i] = find
28e70 43 65 6c 6c 28 70 43 68 69 6c 64 2c 69 29 3b 0a  Cell(pChild,i);.
28e80 20 20 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c            szCell
28e90 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  [i] = cellSizePt
28ea0 72 28 70 43 68 69 6c 64 2c 20 61 70 43 65 6c 6c  r(pChild, apCell
28eb0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  [i]);.        }.
28ec0 20 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 65          assemble
28ed0 50 61 67 65 28 70 50 61 67 65 2c 20 70 43 68 69  Page(pPage, pChi
28ee0 6c 64 2d 3e 6e 43 65 6c 6c 2c 20 61 70 43 65 6c  ld->nCell, apCel
28ef0 6c 2c 20 73 7a 43 65 6c 6c 29 3b 0a 20 20 20 20  l, szCell);.    
28f00 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20      /* Copy the 
28f10 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 20 6f 66  right-pointer of
28f20 20 74 68 65 20 63 68 69 6c 64 20 74 6f 20 74 68   the child to th
28f30 65 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20  e parent. */.   
28f40 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
28f50 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
28f60 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  e->hdrOffset+8],
28f70 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 65   .            ge
28f80 74 34 62 79 74 65 28 26 70 43 68 69 6c 64 2d 3e  t4byte(&pChild->
28f90 61 44 61 74 61 5b 70 43 68 69 6c 64 2d 3e 68 64  aData[pChild->hd
28fa0 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20  rOffset+8]));.  
28fb0 20 20 20 20 20 20 66 72 65 65 50 61 67 65 28 70        freePage(p
28fc0 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 20 20  Child);.        
28fd0 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
28fe0 20 63 68 69 6c 64 20 25 64 20 74 72 61 6e 73 66   child %d transf
28ff0 65 72 20 74 6f 20 70 61 67 65 20 31 5c 6e 22 2c  er to page 1\n",
29000 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b   pChild->pgno));
29010 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
29020 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68 69        /* The chi
29030 6c 64 20 68 61 73 20 6d 6f 72 65 20 69 6e 66 6f  ld has more info
29040 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 77 69 6c  rmation that wil
29050 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 72 6f 6f  l fit on the roo
29060 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  t..        ** Th
29070 65 20 74 72 65 65 20 69 73 20 61 6c 72 65 61 64  e tree is alread
29080 79 20 62 61 6c 61 6e 63 65 64 2e 20 20 44 6f 20  y balanced.  Do 
29090 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  nothing. */.    
290a0 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c 41      TRACE(("BALA
290b0 4e 43 45 3a 20 63 68 69 6c 64 20 25 64 20 77 69  NCE: child %d wi
290c0 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20 70 61  ll not fit on pa
290d0 67 65 20 31 5c 6e 22 2c 20 70 43 68 69 6c 64 2d  ge 1\n", pChild-
290e0 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d  >pgno));.      }
290f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
29100 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 2d 3e    memcpy(pPage->
29110 61 44 61 74 61 2c 20 70 43 68 69 6c 64 2d 3e 61  aData, pChild->a
29120 44 61 74 61 2c 20 70 50 61 67 65 2d 3e 70 42 74  Data, pPage->pBt
29130 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  ->usableSize);. 
29140 20 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e       pPage->isIn
29150 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  it = 0;.      pP
29160 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 30  age->pParent = 0
29170 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 69  ;.      rc = ini
29180 74 50 61 67 65 28 70 50 61 67 65 2c 20 30 29 3b  tPage(pPage, 0);
29190 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
291a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
291b0 20 20 20 20 20 20 66 72 65 65 50 61 67 65 28 70        freePage(p
291c0 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 54 52  Child);.      TR
291d0 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 74  ACE(("BALANCE: t
291e0 72 61 6e 73 66 65 72 20 63 68 69 6c 64 20 25 64  ransfer child %d
291f0 20 69 6e 74 6f 20 72 6f 6f 74 20 25 64 5c 6e 22   into root %d\n"
29200 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
29210 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c 20 70 50  pChild->pgno, pP
29220 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  age->pgno));.   
29230 20 7d 0a 20 20 20 20 72 63 20 3d 20 72 65 70 61   }.    rc = repa
29240 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73 28 70  rentChildPages(p
29250 50 61 67 65 29 3b 0a 20 20 20 20 61 73 73 65 72  Page);.    asser
29260 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
29270 6c 6f 77 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65  low==0 );.#ifnde
29280 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
29290 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
292a0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
292b0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
292c0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
292d0 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20  i<pPage->nCell; 
292e0 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 20 20 72  i++){ .        r
292f0 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66  c = ptrmapPutOvf
29300 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20  l(pPage, i);.   
29310 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
29320 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
29330 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61      goto end_sha
29340 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20  llow_balance;.  
29350 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
29360 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
29370 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
29380 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 68  OK ) goto end_sh
29390 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20  allow_balance;. 
293a0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
293b0 43 68 69 6c 64 29 3b 0a 20 20 7d 0a 65 6e 64 5f  Child);.  }.end_
293c0 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3a  shallow_balance:
293d0 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 61 70  .  sqliteFree(ap
293e0 43 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20  Cell);.  return 
293f0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
29400 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 6f  e root page is o
29410 76 65 72 66 75 6c 6c 0a 2a 2a 0a 2a 2a 20 57 68  verfull.**.** Wh
29420 65 6e 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c  en this happens,
29430 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 68   Create a new ch
29440 69 6c 64 20 70 61 67 65 20 61 6e 64 20 63 6f 70  ild page and cop
29450 79 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  y the.** content
29460 73 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 69 6e  s of the root in
29470 74 6f 20 74 68 65 20 63 68 69 6c 64 2e 20 20 54  to the child.  T
29480 68 65 6e 20 6d 61 6b 65 20 74 68 65 20 72 6f 6f  hen make the roo
29490 74 0a 2a 2a 20 70 61 67 65 20 61 6e 20 65 6d 70  t.** page an emp
294a0 74 79 20 70 61 67 65 20 77 69 74 68 20 72 69 67  ty page with rig
294b0 68 74 43 68 69 6c 64 20 70 6f 69 6e 74 69 6e 67  htChild pointing
294c0 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20 63   to the new.** c
294d0 68 69 6c 64 2e 20 20 20 46 69 6e 61 6c 6c 79 2c  hild.   Finally,
294e0 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 69 6e   call balance_in
294f0 74 65 72 6e 61 6c 28 29 20 6f 6e 20 74 68 65 20  ternal() on the 
29500 6e 65 77 20 63 68 69 6c 64 0a 2a 2a 20 74 6f 20  new child.** to 
29510 63 61 75 73 65 20 69 74 20 74 6f 20 73 70 6c 69  cause it to spli
29520 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
29530 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28   balance_deeper(
29540 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
29550 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
29560 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
29570 20 76 61 6c 75 65 20 66 72 6f 6d 20 73 75 62 70   value from subp
29580 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20 4d  rocedures */.  M
29590 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 3b 20  emPage *pChild; 
295a0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
295b0 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67   a new child pag
295c0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
295d0 43 68 69 6c 64 3b 20 20 20 20 20 2f 2a 20 50 61  Child;     /* Pa
295e0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
295f0 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20   new child page 
29600 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
29610 42 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  Bt;         /* T
29620 68 65 20 42 54 72 65 65 20 2a 2f 0a 20 20 69 6e  he BTree */.  in
29630 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20  t usableSize;   
29640 20 20 2f 2a 20 54 6f 74 61 6c 20 75 73 61 62 6c    /* Total usabl
29650 65 20 73 69 7a 65 20 6f 66 20 61 20 70 61 67 65  e size of a page
29660 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
29670 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
29680 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 72 65  tent of the pare
29690 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  nt page */.  u8 
296a0 2a 63 64 61 74 61 3b 20 20 20 20 20 20 20 20 20  *cdata;         
296b0 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74   /* Content of t
296c0 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f  he child page */
296d0 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20  .  int hdr;     
296e0 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
296f0 20 74 6f 20 70 61 67 65 20 68 65 61 64 65 72 20   to page header 
29700 69 6e 20 70 61 72 65 6e 74 20 2a 2f 0a 20 20 69  in parent */.  i
29710 6e 74 20 62 72 6b 3b 20 20 20 20 20 20 20 20 20  nt brk;         
29720 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
29730 63 6f 6e 74 65 6e 74 20 6f 66 20 66 69 72 73 74  content of first
29740 20 63 65 6c 6c 20 69 6e 20 70 61 72 65 6e 74 20   cell in parent 
29750 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
29760 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20  age->pParent==0 
29770 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
29780 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20  ge->nOverflow>0 
29790 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65  );.  pBt = pPage
297a0 2d 3e 70 42 74 3b 0a 20 20 72 63 20 3d 20 61 6c  ->pBt;.  rc = al
297b0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
297c0 70 42 74 2c 20 26 70 43 68 69 6c 64 2c 20 26 70  pBt, &pChild, &p
297d0 67 6e 6f 43 68 69 6c 64 2c 20 70 50 61 67 65 2d  gnoChild, pPage-
297e0 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 69 66 28  >pgno, 0);.  if(
297f0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
29800 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
29810 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
29820 6c 65 28 70 43 68 69 6c 64 2d 3e 70 44 62 50 61  le(pChild->pDbPa
29830 67 65 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53  ge) );.  usableS
29840 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
29850 65 53 69 7a 65 3b 0a 20 20 64 61 74 61 20 3d 20  eSize;.  data = 
29860 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
29870 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
29880 4f 66 66 73 65 74 3b 0a 20 20 62 72 6b 20 3d 20  Offset;.  brk = 
29890 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
298a0 64 72 2b 35 5d 29 3b 0a 20 20 63 64 61 74 61 20  dr+5]);.  cdata 
298b0 3d 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 3b  = pChild->aData;
298c0 0a 20 20 6d 65 6d 63 70 79 28 63 64 61 74 61 2c  .  memcpy(cdata,
298d0 20 26 64 61 74 61 5b 68 64 72 5d 2c 20 70 50 61   &data[hdr], pPa
298e0 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32  ge->cellOffset+2
298f0 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 68 64  *pPage->nCell-hd
29900 72 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 63 64  r);.  memcpy(&cd
29910 61 74 61 5b 62 72 6b 5d 2c 20 26 64 61 74 61 5b  ata[brk], &data[
29920 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65  brk], usableSize
29930 2d 62 72 6b 29 3b 0a 20 20 61 73 73 65 72 74 28  -brk);.  assert(
29940 20 70 43 68 69 6c 64 2d 3e 69 73 49 6e 69 74 3d   pChild->isInit=
29950 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 69 6e 69  =0 );.  rc = ini
29960 74 50 61 67 65 28 70 43 68 69 6c 64 2c 20 70 50  tPage(pChild, pP
29970 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
29980 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 64 65 65   goto balancedee
29990 70 65 72 5f 6f 75 74 3b 0a 20 20 6d 65 6d 63 70  per_out;.  memcp
299a0 79 28 70 43 68 69 6c 64 2d 3e 61 4f 76 66 6c 2c  y(pChild->aOvfl,
299b0 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 2c 20 70   pPage->aOvfl, p
299c0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2a  Page->nOverflow*
299d0 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f  sizeof(pPage->aO
299e0 76 66 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 68 69  vfl[0]));.  pChi
299f0 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  ld->nOverflow = 
29a00 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
29a10 3b 0a 20 20 69 66 28 20 70 43 68 69 6c 64 2d 3e  ;.  if( pChild->
29a20 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  nOverflow ){.   
29a30 20 70 43 68 69 6c 64 2d 3e 6e 46 72 65 65 20 3d   pChild->nFree =
29a40 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   0;.  }.  assert
29a50 28 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3d  ( pChild->nCell=
29a60 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  =pPage->nCell );
29a70 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67  .  zeroPage(pPag
29a80 65 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61  e, pChild->aData
29a90 5b 30 5d 20 26 20 7e 50 54 46 5f 4c 45 41 46 29  [0] & ~PTF_LEAF)
29aa0 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
29ab0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
29ac0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
29ad0 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 20 20 54 52  pgnoChild);.  TR
29ae0 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63  ACE(("BALANCE: c
29af0 6f 70 79 20 72 6f 6f 74 20 25 64 20 69 6e 74 6f  opy root %d into
29b00 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70   %d\n", pPage->p
29b10 67 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e  gno, pChild->pgn
29b20 6f 29 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  o));.#ifndef SQL
29b30 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
29b40 55 55 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e 61  UUM.  if( pBt->a
29b50 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
29b60 20 69 6e 74 20 69 3b 0a 20 20 20 20 72 63 20 3d   int i;.    rc =
29b70 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
29b80 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c 20 50 54  pChild->pgno, PT
29b90 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 67  RMAP_BTREE, pPag
29ba0 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66  e->pgno);.    if
29bb0 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
29bc0 6e 63 65 64 65 65 70 65 72 5f 6f 75 74 3b 0a 20  ncedeeper_out;. 
29bd0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43     for(i=0; i<pC
29be0 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  hild->nCell; i++
29bf0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74  ){.      rc = pt
29c00 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 43 68 69  rmapPutOvfl(pChi
29c10 6c 64 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66  ld, i);.      if
29c20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
29c30 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
29c40 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
29c50 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
29c60 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f   rc = balance_no
29c70 6e 72 6f 6f 74 28 70 43 68 69 6c 64 29 3b 0a 0a  nroot(pChild);..
29c80 62 61 6c 61 6e 63 65 64 65 65 70 65 72 5f 6f 75  balancedeeper_ou
29c90 74 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  t:.  releasePage
29ca0 28 70 43 68 69 6c 64 29 3b 0a 20 20 72 65 74 75  (pChild);.  retu
29cb0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
29cc0 44 65 63 69 64 65 20 69 66 20 74 68 65 20 70 61  Decide if the pa
29cd0 67 65 20 70 50 61 67 65 20 6e 65 65 64 73 20 74  ge pPage needs t
29ce0 6f 20 62 65 20 62 61 6c 61 6e 63 65 64 2e 20 20  o be balanced.  
29cf0 49 66 20 62 61 6c 61 6e 63 69 6e 67 20 69 73 0a  If balancing is.
29d00 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 63 61 6c  ** required, cal
29d10 6c 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  l the appropriat
29d20 65 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74  e balancing rout
29d30 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ine..*/.static i
29d40 6e 74 20 62 61 6c 61 6e 63 65 28 4d 65 6d 50 61  nt balance(MemPa
29d50 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
29d60 6e 73 65 72 74 29 7b 0a 20 20 69 6e 74 20 72 63  nsert){.  int rc
29d70 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
29d80 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65  if( pPage->pPare
29d90 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  nt==0 ){.    if(
29da0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
29db0 77 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  w>0 ){.      rc 
29dc0 3d 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72  = balance_deeper
29dd0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  (pPage);.    }. 
29de0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
29df0 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 2d 3e 6e  E_OK && pPage->n
29e00 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Cell==0 ){.     
29e10 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 73 68   rc = balance_sh
29e20 61 6c 6c 6f 77 65 72 28 70 50 61 67 65 29 3b 0a  allower(pPage);.
29e30 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
29e40 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f     if( pPage->nO
29e50 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20 0a 20 20  verflow>0 || .  
29e60 20 20 20 20 20 20 28 21 69 6e 73 65 72 74 20 26        (!insert &
29e70 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 70  & pPage->nFree>p
29e80 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
29e90 65 53 69 7a 65 2a 32 2f 33 29 20 29 7b 0a 20 20  eSize*2/3) ){.  
29ea0 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
29eb0 5f 6e 6f 6e 72 6f 6f 74 28 70 50 61 67 65 29 3b  _nonroot(pPage);
29ec0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
29ed0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
29ee0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
29ef0 65 63 6b 73 20 61 6c 6c 20 63 75 72 73 6f 72 73  ecks all cursors
29f00 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 74   that point to t
29f10 61 62 6c 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a  able pgnoRoot..*
29f20 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 6f 73  * If any of thos
29f30 65 20 63 75 72 73 6f 72 73 20 77 65 72 65 20 6f  e cursors were o
29f40 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61  pened with wrFla
29f50 67 3d 3d 30 20 69 6e 20 61 20 64 69 66 66 65 72  g==0 in a differ
29f60 65 6e 74 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ent.** database 
29f70 63 6f 6e 6e 65 63 74 69 6f 6e 20 28 61 20 64 61  connection (a da
29f80 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
29f90 6e 20 74 68 61 74 20 73 68 61 72 65 73 20 74 68  n that shares th
29fa0 65 20 70 61 67 65 72 0a 2a 2a 20 63 61 63 68 65  e pager.** cache
29fb0 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e   with the curren
29fc0 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 20 61 6e  t connection) an
29fd0 64 20 74 68 61 74 20 6f 74 68 65 72 20 63 6f 6e  d that other con
29fe0 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20 6e  nection .** is n
29ff0 6f 74 20 69 6e 20 74 68 65 20 52 65 61 64 55 6e  ot in the ReadUn
2a000 63 6f 6d 6d 6d 69 74 74 65 64 20 73 74 61 74 65  commmitted state
2a010 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
2a020 69 6e 65 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20  ine returns .** 
2a030 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 2a  SQLITE_LOCKED..*
2a040 2a 0a 2a 2a 20 49 6e 20 61 64 64 69 74 69 6f 6e  *.** In addition
2a050 20 74 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f 72   to checking for
2a060 20 72 65 61 64 2d 6c 6f 63 6b 73 20 28 77 68 65   read-locks (whe
2a070 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 0a  re a read-lock .
2a080 2a 2a 20 6d 65 61 6e 73 20 61 20 63 75 72 73 6f  ** means a curso
2a090 72 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72  r opened with wr
2a0a0 46 6c 61 67 3d 3d 30 29 20 74 68 69 73 20 72 6f  Flag==0) this ro
2a0b0 75 74 69 6e 65 20 61 6c 73 6f 20 6d 6f 76 65 73  utine also moves
2a0c0 0a 2a 2a 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  .** all cursors 
2a0d0 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 73 6f  write cursors so
2a0e0 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20 70   that they are p
2a0f0 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 0a  ointing to the .
2a100 2a 2a 20 66 69 72 73 74 20 43 65 6c 6c 20 6f 6e  ** first Cell on
2a110 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2e 20   the root page. 
2a120 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
2a130 72 79 20 62 65 63 61 75 73 65 20 61 6e 20 69 6e  ry because an in
2a140 73 65 72 74 20 0a 2a 2a 20 6f 72 20 64 65 6c 65  sert .** or dele
2a150 74 65 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  te might change 
2a160 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 65  the number of ce
2a170 6c 6c 73 20 6f 6e 20 61 20 70 61 67 65 20 6f 72  lls on a page or
2a180 20 64 65 6c 65 74 65 0a 2a 2a 20 61 20 70 61 67   delete.** a pag
2a190 65 20 65 6e 74 69 72 65 6c 79 20 61 6e 64 20 77  e entirely and w
2a1a0 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f  e do not want to
2a1b0 20 6c 65 61 76 65 20 61 6e 79 20 63 75 72 73 6f   leave any curso
2a1c0 72 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20  rs .** pointing 
2a1d0 74 6f 20 6e 6f 6e 2d 65 78 69 73 74 61 6e 74 20  to non-existant 
2a1e0 70 61 67 65 73 20 6f 72 20 63 65 6c 6c 73 2e 0a  pages or cells..
2a1f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68  */.static int ch
2a200 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 42 74 72  eckReadLocks(Btr
2a210 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f  ee *pBtree, Pgno
2a220 20 70 67 6e 6f 52 6f 6f 74 2c 20 42 74 43 75 72   pgnoRoot, BtCur
2a230 73 6f 72 20 2a 70 45 78 63 6c 75 64 65 29 7b 0a  sor *pExclude){.
2a240 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
2a250 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
2a260 20 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20   pBtree->pBt;.  
2a270 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 42  sqlite3 *db = pB
2a280 74 72 65 65 2d 3e 70 53 71 6c 69 74 65 3b 0a 20  tree->pSqlite;. 
2a290 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72   for(p=pBt->pCur
2a2a0 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
2a2b0 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 3d 3d  xt){.    if( p==
2a2c0 70 45 78 63 6c 75 64 65 20 29 20 63 6f 6e 74 69  pExclude ) conti
2a2d0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  nue;.    if( p->
2a2e0 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2a2f0 41 4c 49 44 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ALID ) continue;
2a300 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f  .    if( p->pgno
2a310 52 6f 6f 74 21 3d 70 67 6e 6f 52 6f 6f 74 20 29  Root!=pgnoRoot )
2a320 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
2a330 66 28 20 70 2d 3e 77 72 46 6c 61 67 3d 3d 30 20  f( p->wrFlag==0 
2a340 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2a350 20 2a 64 62 4f 74 68 65 72 20 3d 20 70 2d 3e 70   *dbOther = p->p
2a360 42 74 72 65 65 2d 3e 70 53 71 6c 69 74 65 3b 0a  Btree->pSqlite;.
2a370 20 20 20 20 20 20 69 66 28 20 64 62 4f 74 68 65        if( dbOthe
2a380 72 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20 20 20  r==0 ||.        
2a390 20 28 64 62 4f 74 68 65 72 21 3d 64 62 20 26 26   (dbOther!=db &&
2a3a0 20 28 64 62 4f 74 68 65 72 2d 3e 66 6c 61 67 73   (dbOther->flags
2a3b0 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e   & SQLITE_ReadUn
2a3c0 63 6f 6d 6d 69 74 74 65 64 29 3d 3d 30 29 20 29  committed)==0) )
2a3d0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2a3e0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a   SQLITE_LOCKED;.
2a3f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
2a400 65 20 69 66 28 20 70 2d 3e 70 50 61 67 65 2d 3e  e if( p->pPage->
2a410 70 67 6e 6f 21 3d 70 2d 3e 70 67 6e 6f 52 6f 6f  pgno!=p->pgnoRoo
2a420 74 20 29 7b 0a 20 20 20 20 20 20 6d 6f 76 65 54  t ){.      moveT
2a430 6f 52 6f 6f 74 28 70 29 3b 0a 20 20 20 20 7d 0a  oRoot(p);.    }.
2a440 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
2a450 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
2a460 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65   Insert a new re
2a470 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 42 54  cord into the BT
2a480 72 65 65 2e 20 20 54 68 65 20 6b 65 79 20 69 73  ree.  The key is
2a490 20 67 69 76 65 6e 20 62 79 20 28 70 4b 65 79 2c   given by (pKey,
2a4a0 6e 4b 65 79 29 0a 2a 2a 20 61 6e 64 20 74 68 65  nKey).** and the
2a4b0 20 64 61 74 61 20 69 73 20 67 69 76 65 6e 20 62   data is given b
2a4c0 79 20 28 70 44 61 74 61 2c 6e 44 61 74 61 29 2e  y (pData,nData).
2a4d0 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
2a4e0 75 73 65 64 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20  used only to.** 
2a4f0 64 65 66 69 6e 65 20 77 68 61 74 20 74 61 62 6c  define what tabl
2a500 65 20 74 68 65 20 72 65 63 6f 72 64 20 73 68 6f  e the record sho
2a510 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65 64 20  uld be inserted 
2a520 69 6e 74 6f 2e 20 20 54 68 65 20 63 75 72 73 6f  into.  The curso
2a530 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f 69  r.** is left poi
2a540 6e 74 69 6e 67 20 61 74 20 61 20 72 61 6e 64 6f  nting at a rando
2a550 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  m location..**.*
2a560 2a 20 46 6f 72 20 61 6e 20 49 4e 54 4b 45 59 20  * For an INTKEY 
2a570 74 61 62 6c 65 2c 20 6f 6e 6c 79 20 74 68 65 20  table, only the 
2a580 6e 4b 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68  nKey value of th
2a590 65 20 6b 65 79 20 69 73 20 75 73 65 64 2e 20 20  e key is used.  
2a5a0 70 4b 65 79 20 69 73 0a 2a 2a 20 69 67 6e 6f 72  pKey is.** ignor
2a5b0 65 64 2e 20 20 46 6f 72 20 61 20 5a 45 52 4f 44  ed.  For a ZEROD
2a5c0 41 54 41 20 74 61 62 6c 65 2c 20 74 68 65 20 70  ATA table, the p
2a5d0 44 61 74 61 20 61 6e 64 20 6e 44 61 74 61 20 61  Data and nData a
2a5e0 72 65 20 62 6f 74 68 20 69 67 6e 6f 72 65 64 2e  re both ignored.
2a5f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
2a600 74 72 65 65 49 6e 73 65 72 74 28 0a 20 20 42 74  treeInsert(.  Bt
2a610 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
2a620 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a630 49 6e 73 65 72 74 20 64 61 74 61 20 69 6e 74 6f  Insert data into
2a640 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20 74 68   the table of th
2a650 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63  is cursor */.  c
2a660 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
2a670 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a   i64 nKey,    /*
2a680 20 54 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20   The key of the 
2a690 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  new record */.  
2a6a0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74  const void *pDat
2a6b0 61 2c 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 2f  a, int nData,  /
2a6c0 2a 20 54 68 65 20 64 61 74 61 20 6f 66 20 74 68  * The data of th
2a6d0 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a  e new record */.
2a6e0 20 20 69 6e 74 20 61 70 70 65 6e 64 42 69 61 73    int appendBias
2a6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a700 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
2a710 20 69 73 20 6c 69 6b 65 6c 79 20 61 6e 20 61 70   is likely an ap
2a720 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  pend */.){.  int
2a730 20 72 63 3b 0a 20 20 69 6e 74 20 6c 6f 63 3b 0a   rc;.  int loc;.
2a740 20 20 69 6e 74 20 73 7a 4e 65 77 3b 0a 20 20 4d    int szNew;.  M
2a750 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
2a760 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
2a770 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70   pCur->pBtree->p
2a780 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  Bt;.  unsigned c
2a790 68 61 72 20 2a 6f 6c 64 43 65 6c 6c 3b 0a 20 20  har *oldCell;.  
2a7a0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6e  unsigned char *n
2a7b0 65 77 43 65 6c 6c 20 3d 20 30 3b 0a 0a 20 20 69  ewCell = 0;..  i
2a7c0 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  f( pBt->inTransa
2a7d0 63 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 57 52 49  ction!=TRANS_WRI
2a7e0 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73  TE ){.    /* Mus
2a7f0 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61  t start a transa
2a800 63 74 69 6f 6e 20 62 65 66 6f 72 65 20 64 6f 69  ction before doi
2a810 6e 67 20 61 6e 20 69 6e 73 65 72 74 20 2a 2f 0a  ng an insert */.
2a820 20 20 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e      return pBt->
2a830 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54  readOnly ? SQLIT
2a840 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c  E_READONLY : SQL
2a850 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
2a860 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72   assert( !pBt->r
2a870 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 69 66 28  eadOnly );.  if(
2a880 20 21 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29   !pCur->wrFlag )
2a890 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2a8a0 49 54 45 5f 50 45 52 4d 3b 20 20 20 2f 2a 20 43  ITE_PERM;   /* C
2a8b0 75 72 73 6f 72 20 6e 6f 74 20 6f 70 65 6e 20 66  ursor not open f
2a8c0 6f 72 20 77 72 69 74 69 6e 67 20 2a 2f 0a 20 20  or writing */.  
2a8d0 7d 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65 61  }.  if( checkRea
2a8e0 64 4c 6f 63 6b 73 28 70 43 75 72 2d 3e 70 42 74  dLocks(pCur->pBt
2a8f0 72 65 65 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ree, pCur->pgnoR
2a900 6f 6f 74 2c 20 70 43 75 72 29 20 29 7b 0a 20 20  oot, pCur) ){.  
2a910 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2a920 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54 68 65 20 74  LOCKED; /* The t
2a930 61 62 6c 65 20 70 43 75 72 20 70 6f 69 6e 74 73  able pCur points
2a940 20 74 6f 20 68 61 73 20 61 20 72 65 61 64 20 6c   to has a read l
2a950 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a  ock */.  }..  /*
2a960 20 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69   Save the positi
2a970 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68 65 72  ons of any other
2a980 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
2a990 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20   this table */. 
2a9a0 20 63 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69   clearCursorPosi
2a9b0 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
2a9c0 28 20 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b  ( .    SQLITE_OK
2a9d0 21 3d 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43  !=(rc = saveAllC
2a9e0 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72  ursors(pBt, pCur
2a9f0 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72  ->pgnoRoot, pCur
2aa00 29 29 20 7c 7c 0a 20 20 20 20 53 51 4c 49 54 45  )) ||.    SQLITE
2aa10 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
2aa20 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 43  e3BtreeMoveto(pC
2aa30 75 72 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20  ur, pKey, nKey, 
2aa40 61 70 70 65 6e 64 42 69 61 73 2c 20 26 6c 6f 63  appendBias, &loc
2aa50 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  )).  ){.    retu
2aa60 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 50  rn rc;.  }..  pP
2aa70 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
2aa80 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  e;.  assert( pPa
2aa90 67 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 6e 4b  ge->intKey || nK
2aaa0 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ey>=0 );.  asser
2aab0 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 7c  t( pPage->leaf |
2aac0 7c 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 44 61  | !pPage->leafDa
2aad0 74 61 20 29 3b 0a 20 20 54 52 41 43 45 28 28 22  ta );.  TRACE(("
2aae0 49 4e 53 45 52 54 3a 20 74 61 62 6c 65 3d 25 64  INSERT: table=%d
2aaf0 20 6e 6b 65 79 3d 25 6c 6c 64 20 6e 64 61 74 61   nkey=%lld ndata
2ab00 3d 25 64 20 70 61 67 65 3d 25 64 20 25 73 5c 6e  =%d page=%d %s\n
2ab10 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  ",.          pCu
2ab20 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 6e 4b 65  r->pgnoRoot, nKe
2ab30 79 2c 20 6e 44 61 74 61 2c 20 70 50 61 67 65 2d  y, nData, pPage-
2ab40 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  >pgno,.         
2ab50 20 6c 6f 63 3d 3d 30 20 3f 20 22 6f 76 65 72 77   loc==0 ? "overw
2ab60 72 69 74 65 22 20 3a 20 22 6e 65 77 20 65 6e 74  rite" : "new ent
2ab70 72 79 22 29 29 3b 0a 20 20 61 73 73 65 72 74 28  ry"));.  assert(
2ab80 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
2ab90 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
2aba0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
2abb0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
2abc0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2abd0 3b 0a 20 20 6e 65 77 43 65 6c 6c 20 3d 20 73 71  ;.  newCell = sq
2abe0 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 4d  liteMallocRaw( M
2abf0 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
2ac00 20 29 3b 0a 20 20 69 66 28 20 6e 65 77 43 65 6c   );.  if( newCel
2ac10 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  l==0 ) return SQ
2ac20 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63  LITE_NOMEM;.  rc
2ac30 20 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50   = fillInCell(pP
2ac40 61 67 65 2c 20 6e 65 77 43 65 6c 6c 2c 20 70 4b  age, newCell, pK
2ac50 65 79 2c 20 6e 4b 65 79 2c 20 70 44 61 74 61 2c  ey, nKey, pData,
2ac60 20 6e 44 61 74 61 2c 20 26 73 7a 4e 65 77 29 3b   nData, &szNew);
2ac70 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
2ac80 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 61   end_insert;.  a
2ac90 73 73 65 72 74 28 20 73 7a 4e 65 77 3d 3d 63 65  ssert( szNew==ce
2aca0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
2acb0 20 6e 65 77 43 65 6c 6c 29 20 29 3b 0a 20 20 61   newCell) );.  a
2acc0 73 73 65 72 74 28 20 73 7a 4e 65 77 3c 3d 4d 58  ssert( szNew<=MX
2acd0 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
2ace0 29 3b 0a 20 20 69 66 28 20 6c 6f 63 3d 3d 30 20  );.  if( loc==0 
2acf0 26 26 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  && CURSOR_VALID=
2ad00 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
2ad10 0a 20 20 20 20 69 6e 74 20 73 7a 4f 6c 64 3b 0a  .    int szOld;.
2ad20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2ad30 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72  ->idx>=0 && pCur
2ad40 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65  ->idx<pPage->nCe
2ad50 6c 6c 20 29 3b 0a 20 20 20 20 6f 6c 64 43 65 6c  ll );.    oldCel
2ad60 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
2ad70 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 3b 0a  ge, pCur->idx);.
2ad80 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
2ad90 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 6d 65  leaf ){.      me
2ada0 6d 63 70 79 28 6e 65 77 43 65 6c 6c 2c 20 6f 6c  mcpy(newCell, ol
2adb0 64 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 7d  dCell, 4);.    }
2adc0 0a 20 20 20 20 73 7a 4f 6c 64 20 3d 20 63 65 6c  .    szOld = cel
2add0 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
2ade0 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20 72 63  oldCell);.    rc
2adf0 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61   = clearCell(pPa
2ae00 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20  ge, oldCell);.  
2ae10 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2ae20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20  end_insert;.    
2ae30 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20  dropCell(pPage, 
2ae40 70 43 75 72 2d 3e 69 64 78 2c 20 73 7a 4f 6c 64  pCur->idx, szOld
2ae50 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  );.  }else if( l
2ae60 6f 63 3c 30 20 26 26 20 70 50 61 67 65 2d 3e 6e  oc<0 && pPage->n
2ae70 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 61 73  Cell>0 ){.    as
2ae80 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61  sert( pPage->lea
2ae90 66 20 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69  f );.    pCur->i
2aea0 64 78 2b 2b 3b 0a 20 20 20 20 70 43 75 72 2d 3e  dx++;.    pCur->
2aeb0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
2aec0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
2aed0 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66  ert( pPage->leaf
2aee0 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 69   );.  }.  rc = i
2aef0 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 67 65 2c  nsertCell(pPage,
2af00 20 70 43 75 72 2d 3e 69 64 78 2c 20 6e 65 77 43   pCur->idx, newC
2af10 65 6c 6c 2c 20 73 7a 4e 65 77 2c 20 30 2c 20 30  ell, szNew, 0, 0
2af20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
2af30 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e  ITE_OK ) goto en
2af40 64 5f 69 6e 73 65 72 74 3b 0a 20 20 72 63 20 3d  d_insert;.  rc =
2af50 20 62 61 6c 61 6e 63 65 28 70 50 61 67 65 2c 20   balance(pPage, 
2af60 31 29 3b 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33  1);.  /* sqlite3
2af70 42 74 72 65 65 50 61 67 65 44 75 6d 70 28 70 43  BtreePageDump(pC
2af80 75 72 2d 3e 70 42 74 2c 20 70 43 75 72 2d 3e 70  ur->pBt, pCur->p
2af90 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b 20 2a 2f 0a  gnoRoot, 1); */.
2afa0 20 20 2f 2a 20 66 66 6c 75 73 68 28 73 74 64 6f    /* fflush(stdo
2afb0 75 74 29 3b 20 2a 2f 0a 20 20 69 66 28 20 72 63  ut); */.  if( rc
2afc0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2afd0 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43     moveToRoot(pC
2afe0 75 72 29 3b 0a 20 20 7d 0a 65 6e 64 5f 69 6e 73  ur);.  }.end_ins
2aff0 65 72 74 3a 0a 20 20 73 71 6c 69 74 65 46 72 65  ert:.  sqliteFre
2b000 65 28 6e 65 77 43 65 6c 6c 29 3b 0a 20 20 72 65  e(newCell);.  re
2b010 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2b020 2a 20 44 65 6c 65 74 65 20 74 68 65 20 65 6e 74  * Delete the ent
2b030 72 79 20 74 68 61 74 20 74 68 65 20 63 75 72 73  ry that the curs
2b040 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
2b050 6f 2e 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a  o.  The cursor.*
2b060 2a 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  * is left pointi
2b070 6e 67 20 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c  ng at a random l
2b080 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  ocation..*/.int 
2b090 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65  sqlite3BtreeDele
2b0a0 74 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  te(BtCursor *pCu
2b0b0 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  r){.  MemPage *p
2b0c0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
2b0d0 67 65 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  ge;.  unsigned c
2b0e0 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e  har *pCell;.  in
2b0f0 74 20 72 63 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  t rc;.  Pgno pgn
2b100 6f 43 68 69 6c 64 20 3d 20 30 3b 0a 20 20 42 74  oChild = 0;.  Bt
2b110 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
2b120 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 3b  ur->pBtree->pBt;
2b130 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
2b140 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69  e->isInit );.  i
2b150 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  f( pBt->inTransa
2b160 63 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 57 52 49  ction!=TRANS_WRI
2b170 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73  TE ){.    /* Mus
2b180 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61  t start a transa
2b190 63 74 69 6f 6e 20 62 65 66 6f 72 65 20 64 6f 69  ction before doi
2b1a0 6e 67 20 61 20 64 65 6c 65 74 65 20 2a 2f 0a 20  ng a delete */. 
2b1b0 20 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 72     return pBt->r
2b1c0 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45  eadOnly ? SQLITE
2b1d0 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49  _READONLY : SQLI
2b1e0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
2b1f0 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65  assert( !pBt->re
2b200 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 69 66 28 20  adOnly );.  if( 
2b210 70 43 75 72 2d 3e 69 64 78 20 3e 3d 20 70 50 61  pCur->idx >= pPa
2b220 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
2b230 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
2b240 52 52 4f 52 3b 20 20 2f 2a 20 54 68 65 20 63 75  RROR;  /* The cu
2b250 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e  rsor is not poin
2b260 74 69 6e 67 20 74 6f 20 61 6e 79 74 68 69 6e 67  ting to anything
2b270 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 21 70   */.  }.  if( !p
2b280 43 75 72 2d 3e 77 72 46 6c 61 67 20 29 7b 0a 20  Cur->wrFlag ){. 
2b290 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2b2a0 5f 50 45 52 4d 3b 20 20 20 2f 2a 20 44 69 64 20  _PERM;   /* Did 
2b2b0 6e 6f 74 20 6f 70 65 6e 20 74 68 69 73 20 63 75  not open this cu
2b2c0 72 73 6f 72 20 66 6f 72 20 77 72 69 74 69 6e 67  rsor for writing
2b2d0 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 63 68   */.  }.  if( ch
2b2e0 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70 43 75  eckReadLocks(pCu
2b2f0 72 2d 3e 70 42 74 72 65 65 2c 20 70 43 75 72 2d  r->pBtree, pCur-
2b300 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29  >pgnoRoot, pCur)
2b310 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2b320 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a  QLITE_LOCKED; /*
2b330 20 54 68 65 20 74 61 62 6c 65 20 70 43 75 72 20   The table pCur 
2b340 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 61 20  points to has a 
2b350 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d  read lock */.  }
2b360 0a 0a 20 20 2f 2a 20 52 65 73 74 6f 72 65 20 74  ..  /* Restore t
2b370 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
2b380 72 20 70 6f 73 69 74 69 6f 6e 20 28 61 20 6e 6f  r position (a no
2b390 2d 6f 70 20 69 66 20 74 68 65 20 63 75 72 73 6f  -op if the curso
2b3a0 72 20 69 73 20 6e 6f 74 20 69 6e 20 0a 20 20 2a  r is not in .  *
2b3b0 2a 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  * CURSOR_REQUIRE
2b3c0 53 45 45 4b 20 73 74 61 74 65 29 20 61 6e 64 20  SEEK state) and 
2b3d0 73 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f  save the positio
2b3e0 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20  ns of any other 
2b3f0 63 75 72 73 6f 72 73 20 0a 20 20 2a 2a 20 6f 70  cursors .  ** op
2b400 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74  en on the same t
2b410 61 62 6c 65 2e 20 54 68 65 6e 20 63 61 6c 6c 20  able. Then call 
2b420 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2b430 65 28 29 20 6f 6e 20 74 68 65 20 70 61 67 65 0a  e() on the page.
2b440 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 65 6e    ** that the en
2b450 74 72 79 20 77 69 6c 6c 20 62 65 20 64 65 6c 65  try will be dele
2b460 74 65 64 20 66 72 6f 6d 2e 0a 20 20 2a 2f 0a 20  ted from..  */. 
2b470 20 69 66 28 20 0a 20 20 20 20 28 72 63 20 3d 20   if( .    (rc = 
2b480 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75  restoreOrClearCu
2b490 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
2b4a0 72 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20 28 72  r))!=0 ||.    (r
2b4b0 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  c = saveAllCurso
2b4c0 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67  rs(pBt, pCur->pg
2b4d0 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29 21 3d  noRoot, pCur))!=
2b4e0 30 20 7c 7c 0a 20 20 20 20 28 72 63 20 3d 20 73  0 ||.    (rc = s
2b4f0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2b500 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2b510 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72 65  )!=0.  ){.    re
2b520 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
2b530 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 63 65  /* Locate the ce
2b540 6c 6c 20 77 69 74 68 69 6e 20 69 74 27 73 20 70  ll within it's p
2b550 61 67 65 20 61 6e 64 20 6c 65 61 76 65 20 70 43  age and leave pC
2b560 65 6c 6c 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ell pointing to 
2b570 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 2e 20 54  the.  ** data. T
2b580 68 65 20 63 6c 65 61 72 43 65 6c 6c 28 29 20 63  he clearCell() c
2b590 61 6c 6c 20 66 72 65 65 73 20 61 6e 79 20 6f 76  all frees any ov
2b5a0 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73  erflow pages ass
2b5b0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
2b5c0 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20  .  ** cell. The 
2b5d0 63 65 6c 6c 20 69 74 73 65 6c 66 20 69 73 20 73  cell itself is s
2b5e0 74 69 6c 6c 20 69 6e 74 61 63 74 2e 0a 20 20 2a  till intact..  *
2b5f0 2f 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64  /.  pCell = find
2b600 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72  Cell(pPage, pCur
2b610 2d 3e 69 64 78 29 3b 0a 20 20 69 66 28 20 21 70  ->idx);.  if( !p
2b620 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2b630 20 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65    pgnoChild = ge
2b640 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20  t4byte(pCell);. 
2b650 20 7d 0a 20 20 72 63 20 3d 20 63 6c 65 61 72 43   }.  rc = clearC
2b660 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
2b670 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
2b680 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20  turn rc;..  if( 
2b690 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
2b6a0 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68      /*.    ** Th
2b6b0 65 20 65 6e 74 72 79 20 77 65 20 61 72 65 20 61  e entry we are a
2b6c0 62 6f 75 74 20 74 6f 20 64 65 6c 65 74 65 20 69  bout to delete i
2b6d0 73 20 6e 6f 74 20 61 20 6c 65 61 66 20 73 6f 20  s not a leaf so 
2b6e0 69 66 20 77 65 20 64 6f 20 6e 6f 74 0a 20 20 20  if we do not.   
2b6f0 20 2a 2a 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67   ** do something
2b700 20 77 65 20 77 69 6c 6c 20 6c 65 61 76 65 20 61   we will leave a
2b710 20 68 6f 6c 65 20 6f 6e 20 61 6e 20 69 6e 74 65   hole on an inte
2b720 72 6e 61 6c 20 70 61 67 65 2e 0a 20 20 20 20 2a  rnal page..    *
2b730 2a 20 57 65 20 68 61 76 65 20 74 6f 20 66 69 6c  * We have to fil
2b740 6c 20 74 68 65 20 68 6f 6c 65 20 62 79 20 6d 6f  l the hole by mo
2b750 76 69 6e 67 20 69 6e 20 61 20 63 65 6c 6c 20 66  ving in a cell f
2b760 72 6f 6d 20 61 20 6c 65 61 66 2e 20 20 54 68 65  rom a leaf.  The
2b770 0a 20 20 20 20 2a 2a 20 6e 65 78 74 20 43 65 6c  .    ** next Cel
2b780 6c 20 61 66 74 65 72 20 74 68 65 20 6f 6e 65 20  l after the one 
2b790 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 69 73  to be deleted is
2b7a0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65   guaranteed to e
2b7b0 78 69 73 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20  xist and.    ** 
2b7c0 74 6f 20 62 65 20 61 20 6c 65 61 66 20 73 6f 20  to be a leaf so 
2b7d0 77 65 20 63 61 6e 20 75 73 65 20 69 74 2e 0a 20  we can use it.. 
2b7e0 20 20 20 2a 2f 0a 20 20 20 20 42 74 43 75 72 73     */.    BtCurs
2b7f0 6f 72 20 6c 65 61 66 43 75 72 3b 0a 20 20 20 20  or leafCur;.    
2b800 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
2b810 4e 65 78 74 3b 0a 20 20 20 20 69 6e 74 20 73 7a  Next;.    int sz
2b820 4e 65 78 74 3b 20 20 2f 2a 20 54 68 65 20 63 6f  Next;  /* The co
2b830 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 20 69  mpiler warning i
2b840 73 20 77 72 6f 6e 67 3a 20 73 7a 4e 65 78 74 20  s wrong: szNext 
2b850 69 73 20 61 6c 77 61 79 73 20 0a 20 20 20 20 20  is always .     
2b860 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
2b870 6e 69 74 69 61 6c 69 7a 65 64 20 62 65 66 6f 72  nitialized befor
2b880 65 20 75 73 65 2e 20 20 41 64 64 69 6e 67 20 61  e use.  Adding a
2b890 6e 20 65 78 74 72 61 20 69 6e 69 74 69 61 6c 69  n extra initiali
2b8a0 7a 61 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 20  zation.         
2b8b0 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 73 69          ** to si
2b8c0 6c 65 6e 63 65 20 74 68 65 20 63 6f 6d 70 69 6c  lence the compil
2b8d0 65 72 20 73 6c 6f 77 73 20 64 6f 77 6e 20 74 68  er slows down th
2b8e0 65 20 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 69  e code. */.    i
2b8f0 6e 74 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20  nt notUsed;.    
2b900 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74  unsigned char *t
2b910 65 6d 70 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 20  empCell = 0;.   
2b920 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 2d   assert( !pPage-
2b930 3e 6c 65 61 66 44 61 74 61 20 29 3b 0a 20 20 20  >leafData );.   
2b940 20 67 65 74 54 65 6d 70 43 75 72 73 6f 72 28 70   getTempCursor(p
2b950 43 75 72 2c 20 26 6c 65 61 66 43 75 72 29 3b 0a  Cur, &leafCur);.
2b960 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2b970 42 74 72 65 65 4e 65 78 74 28 26 6c 65 61 66 43  BtreeNext(&leafC
2b980 75 72 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20  ur, &notUsed);. 
2b990 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2b9a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
2b9b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2b9c0 72 69 74 65 28 6c 65 61 66 43 75 72 2e 70 50 61  rite(leafCur.pPa
2b9d0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
2b9e0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
2b9f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ba00 20 20 20 54 52 41 43 45 28 28 22 44 45 4c 45 54     TRACE(("DELET
2ba10 45 3a 20 74 61 62 6c 65 3d 25 64 20 64 65 6c 65  E: table=%d dele
2ba20 74 65 20 69 6e 74 65 72 6e 61 6c 20 66 72 6f 6d  te internal from
2ba30 20 25 64 20 72 65 70 6c 61 63 65 20 66 72 6f 6d   %d replace from
2ba40 20 6c 65 61 66 20 25 64 5c 6e 22 2c 0a 20 20 20   leaf %d\n",.   
2ba50 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f        pCur->pgno
2ba60 52 6f 6f 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e  Root, pPage->pgn
2ba70 6f 2c 20 6c 65 61 66 43 75 72 2e 70 50 61 67 65  o, leafCur.pPage
2ba80 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
2ba90 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20  dropCell(pPage, 
2baa0 70 43 75 72 2d 3e 69 64 78 2c 20 63 65 6c 6c 53  pCur->idx, cellS
2bab0 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43  izePtr(pPage, pC
2bac0 65 6c 6c 29 29 3b 0a 20 20 20 20 20 20 70 4e 65  ell));.      pNe
2bad0 78 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28 6c 65  xt = findCell(le
2bae0 61 66 43 75 72 2e 70 50 61 67 65 2c 20 6c 65 61  afCur.pPage, lea
2baf0 66 43 75 72 2e 69 64 78 29 3b 0a 20 20 20 20 20  fCur.idx);.     
2bb00 20 73 7a 4e 65 78 74 20 3d 20 63 65 6c 6c 53 69   szNext = cellSi
2bb10 7a 65 50 74 72 28 6c 65 61 66 43 75 72 2e 70 50  zePtr(leafCur.pP
2bb20 61 67 65 2c 20 70 4e 65 78 74 29 3b 0a 20 20 20  age, pNext);.   
2bb30 20 20 20 61 73 73 65 72 74 28 20 4d 58 5f 43 45     assert( MX_CE
2bb40 4c 4c 5f 53 49 5a 45 28 70 42 74 29 3e 3d 73 7a  LL_SIZE(pBt)>=sz
2bb50 4e 65 78 74 2b 34 20 29 3b 0a 20 20 20 20 20 20  Next+4 );.      
2bb60 74 65 6d 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74  tempCell = sqlit
2bb70 65 4d 61 6c 6c 6f 63 52 61 77 28 20 4d 58 5f 43  eMallocRaw( MX_C
2bb80 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b  ELL_SIZE(pBt) );
2bb90 0a 20 20 20 20 20 20 69 66 28 20 74 65 6d 70 43  .      if( tempC
2bba0 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ell==0 ){.      
2bbb0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
2bbc0 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
2bbd0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
2bbe0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2bbf0 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c    rc = insertCel
2bc00 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  l(pPage, pCur->i
2bc10 64 78 2c 20 70 4e 65 78 74 2d 34 2c 20 73 7a 4e  dx, pNext-4, szN
2bc20 65 78 74 2b 34 2c 20 74 65 6d 70 43 65 6c 6c 2c  ext+4, tempCell,
2bc30 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
2bc40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2bc50 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79   ){.      put4by
2bc60 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43  te(findOverflowC
2bc70 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
2bc80 3e 69 64 78 29 2c 20 70 67 6e 6f 43 68 69 6c 64  >idx), pgnoChild
2bc90 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61  );.      rc = ba
2bca0 6c 61 6e 63 65 28 70 50 61 67 65 2c 20 30 29 3b  lance(pPage, 0);
2bcb0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
2bcc0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2bcd0 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 6c        dropCell(l
2bce0 65 61 66 43 75 72 2e 70 50 61 67 65 2c 20 6c 65  eafCur.pPage, le
2bcf0 61 66 43 75 72 2e 69 64 78 2c 20 73 7a 4e 65 78  afCur.idx, szNex
2bd00 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 62  t);.      rc = b
2bd10 61 6c 61 6e 63 65 28 6c 65 61 66 43 75 72 2e 70  alance(leafCur.p
2bd20 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Page, 0);.    }.
2bd30 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 74      sqliteFree(t
2bd40 65 6d 70 43 65 6c 6c 29 3b 0a 20 20 20 20 72 65  empCell);.    re
2bd50 6c 65 61 73 65 54 65 6d 70 43 75 72 73 6f 72 28  leaseTempCursor(
2bd60 26 6c 65 61 66 43 75 72 29 3b 0a 20 20 7d 65 6c  &leafCur);.  }el
2bd70 73 65 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22  se{.    TRACE(("
2bd80 44 45 4c 45 54 45 3a 20 74 61 62 6c 65 3d 25 64  DELETE: table=%d
2bd90 20 64 65 6c 65 74 65 20 66 72 6f 6d 20 6c 65 61   delete from lea
2bda0 66 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  f %d\n",.       
2bdb0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
2bdc0 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20  pPage->pgno));. 
2bdd0 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67     dropCell(pPag
2bde0 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 63 65  e, pCur->idx, ce
2bdf0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
2be00 20 70 43 65 6c 6c 29 29 3b 0a 20 20 20 20 72 63   pCell));.    rc
2be10 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61 67 65   = balance(pPage
2be20 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
2be30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2be40 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  .    moveToRoot(
2be50 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pCur);.  }.  ret
2be60 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2be70 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 42 54   Create a new BT
2be80 72 65 65 20 74 61 62 6c 65 2e 20 20 57 72 69 74  ree table.  Writ
2be90 65 20 69 6e 74 6f 20 2a 70 69 54 61 62 6c 65 20  e into *piTable 
2bea0 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62  the page.** numb
2beb0 65 72 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20  er for the root 
2bec0 70 61 67 65 20 6f 66 20 74 68 65 20 6e 65 77 20  page of the new 
2bed0 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  table..**.** The
2bee0 20 74 79 70 65 20 6f 66 20 74 79 70 65 20 69 73   type of type is
2bef0 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
2bf00 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
2bf10 65 72 2e 20 20 4f 6e 6c 79 20 74 68 65 0a 2a 2a  er.  Only the.**
2bf20 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c 75 65   following value
2bf30 73 20 6f 66 20 66 6c 61 67 73 20 61 72 65 20 63  s of flags are c
2bf40 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 2e  urrently in use.
2bf50 20 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20 66    Other values f
2bf60 6f 72 0a 2a 2a 20 66 6c 61 67 73 20 6d 69 67 68  or.** flags migh
2bf70 74 20 6e 6f 74 20 77 6f 72 6b 3a 0a 2a 2a 0a 2a  t not work:.**.*
2bf80 2a 20 20 20 20 20 42 54 52 45 45 5f 49 4e 54 4b  *     BTREE_INTK
2bf90 45 59 7c 42 54 52 45 45 5f 4c 45 41 46 44 41 54  EY|BTREE_LEAFDAT
2bfa0 41 20 20 20 20 20 55 73 65 64 20 66 6f 72 20 53  A     Used for S
2bfb0 51 4c 20 74 61 62 6c 65 73 20 77 69 74 68 20 72  QL tables with r
2bfc0 6f 77 69 64 20 6b 65 79 73 0a 2a 2a 20 20 20 20  owid keys.**    
2bfd0 20 42 54 52 45 45 5f 5a 45 52 4f 44 41 54 41 20   BTREE_ZERODATA 
2bfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bff0 20 55 73 65 64 20 66 6f 72 20 53 51 4c 20 69 6e   Used for SQL in
2c000 64 69 63 65 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c  dices.*/.int sql
2c010 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54  ite3BtreeCreateT
2c020 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69  able(Btree *p, i
2c030 6e 74 20 2a 70 69 54 61 62 6c 65 2c 20 69 6e 74  nt *piTable, int
2c040 20 66 6c 61 67 73 29 7b 0a 20 20 42 74 53 68 61   flags){.  BtSha
2c050 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
2c060 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52  t;.  MemPage *pR
2c070 6f 6f 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  oot;.  Pgno pgno
2c080 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Root;.  int rc;.
2c090 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61    if( pBt->inTra
2c0a0 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53 5f  nsaction!=TRANS_
2c0b0 57 52 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20  WRITE ){.    /* 
2c0c0 4d 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61  Must start a tra
2c0d0 6e 73 61 63 74 69 6f 6e 20 66 69 72 73 74 20 2a  nsaction first *
2c0e0 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42 74  /.    return pBt
2c0f0 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c  ->readOnly ? SQL
2c100 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53  ITE_READONLY : S
2c110 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
2c120 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d  .  assert( !pBt-
2c130 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 0a 20 20  >readOnly );..  
2c140 2f 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  /* It is illegal
2c150 20 74 6f 20 63 72 65 61 74 65 20 61 20 74 61 62   to create a tab
2c160 6c 65 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72  le if any cursor
2c170 73 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68  s are open on th
2c180 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e  e.  ** database.
2c190 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
2c1a0 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   in auto-vacuum 
2c1b0 6d 6f 64 65 20 74 68 65 20 62 61 63 6b 65 6e 64  mode the backend
2c1c0 20 6d 61 79 0a 20 20 2a 2a 20 6e 65 65 64 20 74   may.  ** need t
2c1d0 6f 20 6d 6f 76 65 20 61 20 64 61 74 61 62 61 73  o move a databas
2c1e0 65 20 70 61 67 65 20 74 6f 20 6d 61 6b 65 20 72  e page to make r
2c1f0 6f 6f 6d 20 66 6f 72 20 74 68 65 20 6e 65 77 20  oom for the new 
2c200 72 6f 6f 74 2d 70 61 67 65 2e 0a 20 20 2a 2a 20  root-page..  ** 
2c210 49 66 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f  If an open curso
2c220 72 20 77 61 73 20 75 73 69 6e 67 20 74 68 65 20  r was using the 
2c230 70 61 67 65 20 61 20 70 72 6f 62 6c 65 6d 20 77  page a problem w
2c240 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 20 20 2a 2f  ould occur..  */
2c250 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 43 75 72  .  if( pBt->pCur
2c260 73 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  sor ){.    retur
2c270 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b  n SQLITE_LOCKED;
2c280 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
2c290 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2c2a0 55 55 4d 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63  UUM.  rc = alloc
2c2b0 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
2c2c0 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52  , &pRoot, &pgnoR
2c2d0 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 69 66  oot, 1, 0);.  if
2c2e0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2c2f0 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 70 42  ;.#else.  if( pB
2c300 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
2c310 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4d 6f  .    Pgno pgnoMo
2c320 76 65 3b 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65  ve;      /* Move
2c330 20 61 20 70 61 67 65 20 68 65 72 65 20 74 6f 20   a page here to 
2c340 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68  make room for th
2c350 65 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 20  e root-page */. 
2c360 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
2c370 65 4d 6f 76 65 3b 20 2f 2a 20 54 68 65 20 70 61  eMove; /* The pa
2c380 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 20 2a  ge to move to. *
2c390 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  /..    /* Read t
2c3a0 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 65 74 61  he value of meta
2c3b0 5b 33 5d 20 66 72 6f 6d 20 74 68 65 20 64 61 74  [3] from the dat
2c3c0 61 62 61 73 65 20 74 6f 20 64 65 74 65 72 6d 69  abase to determi
2c3d0 6e 65 20 77 68 65 72 65 20 74 68 65 0a 20 20 20  ne where the.   
2c3e0 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66   ** root page of
2c3f0 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 73   the new table s
2c400 68 6f 75 6c 64 20 67 6f 2e 20 6d 65 74 61 5b 33  hould go. meta[3
2c410 5d 20 69 73 20 74 68 65 20 6c 61 72 67 65 73 74  ] is the largest
2c420 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a   root-page.    *
2c430 2a 20 63 72 65 61 74 65 64 20 73 6f 20 66 61 72  * created so far
2c440 2c 20 73 6f 20 74 68 65 20 6e 65 77 20 72 6f 6f  , so the new roo
2c450 74 2d 70 61 67 65 20 69 73 20 28 6d 65 74 61 5b  t-page is (meta[
2c460 33 5d 2b 31 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  3]+1)..    */.  
2c470 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2c480 72 65 65 47 65 74 4d 65 74 61 28 70 2c 20 34 2c  reeGetMeta(p, 4,
2c490 20 26 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20   &pgnoRoot);.   
2c4a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2c4b0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
2c4c0 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a      pgnoRoot++;.
2c4d0 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20  .    /* The new 
2c4e0 72 6f 6f 74 2d 70 61 67 65 20 6d 61 79 20 6e 6f  root-page may no
2c4f0 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f  t be allocated o
2c500 6e 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  n a pointer-map 
2c510 70 61 67 65 2c 20 6f 72 20 74 68 65 0a 20 20 20  page, or the.   
2c520 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45   ** PENDING_BYTE
2c530 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
2c540 20 20 69 66 28 20 70 67 6e 6f 52 6f 6f 74 3d 3d    if( pgnoRoot==
2c550 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
2c560 74 2c 20 70 67 6e 6f 52 6f 6f 74 29 20 7c 7c 0a  t, pgnoRoot) ||.
2c570 20 20 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74          pgnoRoot
2c580 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
2c590 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
2c5a0 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 20 20    pgnoRoot++;.  
2c5b0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
2c5c0 70 67 6e 6f 52 6f 6f 74 3e 3d 33 20 29 3b 0a 0a  pgnoRoot>=3 );..
2c5d0 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20      /* Allocate 
2c5e0 61 20 70 61 67 65 2e 20 54 68 65 20 70 61 67 65  a page. The page
2c5f0 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20   that currently 
2c600 72 65 73 69 64 65 73 20 61 74 20 70 67 6e 6f 52  resides at pgnoR
2c610 6f 6f 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  oot will.    ** 
2c620 62 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20  be moved to the 
2c630 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 28  allocated page (
2c640 75 6e 6c 65 73 73 20 74 68 65 20 61 6c 6c 6f 63  unless the alloc
2c650 61 74 65 64 20 70 61 67 65 20 68 61 70 70 65 6e  ated page happen
2c660 73 0a 20 20 20 20 2a 2a 20 74 6f 20 72 65 73 69  s.    ** to resi
2c670 64 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74 29 2e  de at pgnoRoot).
2c680 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
2c690 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
2c6a0 67 65 28 70 42 74 2c 20 26 70 50 61 67 65 4d 6f  ge(pBt, &pPageMo
2c6b0 76 65 2c 20 26 70 67 6e 6f 4d 6f 76 65 2c 20 70  ve, &pgnoMove, p
2c6c0 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b 0a 20 20 20  gnoRoot, 1);.   
2c6d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2c6e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
2c6f0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
2c700 20 20 69 66 28 20 70 67 6e 6f 4d 6f 76 65 21 3d    if( pgnoMove!=
2c710 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20  pgnoRoot ){.    
2c720 20 20 2f 2a 20 70 67 6e 6f 52 6f 6f 74 20 69 73    /* pgnoRoot is
2c730 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20 77   the page that w
2c740 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72 20  ill be used for 
2c750 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66  the root-page of
2c760 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 65  .      ** the ne
2c770 77 20 74 61 62 6c 65 20 28 61 73 73 75 6d 69 6e  w table (assumin
2c780 67 20 61 6e 20 65 72 72 6f 72 20 64 69 64 20 6e  g an error did n
2c790 6f 74 20 6f 63 63 75 72 29 2e 20 42 75 74 20 77  ot occur). But w
2c7a0 65 20 77 65 72 65 0a 20 20 20 20 20 20 2a 2a 20  e were.      ** 
2c7b0 61 6c 6c 6f 63 61 74 65 64 20 70 67 6e 6f 4d 6f  allocated pgnoMo
2c7c0 76 65 2e 20 49 66 20 72 65 71 75 69 72 65 64 20  ve. If required 
2c7d0 28 69 2e 65 2e 20 69 66 20 69 74 20 77 61 73 20  (i.e. if it was 
2c7e0 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20  not allocated.  
2c7f0 20 20 20 20 2a 2a 20 62 79 20 65 78 74 65 6e 64      ** by extend
2c800 69 6e 67 20 74 68 65 20 66 69 6c 65 29 2c 20 74  ing the file), t
2c810 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
2c820 61 74 20 70 6f 73 69 74 69 6f 6e 20 70 67 6e 6f  at position pgno
2c830 4d 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  Move.      ** is
2c840 20 61 6c 72 65 61 64 79 20 6a 6f 75 72 6e 61 6c   already journal
2c850 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
2c860 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
2c870 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65     Pgno iPtrPage
2c880 3b 0a 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ;..      release
2c890 50 61 67 65 28 70 50 61 67 65 4d 6f 76 65 29 3b  Page(pPageMove);
2c8a0 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20  ..      /* Move 
2c8b0 74 68 65 20 70 61 67 65 20 63 75 72 72 65 6e 74  the page current
2c8c0 6c 79 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 74  ly at pgnoRoot t
2c8d0 6f 20 70 67 6e 6f 4d 6f 76 65 2e 20 2a 2f 0a 20  o pgnoMove. */. 
2c8e0 20 20 20 20 20 72 63 20 3d 20 67 65 74 50 61 67       rc = getPag
2c8f0 65 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c  e(pBt, pgnoRoot,
2c900 20 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20   &pRoot, 0);.   
2c910 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2c920 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2c930 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2c940 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74   }.      rc = pt
2c950 72 6d 61 70 47 65 74 28 70 42 74 2c 20 70 67 6e  rmapGet(pBt, pgn
2c960 6f 52 6f 6f 74 2c 20 26 65 54 79 70 65 2c 20 26  oRoot, &eType, &
2c970 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20  iPtrPage);.     
2c980 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2c990 4f 4b 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  OK || eType==PTR
2c9a0 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 7c 7c 20  MAP_ROOTPAGE || 
2c9b0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
2c9c0 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
2c9d0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52    releasePage(pR
2c9e0 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  oot);.        re
2c9f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
2ca00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
2ca10 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type!=PTRMAP_ROO
2ca20 54 50 41 47 45 20 29 3b 0a 20 20 20 20 20 20 61  TPAGE );.      a
2ca30 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 50 54  ssert( eType!=PT
2ca40 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 3b  RMAP_FREEPAGE );
2ca50 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2ca60 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 52  te3PagerWrite(pR
2ca70 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  oot->pDbPage);. 
2ca80 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2ca90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2caa0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52    releasePage(pR
2cab0 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  oot);.        re
2cac0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
2cad0 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f  .      rc = relo
2cae0 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 52  catePage(pBt, pR
2caf0 6f 6f 74 2c 20 65 54 79 70 65 2c 20 69 50 74 72  oot, eType, iPtr
2cb00 50 61 67 65 2c 20 70 67 6e 6f 4d 6f 76 65 29 3b  Page, pgnoMove);
2cb10 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
2cb20 67 65 28 70 52 6f 6f 74 29 3b 0a 0a 20 20 20 20  ge(pRoot);..    
2cb30 20 20 2f 2a 20 4f 62 74 61 69 6e 20 74 68 65 20    /* Obtain the 
2cb40 70 61 67 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74  page at pgnoRoot
2cb50 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63   */.      if( rc
2cb60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2cb70 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2cb80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2cb90 72 63 20 3d 20 67 65 74 50 61 67 65 28 70 42 74  rc = getPage(pBt
2cba0 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f  , pgnoRoot, &pRo
2cbb0 6f 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  ot, 0);.      if
2cbc0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2cbd0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
2cbe0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
2cbf0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2cc00 50 61 67 65 72 57 72 69 74 65 28 70 52 6f 6f 74  PagerWrite(pRoot
2cc10 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2cc20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2cc30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2cc40 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74  eleasePage(pRoot
2cc50 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
2cc60 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
2cc70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
2cc80 52 6f 6f 74 20 3d 20 70 50 61 67 65 4d 6f 76 65  Root = pPageMove
2cc90 3b 0a 20 20 20 20 7d 20 0a 0a 20 20 20 20 2f 2a  ;.    } ..    /*
2cca0 20 55 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e   Update the poin
2ccb0 74 65 72 2d 6d 61 70 20 61 6e 64 20 6d 65 74 61  ter-map and meta
2ccc0 2d 64 61 74 61 20 77 69 74 68 20 74 68 65 20 6e  -data with the n
2ccd0 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d  ew root-page num
2cce0 62 65 72 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ber. */.    rc =
2ccf0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
2cd00 70 67 6e 6f 52 6f 6f 74 2c 20 50 54 52 4d 41 50  pgnoRoot, PTRMAP
2cd10 5f 52 4f 4f 54 50 41 47 45 2c 20 30 29 3b 0a 20  _ROOTPAGE, 0);. 
2cd20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2cd30 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2cd40 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74  Root);.      ret
2cd50 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
2cd60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2cd70 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 70 2c  reeUpdateMeta(p,
2cd80 20 34 2c 20 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20   4, pgnoRoot);. 
2cd90 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2cda0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2cdb0 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74  Root);.      ret
2cdc0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
2cdd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
2cde0 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
2cdf0 67 65 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20  ge(pBt, &pRoot, 
2ce00 26 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29  &pgnoRoot, 1, 0)
2ce10 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
2ce20 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65  eturn rc;.  }.#e
2ce30 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 73  ndif.  assert( s
2ce40 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2ce50 74 65 61 62 6c 65 28 70 52 6f 6f 74 2d 3e 70 44  teable(pRoot->pD
2ce60 62 50 61 67 65 29 20 29 3b 0a 20 20 7a 65 72 6f  bPage) );.  zero
2ce70 50 61 67 65 28 70 52 6f 6f 74 2c 20 66 6c 61 67  Page(pRoot, flag
2ce80 73 20 7c 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20  s | PTF_LEAF);. 
2ce90 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
2cea0 65 66 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67  ef(pRoot->pDbPag
2ceb0 65 29 3b 0a 20 20 2a 70 69 54 61 62 6c 65 20 3d  e);.  *piTable =
2cec0 20 28 69 6e 74 29 70 67 6e 6f 52 6f 6f 74 3b 0a   (int)pgnoRoot;.
2ced0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2cee0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61  OK;.}../*.** Era
2cef0 73 65 20 74 68 65 20 67 69 76 65 6e 20 64 61 74  se the given dat
2cf00 61 62 61 73 65 20 70 61 67 65 20 61 6e 64 20 61  abase page and a
2cf10 6c 6c 20 69 74 73 20 63 68 69 6c 64 72 65 6e 2e  ll its children.
2cf20 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20    Return.** the 
2cf30 70 61 67 65 20 74 6f 20 74 68 65 20 66 72 65 65  page to the free
2cf40 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
2cf50 69 6e 74 20 63 6c 65 61 72 44 61 74 61 62 61 73  int clearDatabas
2cf60 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  ePage(.  BtShare
2cf70 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
2cf80 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20 74    /* The BTree t
2cf90 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
2cfa0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f   table */.  Pgno
2cfb0 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
2cfc0 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
2cfd0 20 74 6f 20 63 6c 65 61 72 20 2a 2f 0a 20 20 4d   to clear */.  M
2cfe0 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c  emPage *pParent,
2cff0 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 70       /* Parent p
2d000 61 67 65 2e 20 20 4e 55 4c 4c 20 66 6f 72 20 74  age.  NULL for t
2d010 68 65 20 72 6f 6f 74 20 2a 2f 0a 20 20 69 6e 74  he root */.  int
2d020 20 66 72 65 65 50 61 67 65 46 6c 61 67 20 20 20   freePageFlag   
2d030 20 20 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65     /* Deallocate
2d040 20 70 61 67 65 20 69 66 20 74 72 75 65 20 2a 2f   page if true */
2d050 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
2d060 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Page = 0;.  int 
2d070 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  rc;.  unsigned c
2d080 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e  har *pCell;.  in
2d090 74 20 69 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f  t i;..  if( pgno
2d0a0 3e 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67  >sqlite3PagerPag
2d0b0 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
2d0c0 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  er) ){.    retur
2d0d0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
2d0e0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 72 63  _BKPT;.  }..  rc
2d0f0 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
2d100 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 26 70 50  e(pBt, pgno, &pP
2d110 61 67 65 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20  age, pParent);. 
2d120 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63   if( rc ) goto c
2d130 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65  leardatabasepage
2d140 5f 6f 75 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  _out;.  for(i=0;
2d150 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   i<pPage->nCell;
2d160 20 69 2b 2b 29 7b 0a 20 20 20 20 70 43 65 6c 6c   i++){.    pCell
2d170 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
2d180 65 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 21  e, i);.    if( !
2d190 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2d1a0 20 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44       rc = clearD
2d1b0 61 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c  atabasePage(pBt,
2d1c0 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29   get4byte(pCell)
2d1d0 2c 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  , pPage->pParent
2d1e0 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
2d1f0 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64  rc ) goto cleard
2d200 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b  atabasepage_out;
2d210 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
2d220 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c  clearCell(pPage,
2d230 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28   pCell);.    if(
2d240 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72   rc ) goto clear
2d250 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74  databasepage_out
2d260 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  ;.  }.  if( !pPa
2d270 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2d280 72 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61  rc = clearDataba
2d290 73 65 50 61 67 65 28 70 42 74 2c 20 67 65 74 34  sePage(pBt, get4
2d2a0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
2d2b0 74 61 5b 38 5d 29 2c 20 70 50 61 67 65 2d 3e 70  ta[8]), pPage->p
2d2c0 50 61 72 65 6e 74 2c 20 31 29 3b 0a 20 20 20 20  Parent, 1);.    
2d2d0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c  if( rc ) goto cl
2d2e0 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f  eardatabasepage_
2d2f0 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  out;.  }.  if( f
2d300 72 65 65 50 61 67 65 46 6c 61 67 20 29 7b 0a 20  reePageFlag ){. 
2d310 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
2d320 28 70 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65  (pPage);.  }else
2d330 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74   if( (rc = sqlit
2d340 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
2d350 67 65 2d 3e 70 44 62 50 61 67 65 29 29 3d 3d 30  ge->pDbPage))==0
2d360 20 29 7b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65   ){.    zeroPage
2d370 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 61  (pPage, pPage->a
2d380 44 61 74 61 5b 30 5d 20 7c 20 50 54 46 5f 4c 45  Data[0] | PTF_LE
2d390 41 46 29 3b 0a 20 20 7d 0a 0a 63 6c 65 61 72 64  AF);.  }..cleard
2d3a0 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3a  atabasepage_out:
2d3b0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
2d3c0 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Page);.  return 
2d3d0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  rc;.}../*.** Del
2d3e0 65 74 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74  ete all informat
2d3f0 69 6f 6e 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c  ion from a singl
2d400 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64  e table in the d
2d410 61 74 61 62 61 73 65 2e 20 20 69 54 61 62 6c 65  atabase.  iTable
2d420 20 69 73 0a 2a 2a 20 74 68 65 20 70 61 67 65 20   is.** the page 
2d430 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72 6f  number of the ro
2d440 6f 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  ot of the table.
2d450 20 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75    After this rou
2d460 74 69 6e 65 20 72 65 74 75 72 6e 73 2c 0a 2a 2a  tine returns,.**
2d470 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69   the root page i
2d480 73 20 65 6d 70 74 79 2c 20 62 75 74 20 73 74 69  s empty, but sti
2d490 6c 6c 20 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a  ll exists..**.**
2d4a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
2d4b0 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 53 51 4c  ll fail with SQL
2d4c0 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68  ITE_LOCKED if th
2d4d0 65 72 65 20 61 72 65 20 61 6e 79 20 6f 70 65 6e  ere are any open
2d4e0 0a 2a 2a 20 72 65 61 64 20 63 75 72 73 6f 72 73  .** read cursors
2d4f0 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   on the table.  
2d500 4f 70 65 6e 20 77 72 69 74 65 20 63 75 72 73 6f  Open write curso
2d510 72 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20  rs are moved to 
2d520 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 6f 66 20 74  the.** root of t
2d530 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74  he table..*/.int
2d540 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
2d550 61 72 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70  arTable(Btree *p
2d560 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20  , int iTable){. 
2d570 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
2d580 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
2d590 74 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  t;.  if( p->inTr
2d5a0 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans!=TRANS_WRITE
2d5b0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
2d5c0 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53  Bt->readOnly ? S
2d5d0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a  QLITE_READONLY :
2d5e0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
2d5f0 20 7d 0a 20 20 72 63 20 3d 20 63 68 65 63 6b 52   }.  rc = checkR
2d600 65 61 64 4c 6f 63 6b 73 28 70 2c 20 69 54 61 62  eadLocks(p, iTab
2d610 6c 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  le, 0);.  if( rc
2d620 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
2d630 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 61 76  c;.  }..  /* Sav
2d640 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6f  e the position o
2d650 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70  f all cursors op
2d660 65 6e 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65  en on this table
2d670 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
2d680 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76 65 41  _OK!=(rc = saveA
2d690 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 69  llCursors(pBt, i
2d6a0 54 61 62 6c 65 2c 20 30 29 29 20 29 7b 0a 20 20  Table, 0)) ){.  
2d6b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
2d6c0 0a 0a 20 20 72 65 74 75 72 6e 20 63 6c 65 61 72  ..  return clear
2d6d0 44 61 74 61 62 61 73 65 50 61 67 65 28 70 42 74  DatabasePage(pBt
2d6e0 2c 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20  , (Pgno)iTable, 
2d6f0 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0, 0);.}../*.** 
2d700 45 72 61 73 65 20 61 6c 6c 20 69 6e 66 6f 72 6d  Erase all inform
2d710 61 74 69 6f 6e 20 69 6e 20 61 20 74 61 62 6c 65  ation in a table
2d720 20 61 6e 64 20 61 64 64 20 74 68 65 20 72 6f 6f   and add the roo
2d730 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  t of the table t
2d740 6f 0a 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73  o.** the freelis
2d750 74 2e 20 20 45 78 63 65 70 74 2c 20 74 68 65 20  t.  Except, the 
2d760 72 6f 6f 74 20 6f 66 20 74 68 65 20 70 72 69 6e  root of the prin
2d770 63 69 70 6c 65 20 74 61 62 6c 65 20 28 74 68 65  ciple table (the
2d780 20 6f 6e 65 20 6f 6e 0a 2a 2a 20 70 61 67 65 20   one on.** page 
2d790 31 29 20 69 73 20 6e 65 76 65 72 20 61 64 64 65  1) is never adde
2d7a0 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  d to the freelis
2d7b0 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
2d7c0 75 74 69 6e 65 20 77 69 6c 6c 20 66 61 69 6c 20  utine will fail 
2d7d0 77 69 74 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  with SQLITE_LOCK
2d7e0 45 44 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ED if there are 
2d7f0 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 63 75 72 73  any open.** curs
2d800 6f 72 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ors on the table
2d810 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 41 55 54 4f 56  ..**.** If AUTOV
2d820 41 43 55 55 4d 20 69 73 20 65 6e 61 62 6c 65 64  ACUUM is enabled
2d830 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 61 74   and the page at
2d840 20 69 54 61 62 6c 65 20 69 73 20 6e 6f 74 20 74   iTable is not t
2d850 68 65 20 6c 61 73 74 0a 2a 2a 20 72 6f 6f 74 20  he last.** root 
2d860 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
2d870 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
2d880 74 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61  the last root pa
2d890 67 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61  ge .** in the da
2d8a0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6d  tabase file is m
2d8b0 6f 76 65 64 20 69 6e 74 6f 20 74 68 65 20 73 6c  oved into the sl
2d8c0 6f 74 20 66 6f 72 6d 65 72 6c 79 20 6f 63 63 75  ot formerly occu
2d8d0 70 69 65 64 20 62 79 0a 2a 2a 20 69 54 61 62 6c  pied by.** iTabl
2d8e0 65 20 61 6e 64 20 74 68 61 74 20 6c 61 73 74 20  e and that last 
2d8f0 73 6c 6f 74 20 66 6f 72 6d 65 72 6c 79 20 6f 63  slot formerly oc
2d900 63 75 70 69 65 64 20 62 79 20 74 68 65 20 6c 61  cupied by the la
2d910 73 74 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20  st root page.** 
2d920 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
2d930 66 72 65 65 6c 69 73 74 20 69 6e 73 74 65 61 64  freelist instead
2d940 20 6f 66 20 69 54 61 62 6c 65 2e 20 20 49 6e 20   of iTable.  In 
2d950 74 68 69 73 20 73 61 79 2c 20 61 6c 6c 0a 2a 2a  this say, all.**
2d960 20 72 6f 6f 74 20 70 61 67 65 73 20 61 72 65 20   root pages are 
2d970 6b 65 70 74 20 61 74 20 74 68 65 20 62 65 67 69  kept at the begi
2d980 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74  nning of the dat
2d990 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63  abase file, whic
2d9a0 68 0a 2a 2a 20 69 73 20 6e 65 63 65 73 73 61 72  h.** is necessar
2d9b0 79 20 66 6f 72 20 41 55 54 4f 56 41 43 55 55 4d  y for AUTOVACUUM
2d9c0 20 74 6f 20 77 6f 72 6b 20 72 69 67 68 74 2e 20   to work right. 
2d9d0 20 2a 70 69 4d 6f 76 65 64 20 69 73 20 73 65 74   *piMoved is set
2d9e0 20 74 6f 20 74 68 65 20 0a 2a 2a 20 70 61 67 65   to the .** page
2d9f0 20 6e 75 6d 62 65 72 20 74 68 61 74 20 75 73 65   number that use
2da00 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61 73 74  d to be the last
2da10 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 20 74 68   root page in th
2da20 65 20 66 69 6c 65 20 62 65 66 6f 72 65 0a 2a 2a  e file before.**
2da30 20 74 68 65 20 6d 6f 76 65 2e 20 20 49 66 20 6e   the move.  If n
2da40 6f 20 70 61 67 65 20 67 65 74 73 20 6d 6f 76 65  o page gets move
2da50 64 2c 20 2a 70 69 4d 6f 76 65 64 20 69 73 20 73  d, *piMoved is s
2da60 65 74 20 74 6f 20 30 2e 0a 2a 2a 20 54 68 65 20  et to 0..** The 
2da70 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65 20 69  last root page i
2da80 73 20 72 65 63 6f 72 64 65 64 20 69 6e 20 6d 65  s recorded in me
2da90 74 61 5b 33 5d 20 61 6e 64 20 74 68 65 20 76 61  ta[3] and the va
2daa0 6c 75 65 20 6f 66 0a 2a 2a 20 6d 65 74 61 5b 33  lue of.** meta[3
2dab0 5d 20 69 73 20 75 70 64 61 74 65 64 20 62 79 20  ] is updated by 
2dac0 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 2e 0a  this procedure..
2dad0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
2dae0 72 65 65 44 72 6f 70 54 61 62 6c 65 28 42 74 72  reeDropTable(Btr
2daf0 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c  ee *p, int iTabl
2db00 65 2c 20 69 6e 74 20 2a 70 69 4d 6f 76 65 64 29  e, int *piMoved)
2db10 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
2db20 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
2db30 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
2db40 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 69  t = p->pBt;..  i
2db50 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  f( p->inTrans!=T
2db60 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
2db70 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 72 65    return pBt->re
2db80 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f  adOnly ? SQLITE_
2db90 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54  READONLY : SQLIT
2dba0 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
2dbb0 2f 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  /* It is illegal
2dbc0 20 74 6f 20 64 72 6f 70 20 61 20 74 61 62 6c 65   to drop a table
2dbd0 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 20   if any cursors 
2dbe0 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a  are open on the.
2dbf0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54    ** database. T
2dc00 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69  his is because i
2dc10 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f  n auto-vacuum mo
2dc20 64 65 20 74 68 65 20 62 61 63 6b 65 6e 64 20 6d  de the backend m
2dc30 61 79 0a 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20  ay.  ** need to 
2dc40 6d 6f 76 65 20 61 6e 6f 74 68 65 72 20 72 6f 6f  move another roo
2dc50 74 2d 70 61 67 65 20 74 6f 20 66 69 6c 6c 20 61  t-page to fill a
2dc60 20 67 61 70 20 6c 65 66 74 20 62 79 20 74 68 65   gap left by the
2dc70 20 64 65 6c 65 74 65 64 0a 20 20 2a 2a 20 72 6f   deleted.  ** ro
2dc80 6f 74 20 70 61 67 65 2e 20 49 66 20 61 6e 20 6f  ot page. If an o
2dc90 70 65 6e 20 63 75 72 73 6f 72 20 77 61 73 20 75  pen cursor was u
2dca0 73 69 6e 67 20 74 68 69 73 20 70 61 67 65 20 61  sing this page a
2dcb0 20 70 72 6f 62 6c 65 6d 20 77 6f 75 6c 64 20 0a   problem would .
2dcc0 20 20 2a 2a 20 6f 63 63 75 72 2e 0a 20 20 2a 2f    ** occur..  */
2dcd0 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 43 75 72  .  if( pBt->pCur
2dce0 73 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  sor ){.    retur
2dcf0 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b  n SQLITE_LOCKED;
2dd00 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 67 65 74  .  }..  rc = get
2dd10 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29  Page(pBt, (Pgno)
2dd20 69 54 61 62 6c 65 2c 20 26 70 50 61 67 65 2c 20  iTable, &pPage, 
2dd30 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  0);.  if( rc ) r
2dd40 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d  eturn rc;.  rc =
2dd50 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
2dd60 61 72 54 61 62 6c 65 28 70 2c 20 69 54 61 62 6c  arTable(p, iTabl
2dd70 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  e);.  if( rc ){.
2dd80 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2dd90 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75  pPage);.    retu
2dda0 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2a 70  rn rc;.  }..  *p
2ddb0 69 4d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 69  iMoved = 0;..  i
2ddc0 66 28 20 69 54 61 62 6c 65 3e 31 20 29 7b 0a 23  f( iTable>1 ){.#
2ddd0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
2dde0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
2ddf0 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70   rc = freePage(p
2de00 50 61 67 65 29 3b 0a 20 20 20 20 72 65 6c 65 61  Page);.    relea
2de10 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 23  sePage(pPage);.#
2de20 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70 42 74  else.    if( pBt
2de30 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
2de40 20 20 20 20 20 20 50 67 6e 6f 20 6d 61 78 52 6f        Pgno maxRo
2de50 6f 74 50 67 6e 6f 3b 0a 20 20 20 20 20 20 72 63  otPgno;.      rc
2de60 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
2de70 65 74 4d 65 74 61 28 70 2c 20 34 2c 20 26 6d 61  etMeta(p, 4, &ma
2de80 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20 20 20  xRootPgno);.    
2de90 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2dea0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2deb0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
2dec0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
2ded0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
2dee0 20 20 20 20 20 69 66 28 20 69 54 61 62 6c 65 3d       if( iTable=
2def0 3d 6d 61 78 52 6f 6f 74 50 67 6e 6f 20 29 7b 0a  =maxRootPgno ){.
2df00 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
2df10 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72  e table being dr
2df20 6f 70 70 65 64 20 69 73 20 74 68 65 20 74 61 62  opped is the tab
2df30 6c 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67  le with the larg
2df40 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20  est root-page.  
2df50 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
2df60 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  in the database,
2df70 20 70 75 74 20 74 68 65 20 72 6f 6f 74 20 70 61   put the root pa
2df80 67 65 20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c  ge on the free l
2df90 69 73 74 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f  ist. .        */
2dfa0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 72  .        rc = fr
2dfb0 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  eePage(pPage);. 
2dfc0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
2dfd0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ge(pPage);.     
2dfe0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2dff0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2e000 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2e010 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
2e020 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
2e030 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64  he table being d
2e040 72 6f 70 70 65 64 20 64 6f 65 73 20 6e 6f 74 20  ropped does not 
2e050 68 61 76 65 20 74 68 65 20 6c 61 72 67 65 73 74  have the largest
2e060 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 20   root-page.     
2e070 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 69 6e 20     ** number in 
2e080 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 53 6f  the database. So
2e090 20 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 74   move the page t
2e0a0 68 61 74 20 64 6f 65 73 20 69 6e 74 6f 20 74 68  hat does into th
2e0b0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 61  e .        ** ga
2e0c0 70 20 6c 65 66 74 20 62 79 20 74 68 65 20 64 65  p left by the de
2e0d0 6c 65 74 65 64 20 72 6f 6f 74 2d 70 61 67 65 2e  leted root-page.
2e0e0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2e0f0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4d 6f      MemPage *pMo
2e100 76 65 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65  ve;.        rele
2e110 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
2e120 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74          rc = get
2e130 50 61 67 65 28 70 42 74 2c 20 6d 61 78 52 6f 6f  Page(pBt, maxRoo
2e140 74 50 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20 30  tPgno, &pMove, 0
2e150 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2e160 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2e170 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2e180 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
2e190 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f         rc = relo
2e1a0 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4d  catePage(pBt, pM
2e1b0 6f 76 65 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54  ove, PTRMAP_ROOT
2e1c0 50 41 47 45 2c 20 30 2c 20 69 54 61 62 6c 65 29  PAGE, 0, iTable)
2e1d0 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
2e1e0 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20  ePage(pMove);.  
2e1f0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2e200 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2e210 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2e220 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e230 20 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70    rc = getPage(p
2e240 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c  Bt, maxRootPgno,
2e250 20 26 70 4d 6f 76 65 2c 20 30 29 3b 0a 20 20 20   &pMove, 0);.   
2e260 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2e270 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2e280 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2e290 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e2a0 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70   rc = freePage(p
2e2b0 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Move);.        r
2e2c0 65 6c 65 61 73 65 50 61 67 65 28 70 4d 6f 76 65  eleasePage(pMove
2e2d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2e2e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2e2f0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2e300 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
2e310 20 20 20 20 20 20 20 2a 70 69 4d 6f 76 65 64 20         *piMoved 
2e320 3d 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20  = maxRootPgno;. 
2e330 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
2e340 20 53 65 74 20 74 68 65 20 6e 65 77 20 27 6d 61   Set the new 'ma
2e350 78 2d 72 6f 6f 74 2d 70 61 67 65 27 20 76 61 6c  x-root-page' val
2e360 75 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ue in the databa
2e370 73 65 20 68 65 61 64 65 72 2e 20 54 68 69 73 0a  se header. This.
2e380 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20        ** is the 
2e390 6f 6c 64 20 76 61 6c 75 65 20 6c 65 73 73 20 6f  old value less o
2e3a0 6e 65 2c 20 6c 65 73 73 20 6f 6e 65 20 6d 6f 72  ne, less one mor
2e3b0 65 20 69 66 20 74 68 61 74 20 68 61 70 70 65 6e  e if that happen
2e3c0 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 62 65  s to.      ** be
2e3d0 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d   a root-page num
2e3e0 62 65 72 2c 20 6c 65 73 73 20 6f 6e 65 20 61 67  ber, less one ag
2e3f0 61 69 6e 20 69 66 20 74 68 61 74 20 69 73 20 74  ain if that is t
2e400 68 65 0a 20 20 20 20 20 20 2a 2a 20 50 45 4e 44  he.      ** PEND
2e410 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 2e 0a 20  ING_BYTE_PAGE.. 
2e420 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 61       */.      ma
2e430 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20  xRootPgno--;.   
2e440 20 20 20 69 66 28 20 6d 61 78 52 6f 6f 74 50 67     if( maxRootPg
2e450 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no==PENDING_BYTE
2e460 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
2e470 20 20 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e        maxRootPgn
2e480 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  o--;.      }.   
2e490 20 20 20 69 66 28 20 6d 61 78 52 6f 6f 74 50 67     if( maxRootPg
2e4a0 6e 6f 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e  no==PTRMAP_PAGEN
2e4b0 4f 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67  O(pBt, maxRootPg
2e4c0 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  no) ){.        m
2e4d0 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20  axRootPgno--;.  
2e4e0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
2e4f0 72 74 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 21  rt( maxRootPgno!
2e500 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
2e510 47 45 28 70 42 74 29 20 29 3b 0a 0a 20 20 20 20  GE(pBt) );..    
2e520 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2e530 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 70 2c  reeUpdateMeta(p,
2e540 20 34 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29   4, maxRootPgno)
2e550 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2e560 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
2e570 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72  (pPage);.      r
2e580 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
2e590 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
2e5a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
2e5b0 49 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  If sqlite3BtreeD
2e5c0 72 6f 70 54 61 62 6c 65 20 77 61 73 20 63 61 6c  ropTable was cal
2e5d0 6c 65 64 20 6f 6e 20 70 61 67 65 20 31 2e 20 2a  led on page 1. *
2e5e0 2f 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70  /.    zeroPage(p
2e5f0 50 61 67 65 2c 20 50 54 46 5f 49 4e 54 4b 45 59  Page, PTF_INTKEY
2e600 7c 50 54 46 5f 4c 45 41 46 20 29 3b 0a 20 20 20  |PTF_LEAF );.   
2e610 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
2e620 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ge);.  }.  retur
2e630 6e 20 72 63 3b 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a  n rc;  .}.../*.*
2e640 2a 20 52 65 61 64 20 74 68 65 20 6d 65 74 61 2d  * Read the meta-
2e650 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20  information out 
2e660 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 66 69  of a database fi
2e670 6c 65 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20  le.  Meta[0].** 
2e680 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
2e690 20 66 72 65 65 20 70 61 67 65 73 20 63 75 72 72   free pages curr
2e6a0 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 64 61 74  ently in the dat
2e6b0 61 62 61 73 65 2e 20 20 4d 65 74 61 5b 31 5d 0a  abase.  Meta[1].
2e6c0 2a 2a 20 74 68 72 6f 75 67 68 20 6d 65 74 61 5b  ** through meta[
2e6d0 31 35 5d 20 61 72 65 20 61 76 61 69 6c 61 62 6c  15] are availabl
2e6e0 65 20 66 6f 72 20 75 73 65 20 62 79 20 68 69 67  e for use by hig
2e6f0 68 65 72 20 6c 61 79 65 72 73 2e 20 20 4d 65 74  her layers.  Met
2e700 61 5b 30 5d 0a 2a 2a 20 69 73 20 72 65 61 64 2d  a[0].** is read-
2e710 6f 6e 6c 79 2c 20 74 68 65 20 6f 74 68 65 72 73  only, the others
2e720 20 61 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e   are read/write.
2e730 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 73 63 68 65  .** .** The sche
2e740 6d 61 20 6c 61 79 65 72 20 6e 75 6d 62 65 72 73  ma layer numbers
2e750 20 6d 65 74 61 20 76 61 6c 75 65 73 20 64 69 66   meta values dif
2e760 66 65 72 65 6e 74 6c 79 2e 20 20 41 74 20 74 68  ferently.  At th
2e770 65 20 73 63 68 65 6d 61 0a 2a 2a 20 6c 61 79 65  e schema.** laye
2e780 72 20 28 61 6e 64 20 74 68 65 20 53 65 74 43 6f  r (and the SetCo
2e790 6f 6b 69 65 20 61 6e 64 20 52 65 61 64 43 6f 6f  okie and ReadCoo
2e7a0 6b 69 65 20 6f 70 63 6f 64 65 73 29 20 74 68 65  kie opcodes) the
2e7b0 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 66 72   number of.** fr
2e7c0 65 65 20 70 61 67 65 73 20 69 73 20 6e 6f 74 20  ee pages is not 
2e7d0 76 69 73 69 62 6c 65 2e 20 20 53 6f 20 43 6f 6f  visible.  So Coo
2e7e0 6b 69 65 5b 30 5d 20 69 73 20 74 68 65 20 73 61  kie[0] is the sa
2e7f0 6d 65 20 61 73 20 4d 65 74 61 5b 31 5d 2e 0a 2a  me as Meta[1]..*
2e800 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
2e810 65 65 47 65 74 4d 65 74 61 28 42 74 72 65 65 20  eeGetMeta(Btree 
2e820 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 75 33 32  *p, int idx, u32
2e830 20 2a 70 4d 65 74 61 29 7b 0a 20 20 44 62 50 61   *pMeta){.  DbPa
2e840 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 69  ge *pDbPage;.  i
2e850 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65  nt rc;.  unsigne
2e860 64 20 63 68 61 72 20 2a 70 50 31 3b 0a 20 20 42  d char *pP1;.  B
2e870 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2e880 2d 3e 70 42 74 3b 0a 0a 20 20 2f 2a 20 52 65 61  ->pBt;..  /* Rea
2e890 64 69 6e 67 20 61 20 6d 65 74 61 2d 64 61 74 61  ding a meta-data
2e8a0 20 76 61 6c 75 65 20 72 65 71 75 69 72 65 73 20   value requires 
2e8b0 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70  a read-lock on p
2e8c0 61 67 65 20 31 20 28 61 6e 64 20 68 65 6e 63 65  age 1 (and hence
2e8d0 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  .  ** the sqlite
2e8e0 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 57  _master table. W
2e8f0 65 20 67 72 61 62 20 74 68 69 73 20 6c 6f 63 6b  e grab this lock
2e900 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   regardless of w
2e910 68 65 74 68 65 72 20 6f 72 0a 20 20 2a 2a 20 6e  hether or.  ** n
2e920 6f 74 20 74 68 65 20 53 51 4c 49 54 45 5f 52 65  ot the SQLITE_Re
2e930 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  adUncommitted fl
2e940 61 67 20 69 73 20 73 65 74 20 28 74 68 65 20 74  ag is set (the t
2e950 61 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70  able rooted at p
2e960 61 67 65 0a 20 20 2a 2a 20 31 20 69 73 20 74 72  age.  ** 1 is tr
2e970 65 61 74 65 64 20 61 73 20 61 20 73 70 65 63 69  eated as a speci
2e980 61 6c 20 63 61 73 65 20 62 79 20 71 75 65 72 79  al case by query
2e990 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 20  TableLock() and 
2e9a0 6c 6f 63 6b 54 61 62 6c 65 28 29 29 2e 0a 20 20  lockTable())..  
2e9b0 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65 72 79 54  */.  rc = queryT
2e9c0 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 31 2c 20 52  ableLock(p, 1, R
2e9d0 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28  EAD_LOCK);.  if(
2e9e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2e9f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
2ea00 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
2ea10 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 3d 31  idx>=0 && idx<=1
2ea20 35 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  5 );.  rc = sqli
2ea30 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
2ea40 3e 70 50 61 67 65 72 2c 20 31 2c 20 26 70 44 62  >pPager, 1, &pDb
2ea50 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
2ea60 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70  ) return rc;.  p
2ea70 50 31 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  P1 = (unsigned c
2ea80 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67  har *)sqlite3Pag
2ea90 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
2eaa0 65 29 3b 0a 20 20 2a 70 4d 65 74 61 20 3d 20 67  e);.  *pMeta = g
2eab0 65 74 34 62 79 74 65 28 26 70 50 31 5b 33 36 20  et4byte(&pP1[36 
2eac0 2b 20 69 64 78 2a 34 5d 29 3b 0a 20 20 73 71 6c  + idx*4]);.  sql
2ead0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
2eae0 44 62 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 20 49  DbPage);..  /* I
2eaf0 66 20 61 75 74 6f 76 61 63 75 75 6d 65 64 20 69  f autovacuumed i
2eb00 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 74 68  s disabled in th
2eb10 69 73 20 62 75 69 6c 64 20 62 75 74 20 77 65 20  is build but we 
2eb20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 0a 20  are trying to . 
2eb30 20 2a 2a 20 61 63 63 65 73 73 20 61 6e 20 61 75   ** access an au
2eb40 74 6f 76 61 63 75 75 6d 65 64 20 64 61 74 61 62  tovacuumed datab
2eb50 61 73 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 74  ase, then make t
2eb60 68 65 20 64 61 74 61 62 61 73 65 20 72 65 61 64  he database read
2eb70 6f 6e 6c 79 2e 20 0a 20 20 2a 2f 0a 23 69 66 64  only. .  */.#ifd
2eb80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2eb90 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20  UTOVACUUM.  if( 
2eba0 69 64 78 3d 3d 34 20 26 26 20 2a 70 4d 65 74 61  idx==4 && *pMeta
2ebb0 3e 30 20 29 20 70 42 74 2d 3e 72 65 61 64 4f 6e  >0 ) pBt->readOn
2ebc0 6c 79 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a  ly = 1;.#endif..
2ebd0 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20 72 65    /* Grab the re
2ebe0 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70 61 67 65 20  ad-lock on page 
2ebf0 31 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 6c 6f 63  1. */.  rc = loc
2ec00 6b 54 61 62 6c 65 28 70 2c 20 31 2c 20 52 45 41  kTable(p, 1, REA
2ec10 44 5f 4c 4f 43 4b 29 3b 0a 20 20 72 65 74 75 72  D_LOCK);.  retur
2ec20 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  n rc;.}../*.** W
2ec30 72 69 74 65 20 6d 65 74 61 2d 69 6e 66 6f 72 6d  rite meta-inform
2ec40 61 74 69 6f 6e 20 62 61 63 6b 20 69 6e 74 6f 20  ation back into 
2ec50 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4d  the database.  M
2ec60 65 74 61 5b 30 5d 20 69 73 0a 2a 2a 20 72 65 61  eta[0] is.** rea
2ec70 64 2d 6f 6e 6c 79 20 61 6e 64 20 6d 61 79 20 6e  d-only and may n
2ec80 6f 74 20 62 65 20 77 72 69 74 74 65 6e 2e 0a 2a  ot be written..*
2ec90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
2eca0 65 65 55 70 64 61 74 65 4d 65 74 61 28 42 74 72  eeUpdateMeta(Btr
2ecb0 65 65 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20  ee *p, int idx, 
2ecc0 75 33 32 20 69 4d 65 74 61 29 7b 0a 20 20 42 74  u32 iMeta){.  Bt
2ecd0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2ece0 3e 70 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64  >pBt;.  unsigned
2ecf0 20 63 68 61 72 20 2a 70 50 31 3b 0a 20 20 69 6e   char *pP1;.  in
2ed00 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
2ed10 69 64 78 3e 3d 31 20 26 26 20 69 64 78 3c 3d 31  idx>=1 && idx<=1
2ed20 35 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e  5 );.  if( p->in
2ed30 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49  Trans!=TRANS_WRI
2ed40 54 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  TE ){.    return
2ed50 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f   pBt->readOnly ?
2ed60 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
2ed70 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   : SQLITE_ERROR;
2ed80 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
2ed90 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 3b  Bt->pPage1!=0 );
2eda0 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50  .  pP1 = pBt->pP
2edb0 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72  age1->aData;.  r
2edc0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2edd0 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
2ede0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  1->pDbPage);.  i
2edf0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2ee00 63 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  c;.  put4byte(&p
2ee10 50 31 5b 33 36 20 2b 20 69 64 78 2a 34 5d 2c 20  P1[36 + idx*4], 
2ee20 69 4d 65 74 61 29 3b 0a 20 20 72 65 74 75 72 6e  iMeta);.  return
2ee30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
2ee40 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2ee50 66 6c 61 67 20 62 79 74 65 20 61 74 20 74 68 65  flag byte at the
2ee60 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
2ee70 65 20 70 61 67 65 20 74 68 61 74 20 74 68 65 20  e page that the 
2ee80 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 63 75 72  cursor.** is cur
2ee90 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20  rently pointing 
2eea0 74 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  to..*/.int sqlit
2eeb0 65 33 42 74 72 65 65 46 6c 61 67 73 28 42 74 43  e3BtreeFlags(BtC
2eec0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
2eed0 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 61 62  /* TODO: What ab
2eee0 6f 75 74 20 43 55 52 53 4f 52 5f 52 45 51 55 49  out CURSOR_REQUI
2eef0 52 45 53 45 45 4b 20 73 74 61 74 65 3f 20 50 72  RESEEK state? Pr
2ef00 6f 62 61 62 6c 79 20 6e 65 65 64 20 74 6f 20 63  obably need to c
2ef10 61 6c 6c 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65  all.  ** restore
2ef20 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73  OrClearCursorPos
2ef30 69 74 69 6f 6e 28 29 20 68 65 72 65 2e 0a 20 20  ition() here..  
2ef40 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  */.  MemPage *pP
2ef50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
2ef60 65 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  e;.  return pPag
2ef70 65 20 3f 20 70 50 61 67 65 2d 3e 61 44 61 74 61  e ? pPage->aData
2ef80 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
2ef90 74 5d 20 3a 20 30 3b 0a 7d 0a 0a 23 69 66 64 65  t] : 0;.}..#ifde
2efa0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
2efb0 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 64 69 73  *.** Print a dis
2efc0 61 73 73 65 6d 62 6c 79 20 6f 66 20 74 68 65 20  assembly of the 
2efd0 67 69 76 65 6e 20 70 61 67 65 20 6f 6e 20 73 74  given page on st
2efe0 61 6e 64 61 72 64 20 6f 75 74 70 75 74 2e 20 20  andard output.  
2eff0 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
2f000 69 73 20 75 73 65 64 20 66 6f 72 20 64 65 62 75  is used for debu
2f010 67 67 69 6e 67 20 61 6e 64 20 74 65 73 74 69 6e  gging and testin
2f020 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  g only..*/.stati
2f030 63 20 69 6e 74 20 62 74 72 65 65 50 61 67 65 44  c int btreePageD
2f040 75 6d 70 28 42 74 53 68 61 72 65 64 20 2a 70 42  ump(BtShared *pB
2f050 74 2c 20 69 6e 74 20 70 67 6e 6f 2c 20 69 6e 74  t, int pgno, int
2f060 20 72 65 63 75 72 73 69 76 65 2c 20 4d 65 6d 50   recursive, MemP
2f070 61 67 65 20 2a 70 50 61 72 65 6e 74 29 7b 0a 20  age *pParent){. 
2f080 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61   int rc;.  MemPa
2f090 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74  ge *pPage;.  int
2f0a0 20 69 2c 20 6a 2c 20 63 3b 0a 20 20 69 6e 74 20   i, j, c;.  int 
2f0b0 6e 46 72 65 65 3b 0a 20 20 75 31 36 20 69 64 78  nFree;.  u16 idx
2f0c0 3b 0a 20 20 69 6e 74 20 68 64 72 3b 0a 20 20 69  ;.  int hdr;.  i
2f0d0 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 69 6e 74 20  nt nCell;.  int 
2f0e0 69 73 49 6e 69 74 3b 0a 20 20 75 6e 73 69 67 6e  isInit;.  unsign
2f0f0 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20  ed char *data;. 
2f100 20 63 68 61 72 20 72 61 6e 67 65 5b 32 30 5d 3b   char range[20];
2f110 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2f120 20 70 61 79 6c 6f 61 64 5b 32 30 5d 3b 0a 0a 20   payload[20];.. 
2f130 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70 42   rc = getPage(pB
2f140 74 2c 20 28 50 67 6e 6f 29 70 67 6e 6f 2c 20 26  t, (Pgno)pgno, &
2f150 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 73 49  pPage, 0);.  isI
2f160 6e 69 74 20 3d 20 70 50 61 67 65 2d 3e 69 73 49  nit = pPage->isI
2f170 6e 69 74 3b 0a 20 20 69 66 28 20 70 50 61 67 65  nit;.  if( pPage
2f180 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b 0a 20  ->isInit==0 ){. 
2f190 20 20 20 69 6e 69 74 50 61 67 65 28 70 50 61 67     initPage(pPag
2f1a0 65 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d  e, pParent);.  }
2f1b0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
2f1c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2f1d0 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
2f1e0 64 72 4f 66 66 73 65 74 3b 0a 20 20 64 61 74 61  drOffset;.  data
2f1f0 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
2f200 0a 20 20 63 20 3d 20 64 61 74 61 5b 68 64 72 5d  .  c = data[hdr]
2f210 3b 0a 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ;.  pPage->intKe
2f220 79 20 3d 20 28 63 20 26 20 28 50 54 46 5f 49 4e  y = (c & (PTF_IN
2f230 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54  TKEY|PTF_LEAFDAT
2f240 41 29 29 21 3d 30 3b 0a 20 20 70 50 61 67 65 2d  A))!=0;.  pPage-
2f250 3e 7a 65 72 6f 44 61 74 61 20 3d 20 28 63 20 26  >zeroData = (c &
2f260 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 29 21 3d   PTF_ZERODATA)!=
2f270 30 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66  0;.  pPage->leaf
2f280 44 61 74 61 20 3d 20 28 63 20 26 20 50 54 46 5f  Data = (c & PTF_
2f290 4c 45 41 46 44 41 54 41 29 21 3d 30 3b 0a 20 20  LEAFDATA)!=0;.  
2f2a0 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 63  pPage->leaf = (c
2f2b0 20 26 20 50 54 46 5f 4c 45 41 46 29 21 3d 30 3b   & PTF_LEAF)!=0;
2f2c0 0a 20 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74  .  pPage->hasDat
2f2d0 61 20 3d 20 21 28 70 50 61 67 65 2d 3e 7a 65 72  a = !(pPage->zer
2f2e0 6f 44 61 74 61 20 7c 7c 20 28 21 70 50 61 67 65  oData || (!pPage
2f2f0 2d 3e 6c 65 61 66 20 26 26 20 70 50 61 67 65 2d  ->leaf && pPage-
2f300 3e 6c 65 61 66 44 61 74 61 29 29 3b 0a 20 20 6e  >leafData));.  n
2f310 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28  Cell = get2byte(
2f320 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20  &data[hdr+3]);. 
2f330 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
2f340 6e 74 66 28 22 50 41 47 45 20 25 64 3a 20 20 66  ntf("PAGE %d:  f
2f350 6c 61 67 73 3d 30 78 25 30 32 78 20 20 66 72 61  lags=0x%02x  fra
2f360 67 3d 25 64 20 20 20 70 61 72 65 6e 74 3d 25 64  g=%d   parent=%d
2f370 5c 6e 22 2c 20 70 67 6e 6f 2c 0a 20 20 20 20 64  \n", pgno,.    d
2f380 61 74 61 5b 68 64 72 5d 2c 20 64 61 74 61 5b 68  ata[hdr], data[h
2f390 64 72 2b 37 5d 2c 20 0a 20 20 20 20 28 70 50 61  dr+7], .    (pPa
2f3a0 67 65 2d 3e 69 73 49 6e 69 74 20 26 26 20 70 50  ge->isInit && pP
2f3b0 61 67 65 2d 3e 70 50 61 72 65 6e 74 29 20 3f 20  age->pParent) ? 
2f3c0 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 2d 3e  pPage->pParent->
2f3d0 70 67 6e 6f 20 3a 20 30 29 3b 0a 20 20 61 73 73  pgno : 0);.  ass
2f3e0 65 72 74 28 20 68 64 72 20 3d 3d 20 28 70 67 6e  ert( hdr == (pgn
2f3f0 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20  o==1 ? 100 : 0) 
2f400 29 3b 0a 20 20 69 64 78 20 3d 20 68 64 72 20 2b  );.  idx = hdr +
2f410 20 31 32 20 2d 20 70 50 61 67 65 2d 3e 6c 65 61   12 - pPage->lea
2f420 66 2a 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  f*4;.  for(i=0; 
2f430 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
2f440 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
2f450 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64  ;.    Pgno child
2f460 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ;.    unsigned c
2f470 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20  har *pCell;.    
2f480 69 6e 74 20 73 7a 3b 0a 20 20 20 20 69 6e 74 20  int sz;.    int 
2f490 61 64 64 72 3b 0a 0a 20 20 20 20 61 64 64 72 20  addr;..    addr 
2f4a0 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
2f4b0 5b 69 64 78 20 2b 20 32 2a 69 5d 29 3b 0a 20 20  [idx + 2*i]);.  
2f4c0 20 20 70 43 65 6c 6c 20 3d 20 26 64 61 74 61 5b    pCell = &data[
2f4d0 61 64 64 72 5d 3b 0a 20 20 20 20 70 61 72 73 65  addr];.    parse
2f4e0 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
2f4f0 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
2f500 20 20 73 7a 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a    sz = info.nSiz
2f510 65 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 72  e;.    sprintf(r
2f520 61 6e 67 65 2c 22 25 64 2e 2e 25 64 22 2c 20 61  ange,"%d..%d", a
2f530 64 64 72 2c 20 61 64 64 72 2b 73 7a 2d 31 29 3b  ddr, addr+sz-1);
2f540 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
2f550 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 63 68  leaf ){.      ch
2f560 69 6c 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ild = 0;.    }el
2f570 73 65 7b 0a 20 20 20 20 20 20 63 68 69 6c 64 20  se{.      child 
2f580 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  = get4byte(pCell
2f590 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 20  );.    }.    sz 
2f5a0 3d 20 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20  = info.nData;.  
2f5b0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69 6e    if( !pPage->in
2f5c0 74 4b 65 79 20 29 20 73 7a 20 2b 3d 20 69 6e 66  tKey ) sz += inf
2f5d0 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 69 66 28 20  o.nKey;.    if( 
2f5e0 73 7a 3e 73 69 7a 65 6f 66 28 70 61 79 6c 6f 61  sz>sizeof(payloa
2f5f0 64 29 2d 31 20 29 20 73 7a 20 3d 20 73 69 7a 65  d)-1 ) sz = size
2f600 6f 66 28 70 61 79 6c 6f 61 64 29 2d 31 3b 0a 20  of(payload)-1;. 
2f610 20 20 20 6d 65 6d 63 70 79 28 70 61 79 6c 6f 61     memcpy(payloa
2f620 64 2c 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 6e  d, &pCell[info.n
2f630 48 65 61 64 65 72 5d 2c 20 73 7a 29 3b 0a 20 20  Header], sz);.  
2f640 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 7a 3b    for(j=0; j<sz;
2f650 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
2f660 20 70 61 79 6c 6f 61 64 5b 6a 5d 3c 30 78 32 30   payload[j]<0x20
2f670 20 7c 7c 20 70 61 79 6c 6f 61 64 5b 6a 5d 3e 30   || payload[j]>0
2f680 78 37 66 20 29 20 70 61 79 6c 6f 61 64 5b 6a 5d  x7f ) payload[j]
2f690 20 3d 20 27 2e 27 3b 0a 20 20 20 20 7d 0a 20 20   = '.';.    }.  
2f6a0 20 20 70 61 79 6c 6f 61 64 5b 73 7a 5d 20 3d 20    payload[sz] = 
2f6b0 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  0;.    sqlite3De
2f6c0 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20  bugPrintf(.     
2f6d0 20 22 63 65 6c 6c 20 25 32 64 3a 20 69 3d 25 2d   "cell %2d: i=%-
2f6e0 31 30 73 20 63 68 6c 64 3d 25 2d 34 64 20 6e 6b  10s chld=%-4d nk
2f6f0 3d 25 2d 34 6c 6c 64 20 6e 64 3d 25 2d 34 64 20  =%-4lld nd=%-4d 
2f700 70 61 79 6c 6f 61 64 3d 25 73 5c 6e 22 2c 0a 20  payload=%s\n",. 
2f710 20 20 20 20 20 69 2c 20 72 61 6e 67 65 2c 20 63       i, range, c
2f720 68 69 6c 64 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c  hild, info.nKey,
2f730 20 69 6e 66 6f 2e 6e 44 61 74 61 2c 20 70 61 79   info.nData, pay
2f740 6c 6f 61 64 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  load.    );.  }.
2f750 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2f760 61 66 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  af ){.    sqlite
2f770 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 72 69  3DebugPrintf("ri
2f780 67 68 74 5f 63 68 69 6c 64 3a 20 25 64 5c 6e 22  ght_child: %d\n"
2f790 2c 20 67 65 74 34 62 79 74 65 28 26 64 61 74 61  , get4byte(&data
2f7a0 5b 68 64 72 2b 38 5d 29 29 3b 0a 20 20 7d 0a 20  [hdr+8]));.  }. 
2f7b0 20 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20 69 20   nFree = 0;.  i 
2f7c0 3d 20 30 3b 0a 20 20 69 64 78 20 3d 20 67 65 74  = 0;.  idx = get
2f7d0 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
2f7e0 31 5d 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 64  1]);.  while( id
2f7f0 78 3e 30 20 26 26 20 69 64 78 3c 70 50 61 67 65  x>0 && idx<pPage
2f800 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
2f810 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 20  e ){.    int sz 
2f820 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
2f830 5b 69 64 78 2b 32 5d 29 3b 0a 20 20 20 20 73 70  [idx+2]);.    sp
2f840 72 69 6e 74 66 28 72 61 6e 67 65 2c 22 25 64 2e  rintf(range,"%d.
2f850 2e 25 64 22 2c 20 69 64 78 2c 20 69 64 78 2b 73  .%d", idx, idx+s
2f860 7a 2d 31 29 3b 0a 20 20 20 20 6e 46 72 65 65 20  z-1);.    nFree 
2f870 2b 3d 20 73 7a 3b 0a 20 20 20 20 73 71 6c 69 74  += sz;.    sqlit
2f880 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66  e3DebugPrintf("f
2f890 72 65 65 62 6c 6f 63 6b 20 25 32 64 3a 20 69 3d  reeblock %2d: i=
2f8a0 25 2d 31 30 73 20 73 69 7a 65 3d 25 2d 34 64 20  %-10s size=%-4d 
2f8b0 74 6f 74 61 6c 3d 25 64 5c 6e 22 2c 0a 20 20 20  total=%d\n",.   
2f8c0 20 20 20 20 69 2c 20 72 61 6e 67 65 2c 20 73 7a      i, range, sz
2f8d0 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20 20 69 64  , nFree);.    id
2f8e0 78 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  x = get2byte(&da
2f8f0 74 61 5b 69 64 78 5d 29 3b 0a 20 20 20 20 69 2b  ta[idx]);.    i+
2f900 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 64 78  +;.  }.  if( idx
2f910 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
2f920 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 45  e3DebugPrintf("E
2f930 52 52 4f 52 3a 20 6e 65 78 74 20 66 72 65 65 62  RROR: next freeb
2f940 6c 6f 63 6b 20 69 6e 64 65 78 20 6f 75 74 20 6f  lock index out o
2f950 66 20 72 61 6e 67 65 3a 20 25 64 5c 6e 22 2c 20  f range: %d\n", 
2f960 69 64 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  idx);.  }.  if( 
2f970 72 65 63 75 72 73 69 76 65 20 26 26 20 21 70 50  recursive && !pP
2f980 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2f990 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
2f9a0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75  l; i++){.      u
2f9b0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
2f9c0 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
2f9d0 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20  Page, i);.      
2f9e0 62 74 72 65 65 50 61 67 65 44 75 6d 70 28 70 42  btreePageDump(pB
2f9f0 74 2c 20 67 65 74 34 62 79 74 65 28 70 43 65 6c  t, get4byte(pCel
2fa00 6c 29 2c 20 31 2c 20 70 50 61 67 65 29 3b 0a 20  l), 1, pPage);. 
2fa10 20 20 20 20 20 69 64 78 20 3d 20 67 65 74 32 62       idx = get2b
2fa20 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20  yte(pCell);.    
2fa30 7d 0a 20 20 20 20 62 74 72 65 65 50 61 67 65 44  }.    btreePageD
2fa40 75 6d 70 28 70 42 74 2c 20 67 65 74 34 62 79 74  ump(pBt, get4byt
2fa50 65 28 26 64 61 74 61 5b 68 64 72 2b 38 5d 29 2c  e(&data[hdr+8]),
2fa60 20 31 2c 20 70 50 61 67 65 29 3b 0a 20 20 7d 0a   1, pPage);.  }.
2fa70 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
2fa80 3d 20 69 73 49 6e 69 74 3b 0a 20 20 73 71 6c 69  = isInit;.  sqli
2fa90 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
2faa0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
2fab0 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b   fflush(stdout);
2fac0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2fad0 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  _OK;.}.int sqlit
2fae0 65 33 42 74 72 65 65 50 61 67 65 44 75 6d 70 28  e3BtreePageDump(
2faf0 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 67  Btree *p, int pg
2fb00 6e 6f 2c 20 69 6e 74 20 72 65 63 75 72 73 69 76  no, int recursiv
2fb10 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 62 74 72  e){.  return btr
2fb20 65 65 50 61 67 65 44 75 6d 70 28 70 2d 3e 70 42  eePageDump(p->pB
2fb30 74 2c 20 70 67 6e 6f 2c 20 72 65 63 75 72 73 69  t, pgno, recursi
2fb40 76 65 2c 20 30 29 3b 0a 7d 0a 23 65 6e 64 69 66  ve, 0);.}.#endif
2fb50 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
2fb60 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65  LITE_TEST) || de
2fb70 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
2fb80 55 47 29 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 61  UG)./*.** Fill a
2fb90 52 65 73 75 6c 74 5b 5d 20 77 69 74 68 20 69 6e  Result[] with in
2fba0 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
2fbb0 74 68 65 20 65 6e 74 72 79 20 61 6e 64 20 70 61  the entry and pa
2fbc0 67 65 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 63  ge that the.** c
2fbd0 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
2fbe0 67 20 74 6f 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 61  g to..** .**   a
2fbf0 52 65 73 75 6c 74 5b 30 5d 20 3d 20 20 54 68 65  Result[0] =  The
2fc00 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 2a 2a 20   page number.** 
2fc10 20 20 61 52 65 73 75 6c 74 5b 31 5d 20 3d 20 20    aResult[1] =  
2fc20 54 68 65 20 65 6e 74 72 79 20 6e 75 6d 62 65 72  The entry number
2fc30 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 32 5d  .**   aResult[2]
2fc40 20 3d 20 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   =  Total number
2fc50 20 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e 20 74   of entries on t
2fc60 68 69 73 20 70 61 67 65 0a 2a 2a 20 20 20 61 52  his page.**   aR
2fc70 65 73 75 6c 74 5b 33 5d 20 3d 20 20 43 65 6c 6c  esult[3] =  Cell
2fc80 20 73 69 7a 65 20 28 6c 6f 63 61 6c 20 70 61 79   size (local pay
2fc90 6c 6f 61 64 20 2b 20 68 65 61 64 65 72 29 0a 2a  load + header).*
2fca0 2a 20 20 20 61 52 65 73 75 6c 74 5b 34 5d 20 3d  *   aResult[4] =
2fcb0 20 20 4e 75 6d 62 65 72 20 6f 66 20 66 72 65 65    Number of free
2fcc0 20 62 79 74 65 73 20 6f 6e 20 74 68 69 73 20 70   bytes on this p
2fcd0 61 67 65 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74  age.**   aResult
2fce0 5b 35 5d 20 3d 20 20 4e 75 6d 62 65 72 20 6f 66  [5] =  Number of
2fcf0 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 6f 6e 20   free blocks on 
2fd00 74 68 65 20 70 61 67 65 0a 2a 2a 20 20 20 61 52  the page.**   aR
2fd10 65 73 75 6c 74 5b 36 5d 20 3d 20 20 54 6f 74 61  esult[6] =  Tota
2fd20 6c 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 20 28  l payload size (
2fd30 6c 6f 63 61 6c 20 2b 20 6f 76 65 72 66 6c 6f 77  local + overflow
2fd40 29 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 37  ).**   aResult[7
2fd50 5d 20 3d 20 20 48 65 61 64 65 72 20 73 69 7a 65  ] =  Header size
2fd60 20 69 6e 20 62 79 74 65 73 0a 2a 2a 20 20 20 61   in bytes.**   a
2fd70 52 65 73 75 6c 74 5b 38 5d 20 3d 20 20 4c 6f 63  Result[8] =  Loc
2fd80 61 6c 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 0a  al payload size.
2fd90 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 39 5d 20  **   aResult[9] 
2fda0 3d 20 20 50 61 72 65 6e 74 20 70 61 67 65 20 6e  =  Parent page n
2fdb0 75 6d 62 65 72 0a 2a 2a 20 20 20 61 52 65 73 75  umber.**   aResu
2fdc0 6c 74 5b 31 30 5d 3d 20 20 50 61 67 65 20 6e 75  lt[10]=  Page nu
2fdd0 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73  mber of the firs
2fde0 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a  t overflow page.
2fdf0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2fe00 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  ne is used for t
2fe10 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67  esting and debug
2fe20 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e  ging only..*/.in
2fe30 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
2fe40 72 73 6f 72 49 6e 66 6f 28 42 74 43 75 72 73 6f  rsorInfo(BtCurso
2fe50 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 61 52  r *pCur, int *aR
2fe60 65 73 75 6c 74 2c 20 69 6e 74 20 75 70 43 6e 74  esult, int upCnt
2fe70 29 7b 0a 20 20 69 6e 74 20 63 6e 74 2c 20 69 64  ){.  int cnt, id
2fe80 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  x;.  MemPage *pP
2fe90 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
2fea0 65 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 74 6d  e;.  BtCursor tm
2feb0 70 43 75 72 3b 0a 0a 20 20 69 6e 74 20 72 63 20  pCur;..  int rc 
2fec0 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72  = restoreOrClear
2fed0 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
2fee0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  Cur);.  if( rc!=
2fef0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ff00 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2ff10 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2ff20 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 67 65  ->isInit );.  ge
2ff30 74 54 65 6d 70 43 75 72 73 6f 72 28 70 43 75 72  tTempCursor(pCur
2ff40 2c 20 26 74 6d 70 43 75 72 29 3b 0a 20 20 77 68  , &tmpCur);.  wh
2ff50 69 6c 65 28 20 75 70 43 6e 74 2d 2d 20 29 7b 0a  ile( upCnt-- ){.
2ff60 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74      moveToParent
2ff70 28 26 74 6d 70 43 75 72 29 3b 0a 20 20 7d 0a 20  (&tmpCur);.  }. 
2ff80 20 70 50 61 67 65 20 3d 20 74 6d 70 43 75 72 2e   pPage = tmpCur.
2ff90 70 50 61 67 65 3b 0a 20 20 61 52 65 73 75 6c 74  pPage;.  aResult
2ffa0 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 50 61 67  [0] = sqlite3Pag
2ffb0 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61  erPagenumber(pPa
2ffc0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
2ffd0 61 73 73 65 72 74 28 20 61 52 65 73 75 6c 74 5b  assert( aResult[
2ffe0 30 5d 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20  0]==pPage->pgno 
2fff0 29 3b 0a 20 20 61 52 65 73 75 6c 74 5b 31 5d 20  );.  aResult[1] 
30000 3d 20 74 6d 70 43 75 72 2e 69 64 78 3b 0a 20 20  = tmpCur.idx;.  
30010 61 52 65 73 75 6c 74 5b 32 5d 20 3d 20 70 50 61  aResult[2] = pPa
30020 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 66 28  ge->nCell;.  if(
30030 20 74 6d 70 43 75 72 2e 69 64 78 3e 3d 30 20 26   tmpCur.idx>=0 &
30040 26 20 74 6d 70 43 75 72 2e 69 64 78 3c 70 50 61  & tmpCur.idx<pPa
30050 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
30060 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 26 74 6d   getCellInfo(&tm
30070 70 43 75 72 29 3b 0a 20 20 20 20 61 52 65 73 75  pCur);.    aResu
30080 6c 74 5b 33 5d 20 3d 20 74 6d 70 43 75 72 2e 69  lt[3] = tmpCur.i
30090 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 20 20 61  nfo.nSize;.    a
300a0 52 65 73 75 6c 74 5b 36 5d 20 3d 20 74 6d 70 43  Result[6] = tmpC
300b0 75 72 2e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20  ur.info.nData;. 
300c0 20 20 20 61 52 65 73 75 6c 74 5b 37 5d 20 3d 20     aResult[7] = 
300d0 74 6d 70 43 75 72 2e 69 6e 66 6f 2e 6e 48 65 61  tmpCur.info.nHea
300e0 64 65 72 3b 0a 20 20 20 20 61 52 65 73 75 6c 74  der;.    aResult
300f0 5b 38 5d 20 3d 20 74 6d 70 43 75 72 2e 69 6e 66  [8] = tmpCur.inf
30100 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73  o.nLocal;.  }els
30110 65 7b 0a 20 20 20 20 61 52 65 73 75 6c 74 5b 33  e{.    aResult[3
30120 5d 20 3d 20 30 3b 0a 20 20 20 20 61 52 65 73 75  ] = 0;.    aResu
30130 6c 74 5b 36 5d 20 3d 20 30 3b 0a 20 20 20 20 61  lt[6] = 0;.    a
30140 52 65 73 75 6c 74 5b 37 5d 20 3d 20 30 3b 0a 20  Result[7] = 0;. 
30150 20 20 20 61 52 65 73 75 6c 74 5b 38 5d 20 3d 20     aResult[8] = 
30160 30 3b 0a 20 20 7d 0a 20 20 61 52 65 73 75 6c 74  0;.  }.  aResult
30170 5b 34 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 46 72  [4] = pPage->nFr
30180 65 65 3b 0a 20 20 63 6e 74 20 3d 20 30 3b 0a 20  ee;.  cnt = 0;. 
30190 20 69 64 78 20 3d 20 67 65 74 32 62 79 74 65 28   idx = get2byte(
301a0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
301b0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 31  age->hdrOffset+1
301c0 5d 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78  ]);.  while( idx
301d0 3e 30 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d  >0 && idx<pPage-
301e0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
301f0 20 29 7b 0a 20 20 20 20 63 6e 74 2b 2b 3b 0a 20   ){.    cnt++;. 
30200 20 20 20 69 64 78 20 3d 20 67 65 74 32 62 79 74     idx = get2byt
30210 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
30220 69 64 78 5d 29 3b 0a 20 20 7d 0a 20 20 61 52 65  idx]);.  }.  aRe
30230 73 75 6c 74 5b 35 5d 20 3d 20 63 6e 74 3b 0a 20  sult[5] = cnt;. 
30240 20 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61 72   if( pPage->pPar
30250 65 6e 74 3d 3d 30 20 7c 7c 20 69 73 52 6f 6f 74  ent==0 || isRoot
30260 50 61 67 65 28 70 50 61 67 65 29 20 29 7b 0a 20  Page(pPage) ){. 
30270 20 20 20 61 52 65 73 75 6c 74 5b 39 5d 20 3d 20     aResult[9] = 
30280 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
30290 61 52 65 73 75 6c 74 5b 39 5d 20 3d 20 70 50 61  aResult[9] = pPa
302a0 67 65 2d 3e 70 50 61 72 65 6e 74 2d 3e 70 67 6e  ge->pParent->pgn
302b0 6f 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 6d 70  o;.  }.  if( tmp
302c0 43 75 72 2e 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  Cur.info.iOverfl
302d0 6f 77 20 29 7b 0a 20 20 20 20 61 52 65 73 75 6c  ow ){.    aResul
302e0 74 5b 31 30 5d 20 3d 20 67 65 74 34 62 79 74 65  t[10] = get4byte
302f0 28 26 74 6d 70 43 75 72 2e 69 6e 66 6f 2e 70 43  (&tmpCur.info.pC
30300 65 6c 6c 5b 74 6d 70 43 75 72 2e 69 6e 66 6f 2e  ell[tmpCur.info.
30310 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 7d  iOverflow]);.  }
30320 65 6c 73 65 7b 0a 20 20 20 20 61 52 65 73 75 6c  else{.    aResul
30330 74 5b 31 30 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20  t[10] = 0;.  }. 
30340 20 72 65 6c 65 61 73 65 54 65 6d 70 43 75 72 73   releaseTempCurs
30350 6f 72 28 26 74 6d 70 43 75 72 29 3b 0a 20 20 72  or(&tmpCur);.  r
30360 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
30370 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
30380 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
30390 72 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  r associated wit
303a0 68 20 61 20 42 54 72 65 65 2e 20 20 54 68 69 73  h a BTree.  This
303b0 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
303c0 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
303d0 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
303e0 6c 79 2e 0a 2a 2f 0a 50 61 67 65 72 20 2a 73 71  ly..*/.Pager *sq
303f0 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
30400 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74  Btree *p){.  ret
30410 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67  urn p->pBt->pPag
30420 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  er;.}../*.** Thi
30430 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20 70  s structure is p
30440 61 73 73 65 64 20 61 72 6f 75 6e 64 20 74 68 72  assed around thr
30450 6f 75 67 68 20 61 6c 6c 20 74 68 65 20 73 61 6e  ough all the san
30460 69 74 79 20 63 68 65 63 6b 69 6e 67 20 72 6f 75  ity checking rou
30470 74 69 6e 65 73 0a 2a 2a 20 69 6e 20 6f 72 64 65  tines.** in orde
30480 72 20 74 6f 20 6b 65 65 70 20 74 72 61 63 6b 20  r to keep track 
30490 6f 66 20 73 6f 6d 65 20 67 6c 6f 62 61 6c 20 73  of some global s
304a0 74 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tate information
304b0 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
304c0 75 63 74 20 49 6e 74 65 67 72 69 74 79 43 6b 20  uct IntegrityCk 
304d0 49 6e 74 65 67 72 69 74 79 43 6b 3b 0a 73 74 72  IntegrityCk;.str
304e0 75 63 74 20 49 6e 74 65 67 72 69 74 79 43 6b 20  uct IntegrityCk 
304f0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
30500 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 74 72 65  t;    /* The tre
30510 65 20 62 65 69 6e 67 20 63 68 65 63 6b 65 64 20  e being checked 
30520 6f 75 74 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a  out */.  Pager *
30530 70 50 61 67 65 72 3b 20 20 20 20 2f 2a 20 54 68  pPager;    /* Th
30540 65 20 61 73 73 6f 63 69 61 74 65 64 20 70 61 67  e associated pag
30550 65 72 2e 20 20 41 6c 73 6f 20 61 63 63 65 73 73  er.  Also access
30560 69 62 6c 65 20 62 79 20 70 42 74 2d 3e 70 50 61  ible by pBt->pPa
30570 67 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ger */.  int nPa
30580 67 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ge;        /* Nu
30590 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
305a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
305b0 0a 20 20 69 6e 74 20 2a 61 6e 52 65 66 3b 20 20  .  int *anRef;  
305c0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
305d0 66 20 74 69 6d 65 73 20 65 61 63 68 20 70 61 67  f times each pag
305e0 65 20 69 73 20 72 65 66 65 72 65 6e 63 65 64 20  e is referenced 
305f0 2a 2f 0a 20 20 69 6e 74 20 6d 78 45 72 72 3b 20  */.  int mxErr; 
30600 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 70 20 61         /* Stop a
30610 63 63 75 6d 75 6c 61 74 69 6e 67 20 65 72 72 6f  ccumulating erro
30620 72 73 20 77 68 65 6e 20 74 68 69 73 20 72 65 61  rs when this rea
30630 63 68 65 73 20 7a 65 72 6f 20 2a 2f 0a 20 20 63  ches zero */.  c
30640 68 61 72 20 2a 7a 45 72 72 4d 73 67 3b 20 20 20  har *zErrMsg;   
30650 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 6d 65 73   /* An error mes
30660 73 61 67 65 2e 20 20 4e 55 4c 4c 20 69 66 20 6e  sage.  NULL if n
30670 6f 20 65 72 72 6f 72 73 20 73 65 65 6e 2e 20 2a  o errors seen. *
30680 2f 0a 20 20 69 6e 74 20 6e 45 72 72 3b 20 20 20  /.  int nErr;   
30690 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
306a0 6f 66 20 6d 65 73 73 61 67 65 73 20 77 72 69 74  of messages writ
306b0 74 65 6e 20 74 6f 20 7a 45 72 72 4d 73 67 20 73  ten to zErrMsg s
306c0 6f 20 66 61 72 20 2a 2f 0a 7d 3b 0a 0a 23 69 66  o far */.};..#if
306d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
306e0 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
306f0 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
30700 6d 65 73 73 61 67 65 20 74 6f 20 74 68 65 20 65  message to the e
30710 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74 72  rror message str
30720 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
30730 6f 69 64 20 63 68 65 63 6b 41 70 70 65 6e 64 4d  oid checkAppendM
30740 73 67 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43  sg(.  IntegrityC
30750 6b 20 2a 70 43 68 65 63 6b 2c 0a 20 20 63 68 61  k *pCheck,.  cha
30760 72 20 2a 7a 4d 73 67 31 2c 0a 20 20 63 6f 6e 73  r *zMsg1,.  cons
30770 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
30780 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20 76 61 5f 6c  .  ....){.  va_l
30790 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a  ist ap;.  char *
307a0 7a 4d 73 67 32 3b 0a 20 20 69 66 28 20 21 70 43  zMsg2;.  if( !pC
307b0 68 65 63 6b 2d 3e 6d 78 45 72 72 20 29 20 72 65  heck->mxErr ) re
307c0 74 75 72 6e 3b 0a 20 20 70 43 68 65 63 6b 2d 3e  turn;.  pCheck->
307d0 6d 78 45 72 72 2d 2d 3b 0a 20 20 70 43 68 65 63  mxErr--;.  pChec
307e0 6b 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 76 61 5f  k->nErr++;.  va_
307f0 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
30800 74 29 3b 0a 20 20 7a 4d 73 67 32 20 3d 20 73 71  t);.  zMsg2 = sq
30810 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 7a 46  lite3VMPrintf(zF
30820 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61  ormat, ap);.  va
30830 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20  _end(ap);.  if( 
30840 7a 4d 73 67 31 3d 3d 30 20 29 20 7a 4d 73 67 31  zMsg1==0 ) zMsg1
30850 20 3d 20 22 22 3b 0a 20 20 69 66 28 20 70 43 68   = "";.  if( pCh
30860 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a  eck->zErrMsg ){.
30870 20 20 20 20 63 68 61 72 20 2a 7a 4f 6c 64 20 3d      char *zOld =
30880 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67   pCheck->zErrMsg
30890 3b 0a 20 20 20 20 70 43 68 65 63 6b 2d 3e 7a 45  ;.    pCheck->zE
308a0 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 73  rrMsg = 0;.    s
308b0 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
308c0 26 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67  &pCheck->zErrMsg
308d0 2c 20 7a 4f 6c 64 2c 20 22 5c 6e 22 2c 20 7a 4d  , zOld, "\n", zM
308e0 73 67 31 2c 20 7a 4d 73 67 32 2c 20 28 63 68 61  sg1, zMsg2, (cha
308f0 72 2a 29 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  r*)0);.    sqlit
30900 65 46 72 65 65 28 7a 4f 6c 64 29 3b 0a 20 20 7d  eFree(zOld);.  }
30910 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
30920 33 53 65 74 53 74 72 69 6e 67 28 26 70 43 68 65  3SetString(&pChe
30930 63 6b 2d 3e 7a 45 72 72 4d 73 67 2c 20 7a 4d 73  ck->zErrMsg, zMs
30940 67 31 2c 20 7a 4d 73 67 32 2c 20 28 63 68 61 72  g1, zMsg2, (char
30950 2a 29 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  *)0);.  }.  sqli
30960 74 65 46 72 65 65 28 7a 4d 73 67 32 29 3b 0a 7d  teFree(zMsg2);.}
30970 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
30980 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
30990 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64  _CHECK */..#ifnd
309a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
309b0 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f  NTEGRITY_CHECK./
309c0 2a 0a 2a 2a 20 41 64 64 20 31 20 74 6f 20 74 68  *.** Add 1 to th
309d0 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
309e0 74 20 66 6f 72 20 70 61 67 65 20 69 50 61 67 65  t for page iPage
309f0 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 74 68  .  If this is th
30a00 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 72 65 66 65  e second.** refe
30a10 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67  rence to the pag
30a20 65 2c 20 61 64 64 20 61 6e 20 65 72 72 6f 72 20  e, add an error 
30a30 6d 65 73 73 61 67 65 20 74 6f 20 70 43 68 65 63  message to pChec
30a40 6b 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 20 52  k->zErrMsg..** R
30a50 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 72 65  eturn 1 if there
30a60 20 61 72 65 20 32 20 6f 72 65 20 6d 6f 72 65 20   are 2 ore more 
30a70 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
30a80 65 20 70 61 67 65 20 61 6e 64 20 30 20 69 66 0a  e page and 0 if.
30a90 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20 74 68  ** if this is th
30aa0 65 20 66 69 72 73 74 20 72 65 66 65 72 65 6e 63  e first referenc
30ab0 65 20 74 6f 20 74 68 65 20 70 61 67 65 2e 0a 2a  e to the page..*
30ac0 2a 0a 2a 2a 20 41 6c 73 6f 20 63 68 65 63 6b 20  *.** Also check 
30ad0 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 75  that the page nu
30ae0 6d 62 65 72 20 69 73 20 69 6e 20 62 6f 75 6e 64  mber is in bound
30af0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
30b00 20 63 68 65 63 6b 52 65 66 28 49 6e 74 65 67 72   checkRef(Integr
30b10 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 69  ityCk *pCheck, i
30b20 6e 74 20 69 50 61 67 65 2c 20 63 68 61 72 20 2a  nt iPage, char *
30b30 7a 43 6f 6e 74 65 78 74 29 7b 0a 20 20 69 66 28  zContext){.  if(
30b40 20 69 50 61 67 65 3d 3d 30 20 29 20 72 65 74 75   iPage==0 ) retu
30b50 72 6e 20 31 3b 0a 20 20 69 66 28 20 69 50 61 67  rn 1;.  if( iPag
30b60 65 3e 70 43 68 65 63 6b 2d 3e 6e 50 61 67 65 20  e>pCheck->nPage 
30b70 7c 7c 20 69 50 61 67 65 3c 30 20 29 7b 0a 20 20  || iPage<0 ){.  
30b80 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
30b90 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78  (pCheck, zContex
30ba0 74 2c 20 22 69 6e 76 61 6c 69 64 20 70 61 67 65  t, "invalid page
30bb0 20 6e 75 6d 62 65 72 20 25 64 22 2c 20 69 50 61   number %d", iPa
30bc0 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ge);.    return 
30bd0 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 68  1;.  }.  if( pCh
30be0 65 63 6b 2d 3e 61 6e 52 65 66 5b 69 50 61 67 65  eck->anRef[iPage
30bf0 5d 3d 3d 31 20 29 7b 0a 20 20 20 20 63 68 65 63  ]==1 ){.    chec
30c00 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
30c10 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 32 6e  k, zContext, "2n
30c20 64 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  d reference to p
30c30 61 67 65 20 25 64 22 2c 20 69 50 61 67 65 29 3b  age %d", iPage);
30c40 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
30c50 20 7d 0a 20 20 72 65 74 75 72 6e 20 20 28 70 43   }.  return  (pC
30c60 68 65 63 6b 2d 3e 61 6e 52 65 66 5b 69 50 61 67  heck->anRef[iPag
30c70 65 5d 2b 2b 29 3e 31 3b 0a 7d 0a 0a 23 69 66 6e  e]++)>1;.}..#ifn
30c80 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
30c90 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
30ca0 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
30cb0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69  entry in the poi
30cc0 6e 74 65 72 2d 6d 61 70 20 66 6f 72 20 70 61 67  nter-map for pag
30cd0 65 20 69 43 68 69 6c 64 20 6d 61 70 73 20 74 6f  e iChild maps to
30ce0 20 0a 2a 2a 20 70 61 67 65 20 69 50 61 72 65 6e   .** page iParen
30cf0 74 2c 20 70 6f 69 6e 74 65 72 20 74 79 70 65 20  t, pointer type 
30d00 70 74 72 54 79 70 65 2e 20 49 66 20 6e 6f 74 2c  ptrType. If not,
30d10 20 61 70 70 65 6e 64 20 61 6e 20 65 72 72 6f 72   append an error
30d20 20 6d 65 73 73 61 67 65 0a 2a 2a 20 74 6f 20 70   message.** to p
30d30 43 68 65 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63  Check..*/.static
30d40 20 76 6f 69 64 20 63 68 65 63 6b 50 74 72 6d 61   void checkPtrma
30d50 70 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b  p(.  IntegrityCk
30d60 20 2a 70 43 68 65 63 6b 2c 20 20 20 2f 2a 20 49   *pCheck,   /* I
30d70 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 20 63  ntegrity check c
30d80 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 67 6e 6f  ontext */.  Pgno
30d90 20 69 43 68 69 6c 64 2c 20 20 20 20 20 20 20 20   iChild,        
30da0 20 20 20 2f 2a 20 43 68 69 6c 64 20 70 61 67 65     /* Child page
30db0 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 75 38 20   number */.  u8 
30dc0 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  eType,          
30dd0 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65 64 20      /* Expected 
30de0 70 6f 69 6e 74 65 72 20 6d 61 70 20 74 79 70 65  pointer map type
30df0 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 61 72 65   */.  Pgno iPare
30e00 6e 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nt,          /* 
30e10 45 78 70 65 63 74 65 64 20 70 6f 69 6e 74 65 72  Expected pointer
30e20 20 6d 61 70 20 70 61 72 65 6e 74 20 70 61 67 65   map parent page
30e30 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 68 61   number */.  cha
30e40 72 20 2a 7a 43 6f 6e 74 65 78 74 20 20 20 20 20  r *zContext     
30e50 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 64      /* Context d
30e60 65 73 63 72 69 70 74 69 6f 6e 20 28 75 73 65 64  escription (used
30e70 20 66 6f 72 20 65 72 72 6f 72 20 6d 73 67 29 20   for error msg) 
30e80 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
30e90 20 20 75 38 20 65 50 74 72 6d 61 70 54 79 70 65    u8 ePtrmapType
30ea0 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70  ;.  Pgno iPtrmap
30eb0 50 61 72 65 6e 74 3b 0a 0a 20 20 72 63 20 3d 20  Parent;..  rc = 
30ec0 70 74 72 6d 61 70 47 65 74 28 70 43 68 65 63 6b  ptrmapGet(pCheck
30ed0 2d 3e 70 42 74 2c 20 69 43 68 69 6c 64 2c 20 26  ->pBt, iChild, &
30ee0 65 50 74 72 6d 61 70 54 79 70 65 2c 20 26 69 50  ePtrmapType, &iP
30ef0 74 72 6d 61 70 50 61 72 65 6e 74 29 3b 0a 20 20  trmapParent);.  
30f00 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
30f10 4b 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70  K ){.    checkAp
30f20 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
30f30 7a 43 6f 6e 74 65 78 74 2c 20 22 46 61 69 6c 65  zContext, "Faile
30f40 64 20 74 6f 20 72 65 61 64 20 70 74 72 6d 61 70  d to read ptrmap
30f50 20 6b 65 79 3d 25 64 22 2c 20 69 43 68 69 6c 64   key=%d", iChild
30f60 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
30f70 20 7d 0a 0a 20 20 69 66 28 20 65 50 74 72 6d 61   }..  if( ePtrma
30f80 70 54 79 70 65 21 3d 65 54 79 70 65 20 7c 7c 20  pType!=eType || 
30f90 69 50 74 72 6d 61 70 50 61 72 65 6e 74 21 3d 69  iPtrmapParent!=i
30fa0 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 63 68  Parent ){.    ch
30fb0 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
30fc0 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 0a  eck, zContext, .
30fd0 20 20 20 20 20 20 22 42 61 64 20 70 74 72 20 6d        "Bad ptr m
30fe0 61 70 20 65 6e 74 72 79 20 6b 65 79 3d 25 64 20  ap entry key=%d 
30ff0 65 78 70 65 63 74 65 64 3d 28 25 64 2c 25 64 29  expected=(%d,%d)
31000 20 67 6f 74 3d 28 25 64 2c 25 64 29 22 2c 20 0a   got=(%d,%d)", .
31010 20 20 20 20 20 20 69 43 68 69 6c 64 2c 20 65 54        iChild, eT
31020 79 70 65 2c 20 69 50 61 72 65 6e 74 2c 20 65 50  ype, iParent, eP
31030 74 72 6d 61 70 54 79 70 65 2c 20 69 50 74 72 6d  trmapType, iPtrm
31040 61 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 7d  apParent);.  }.}
31050 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
31060 68 65 63 6b 20 74 68 65 20 69 6e 74 65 67 72 69  heck the integri
31070 74 79 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  ty of the freeli
31080 73 74 20 6f 72 20 6f 66 20 61 6e 20 6f 76 65 72  st or of an over
31090 66 6c 6f 77 20 70 61 67 65 20 6c 69 73 74 2e 0a  flow page list..
310a0 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  ** Verify that t
310b0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
310c0 65 73 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 69  es on the list i
310d0 73 20 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  s N..*/.static v
310e0 6f 69 64 20 63 68 65 63 6b 4c 69 73 74 28 0a 20  oid checkList(. 
310f0 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43   IntegrityCk *pC
31100 68 65 63 6b 2c 20 20 2f 2a 20 49 6e 74 65 67 72  heck,  /* Integr
31110 69 74 79 20 63 68 65 63 6b 69 6e 67 20 63 6f 6e  ity checking con
31120 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73  text */.  int is
31130 46 72 65 65 4c 69 73 74 2c 20 20 20 20 20 20 20  FreeList,       
31140 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 66 72  /* True for a fr
31150 65 65 6c 69 73 74 2e 20 20 46 61 6c 73 65 20 66  eelist.  False f
31160 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  or overflow page
31170 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69   list */.  int i
31180 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
31190 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
311a0 66 6f 72 20 66 69 72 73 74 20 70 61 67 65 20 69  for first page i
311b0 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20  n the list */.  
311c0 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20  int N,          
311d0 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65        /* Expecte
311e0 64 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  d number of page
311f0 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f  s in the list */
31200 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78  .  char *zContex
31210 74 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74  t        /* Cont
31220 65 78 74 20 66 6f 72 20 65 72 72 6f 72 20 6d 65  ext for error me
31230 73 73 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 69  ssages */.){.  i
31240 6e 74 20 69 3b 0a 20 20 69 6e 74 20 65 78 70 65  nt i;.  int expe
31250 63 74 65 64 20 3d 20 4e 3b 0a 20 20 69 6e 74 20  cted = N;.  int 
31260 69 46 69 72 73 74 20 3d 20 69 50 61 67 65 3b 0a  iFirst = iPage;.
31270 20 20 77 68 69 6c 65 28 20 4e 2d 2d 20 3e 20 30    while( N-- > 0
31280 20 26 26 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72   && pCheck->mxEr
31290 72 20 29 7b 0a 20 20 20 20 44 62 50 61 67 65 20  r ){.    DbPage 
312a0 2a 70 4f 76 66 6c 50 61 67 65 3b 0a 20 20 20 20  *pOvflPage;.    
312b0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
312c0 4f 76 66 6c 44 61 74 61 3b 0a 20 20 20 20 69 66  OvflData;.    if
312d0 28 20 69 50 61 67 65 3c 31 20 29 7b 0a 20 20 20  ( iPage<1 ){.   
312e0 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
312f0 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65  g(pCheck, zConte
31300 78 74 2c 0a 20 20 20 20 20 20 20 20 20 22 25 64  xt,.         "%d
31310 20 6f 66 20 25 64 20 70 61 67 65 73 20 6d 69 73   of %d pages mis
31320 73 69 6e 67 20 66 72 6f 6d 20 6f 76 65 72 66 6c  sing from overfl
31330 6f 77 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67  ow list starting
31340 20 61 74 20 25 64 22 2c 0a 20 20 20 20 20 20 20   at %d",.       
31350 20 20 20 4e 2b 31 2c 20 65 78 70 65 63 74 65 64     N+1, expected
31360 2c 20 69 46 69 72 73 74 29 3b 0a 20 20 20 20 20  , iFirst);.     
31370 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
31380 20 20 69 66 28 20 63 68 65 63 6b 52 65 66 28 70    if( checkRef(p
31390 43 68 65 63 6b 2c 20 69 50 61 67 65 2c 20 7a 43  Check, iPage, zC
313a0 6f 6e 74 65 78 74 29 20 29 20 62 72 65 61 6b 3b  ontext) ) break;
313b0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
313c0 50 61 67 65 72 47 65 74 28 70 43 68 65 63 6b 2d  PagerGet(pCheck-
313d0 3e 70 50 61 67 65 72 2c 20 28 50 67 6e 6f 29 69  >pPager, (Pgno)i
313e0 50 61 67 65 2c 20 26 70 4f 76 66 6c 50 61 67 65  Page, &pOvflPage
313f0 29 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b  ) ){.      check
31400 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
31410 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 66 61 69  , zContext, "fai
31420 6c 65 64 20 74 6f 20 67 65 74 20 70 61 67 65 20  led to get page 
31430 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20  %d", iPage);.   
31440 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
31450 20 20 20 20 70 4f 76 66 6c 44 61 74 61 20 3d 20      pOvflData = 
31460 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
31470 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
31480 44 61 74 61 28 70 4f 76 66 6c 50 61 67 65 29 3b  Data(pOvflPage);
31490 0a 20 20 20 20 69 66 28 20 69 73 46 72 65 65 4c  .    if( isFreeL
314a0 69 73 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ist ){.      int
314b0 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70   n = get4byte(&p
314c0 4f 76 66 6c 44 61 74 61 5b 34 5d 29 3b 0a 23 69  OvflData[4]);.#i
314d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
314e0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
314f0 20 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 70     if( pCheck->p
31500 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
31510 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 50  {.        checkP
31520 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 50  trmap(pCheck, iP
31530 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45  age, PTRMAP_FREE
31540 50 41 47 45 2c 20 30 2c 20 7a 43 6f 6e 74 65 78  PAGE, 0, zContex
31550 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  t);.      }.#end
31560 69 66 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 70  if.      if( n>p
31570 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 75 73 61 62  Check->pBt->usab
31580 6c 65 53 69 7a 65 2f 34 2d 38 20 29 7b 0a 20 20  leSize/4-8 ){.  
31590 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
315a0 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
315b0 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20  ntext,.         
315c0 20 20 22 66 72 65 65 6c 69 73 74 20 6c 65 61 66    "freelist leaf
315d0 20 63 6f 75 6e 74 20 74 6f 6f 20 62 69 67 20 6f   count too big o
315e0 6e 20 70 61 67 65 20 25 64 22 2c 20 69 50 61 67  n page %d", iPag
315f0 65 29 3b 0a 20 20 20 20 20 20 20 20 4e 2d 2d 3b  e);.        N--;
31600 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
31610 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
31620 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <n; i++){.      
31630 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61      Pgno iFreePa
31640 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ge = get4byte(&p
31650 4f 76 66 6c 44 61 74 61 5b 38 2b 69 2a 34 5d 29  OvflData[8+i*4])
31660 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
31670 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
31680 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
31690 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f  Check->pBt->auto
316a0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
316b0 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61        checkPtrma
316c0 70 28 70 43 68 65 63 6b 2c 20 69 46 72 65 65 50  p(pCheck, iFreeP
316d0 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45  age, PTRMAP_FREE
316e0 50 41 47 45 2c 20 30 2c 20 7a 43 6f 6e 74 65 78  PAGE, 0, zContex
316f0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  t);.          }.
31700 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
31710 20 63 68 65 63 6b 52 65 66 28 70 43 68 65 63 6b   checkRef(pCheck
31720 2c 20 69 46 72 65 65 50 61 67 65 2c 20 7a 43 6f  , iFreePage, zCo
31730 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20  ntext);.        
31740 7d 0a 20 20 20 20 20 20 20 20 4e 20 2d 3d 20 6e  }.        N -= n
31750 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
31760 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
31770 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
31780 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f     else{.      /
31790 2a 20 49 66 20 74 68 69 73 20 64 61 74 61 62 61  * If this databa
317a0 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f  se supports auto
317b0 2d 76 61 63 75 75 6d 20 61 6e 64 20 69 50 61 67  -vacuum and iPag
317c0 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73  e is not the las
317d0 74 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20  t.      ** page 
317e0 69 6e 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77  in this overflow
317f0 20 6c 69 73 74 2c 20 63 68 65 63 6b 20 74 68 61   list, check tha
31800 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  t the pointer-ma
31810 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 20 20  p entry for.    
31820 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69    ** the followi
31830 6e 67 20 70 61 67 65 20 6d 61 74 63 68 65 73 20  ng page matches 
31840 69 50 61 67 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  iPage..      */.
31850 20 20 20 20 20 20 69 66 28 20 70 43 68 65 63 6b        if( pCheck
31860 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
31870 6d 20 26 26 20 4e 3e 30 20 29 7b 0a 20 20 20 20  m && N>0 ){.    
31880 20 20 20 20 69 20 3d 20 67 65 74 34 62 79 74 65      i = get4byte
31890 28 70 4f 76 66 6c 44 61 74 61 29 3b 0a 20 20 20  (pOvflData);.   
318a0 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70       checkPtrmap
318b0 28 70 43 68 65 63 6b 2c 20 69 2c 20 50 54 52 4d  (pCheck, i, PTRM
318c0 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 50  AP_OVERFLOW2, iP
318d0 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a  age, zContext);.
318e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
318f0 6e 64 69 66 0a 20 20 20 20 69 50 61 67 65 20 3d  ndif.    iPage =
31900 20 67 65 74 34 62 79 74 65 28 70 4f 76 66 6c 44   get4byte(pOvflD
31910 61 74 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ata);.    sqlite
31920 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66  3PagerUnref(pOvf
31930 6c 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65  lPage);.  }.}.#e
31940 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
31950 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48  MIT_INTEGRITY_CH
31960 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ECK */..#ifndef 
31970 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45  SQLITE_OMIT_INTE
31980 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a  GRITY_CHECK./*.*
31990 2a 20 44 6f 20 76 61 72 69 6f 75 73 20 73 61 6e  * Do various san
319a0 69 74 79 20 63 68 65 63 6b 73 20 6f 6e 20 61 20  ity checks on a 
319b0 73 69 6e 67 6c 65 20 70 61 67 65 20 6f 66 20 61  single page of a
319c0 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 0a 2a   tree.  Return.*
319d0 2a 20 74 68 65 20 74 72 65 65 20 64 65 70 74 68  * the tree depth
319e0 2e 20 20 52 6f 6f 74 20 70 61 67 65 73 20 72 65  .  Root pages re
319f0 74 75 72 6e 20 30 2e 20 20 50 61 72 65 6e 74 73  turn 0.  Parents
31a00 20 6f 66 20 72 6f 6f 74 20 70 61 67 65 73 0a 2a   of root pages.*
31a10 2a 20 72 65 74 75 72 6e 20 31 2c 20 61 6e 64 20  * return 1, and 
31a20 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a 20 0a 2a 2a  so forth..** .**
31a30 20 54 68 65 73 65 20 63 68 65 63 6b 73 20 61 72   These checks ar
31a40 65 20 64 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  e done:.**.**   
31a50 20 20 20 31 2e 20 20 4d 61 6b 65 20 73 75 72 65     1.  Make sure
31a60 20 74 68 61 74 20 63 65 6c 6c 73 20 61 6e 64 20   that cells and 
31a70 66 72 65 65 62 6c 6f 63 6b 73 20 64 6f 20 6e 6f  freeblocks do no
31a80 74 20 6f 76 65 72 6c 61 70 0a 2a 2a 20 20 20 20  t overlap.**    
31a90 20 20 20 20 20 20 62 75 74 20 63 6f 6d 62 69 6e        but combin
31aa0 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20  e to completely 
31ab0 63 6f 76 65 72 20 74 68 65 20 70 61 67 65 2e 0a  cover the page..
31ac0 2a 2a 20 20 4e 4f 20 20 32 2e 20 20 4d 61 6b 65  **  NO  2.  Make
31ad0 20 73 75 72 65 20 63 65 6c 6c 20 6b 65 79 73 20   sure cell keys 
31ae0 61 72 65 20 69 6e 20 6f 72 64 65 72 2e 0a 2a 2a  are in order..**
31af0 20 20 4e 4f 20 20 33 2e 20 20 4d 61 6b 65 20 73    NO  3.  Make s
31b00 75 72 65 20 6e 6f 20 6b 65 79 20 69 73 20 6c 65  ure no key is le
31b10 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
31b20 20 74 6f 20 7a 4c 6f 77 65 72 42 6f 75 6e 64 2e   to zLowerBound.
31b30 0a 2a 2a 20 20 4e 4f 20 20 34 2e 20 20 4d 61 6b  .**  NO  4.  Mak
31b40 65 20 73 75 72 65 20 6e 6f 20 6b 65 79 20 69 73  e sure no key is
31b50 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
31b60 20 65 71 75 61 6c 20 74 6f 20 7a 55 70 70 65 72   equal to zUpper
31b70 42 6f 75 6e 64 2e 0a 2a 2a 20 20 20 20 20 20 35  Bound..**      5
31b80 2e 20 20 43 68 65 63 6b 20 74 68 65 20 69 6e 74  .  Check the int
31b90 65 67 72 69 74 79 20 6f 66 20 6f 76 65 72 66 6c  egrity of overfl
31ba0 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 20 20 20 20  ow pages..**    
31bb0 20 20 36 2e 20 20 52 65 63 75 72 73 69 76 65 6c    6.  Recursivel
31bc0 79 20 63 61 6c 6c 20 63 68 65 63 6b 54 72 65 65  y call checkTree
31bd0 50 61 67 65 20 6f 6e 20 61 6c 6c 20 63 68 69 6c  Page on all chil
31be0 64 72 65 6e 2e 0a 2a 2a 20 20 20 20 20 20 37 2e  dren..**      7.
31bf0 20 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68    Verify that th
31c00 65 20 64 65 70 74 68 20 6f 66 20 61 6c 6c 20 63  e depth of all c
31c10 68 69 6c 64 72 65 6e 20 69 73 20 74 68 65 20 73  hildren is the s
31c20 61 6d 65 2e 0a 2a 2a 20 20 20 20 20 20 38 2e 20  ame..**      8. 
31c30 20 4d 61 6b 65 20 73 75 72 65 20 74 68 69 73 20   Make sure this 
31c40 70 61 67 65 20 69 73 20 61 74 20 6c 65 61 73 74  page is at least
31c50 20 33 33 25 20 66 75 6c 6c 20 6f 72 20 65 6c 73   33% full or els
31c60 65 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 20  e it is.**      
31c70 20 20 20 20 74 68 65 20 72 6f 6f 74 20 6f 66 20      the root of 
31c80 74 68 65 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61  the tree..*/.sta
31c90 74 69 63 20 69 6e 74 20 63 68 65 63 6b 54 72 65  tic int checkTre
31ca0 65 50 61 67 65 28 0a 20 20 49 6e 74 65 67 72 69  ePage(.  Integri
31cb0 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20 2f  tyCk *pCheck,  /
31cc0 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72 20 74 68  * Context for th
31cd0 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 20 2a  e sanity check *
31ce0 2f 0a 20 20 69 6e 74 20 69 50 61 67 65 2c 20 20  /.  int iPage,  
31cf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
31d00 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
31d10 70 61 67 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f  page to check */
31d20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  .  MemPage *pPar
31d30 65 6e 74 2c 20 20 20 20 20 2f 2a 20 50 61 72 65  ent,     /* Pare
31d40 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 63 68 61  nt page */.  cha
31d50 72 20 2a 7a 50 61 72 65 6e 74 43 6f 6e 74 65 78  r *zParentContex
31d60 74 20 20 2f 2a 20 50 61 72 65 6e 74 20 63 6f 6e  t  /* Parent con
31d70 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d  text */.){.  Mem
31d80 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 69  Page *pPage;.  i
31d90 6e 74 20 69 2c 20 72 63 2c 20 64 65 70 74 68 2c  nt i, rc, depth,
31da0 20 64 32 2c 20 70 67 6e 6f 2c 20 63 6e 74 3b 0a   d2, pgno, cnt;.
31db0 20 20 69 6e 74 20 68 64 72 2c 20 63 65 6c 6c 53    int hdr, cellS
31dc0 74 61 72 74 3b 0a 20 20 69 6e 74 20 6e 43 65 6c  tart;.  int nCel
31dd0 6c 3b 0a 20 20 75 38 20 2a 64 61 74 61 3b 0a 20  l;.  u8 *data;. 
31de0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 0a   BtShared *pBt;.
31df0 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65    int usableSize
31e00 3b 0a 20 20 63 68 61 72 20 7a 43 6f 6e 74 65 78  ;.  char zContex
31e10 74 5b 31 30 30 5d 3b 0a 20 20 63 68 61 72 20 2a  t[100];.  char *
31e20 68 69 74 3b 0a 0a 20 20 73 70 72 69 6e 74 66 28  hit;..  sprintf(
31e30 7a 43 6f 6e 74 65 78 74 2c 20 22 50 61 67 65 20  zContext, "Page 
31e40 25 64 3a 20 22 2c 20 69 50 61 67 65 29 3b 0a 0a  %d: ", iPage);..
31e50 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
31e60 74 68 65 20 70 61 67 65 20 65 78 69 73 74 73 0a  the page exists.
31e70 20 20 2a 2f 0a 20 20 70 42 74 20 3d 20 70 43 68    */.  pBt = pCh
31e80 65 63 6b 2d 3e 70 42 74 3b 0a 20 20 75 73 61 62  eck->pBt;.  usab
31e90 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  leSize = pBt->us
31ea0 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69 66 28 20  ableSize;.  if( 
31eb0 69 50 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72  iPage==0 ) retur
31ec0 6e 20 30 3b 0a 20 20 69 66 28 20 63 68 65 63 6b  n 0;.  if( check
31ed0 52 65 66 28 70 43 68 65 63 6b 2c 20 69 50 61 67  Ref(pCheck, iPag
31ee0 65 2c 20 7a 50 61 72 65 6e 74 43 6f 6e 74 65 78  e, zParentContex
31ef0 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  t) ) return 0;. 
31f00 20 69 66 28 20 28 72 63 20 3d 20 67 65 74 50 61   if( (rc = getPa
31f10 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 50  ge(pBt, (Pgno)iP
31f20 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29  age, &pPage, 0))
31f30 21 3d 30 20 29 7b 0a 20 20 20 20 63 68 65 63 6b  !=0 ){.    check
31f40 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
31f50 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20  , zContext,.    
31f60 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 67 65     "unable to ge
31f70 74 20 74 68 65 20 70 61 67 65 2e 20 65 72 72 6f  t the page. erro
31f80 72 20 63 6f 64 65 3d 25 64 22 2c 20 72 63 29 3b  r code=%d", rc);
31f90 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
31fa0 20 7d 0a 20 20 69 66 28 20 28 72 63 20 3d 20 69   }.  if( (rc = i
31fb0 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c 20 70  nitPage(pPage, p
31fc0 50 61 72 65 6e 74 29 29 21 3d 30 20 29 7b 0a 20  Parent))!=0 ){. 
31fd0 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
31fe0 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65  g(pCheck, zConte
31ff0 78 74 2c 20 22 69 6e 69 74 50 61 67 65 28 29 20  xt, "initPage() 
32000 72 65 74 75 72 6e 73 20 65 72 72 6f 72 20 63 6f  returns error co
32010 64 65 20 25 64 22 2c 20 72 63 29 3b 0a 20 20 20  de %d", rc);.   
32020 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
32030 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ge);.    return 
32040 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  0;.  }..  /* Che
32050 63 6b 20 6f 75 74 20 61 6c 6c 20 74 68 65 20 63  ck out all the c
32060 65 6c 6c 73 2e 0a 20 20 2a 2f 0a 20 20 64 65 70  ells..  */.  dep
32070 74 68 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d  th = 0;.  for(i=
32080 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  0; i<pPage->nCel
32090 6c 20 26 26 20 70 43 68 65 63 6b 2d 3e 6d 78 45  l && pCheck->mxE
320a0 72 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  rr; i++){.    u8
320b0 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74   *pCell;.    int
320c0 20 73 7a 3b 0a 20 20 20 20 43 65 6c 6c 49 6e 66   sz;.    CellInf
320d0 6f 20 69 6e 66 6f 3b 0a 0a 20 20 20 20 2f 2a 20  o info;..    /* 
320e0 43 68 65 63 6b 20 70 61 79 6c 6f 61 64 20 6f 76  Check payload ov
320f0 65 72 66 6c 6f 77 20 70 61 67 65 73 0a 20 20 20  erflow pages.   
32100 20 2a 2f 0a 20 20 20 20 73 70 72 69 6e 74 66 28   */.    sprintf(
32110 7a 43 6f 6e 74 65 78 74 2c 20 22 4f 6e 20 74 72  zContext, "On tr
32120 65 65 20 70 61 67 65 20 25 64 20 63 65 6c 6c 20  ee page %d cell 
32130 25 64 3a 20 22 2c 20 69 50 61 67 65 2c 20 69 29  %d: ", iPage, i)
32140 3b 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69  ;.    pCell = fi
32150 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 69 29 3b  ndCell(pPage,i);
32160 0a 20 20 20 20 70 61 72 73 65 43 65 6c 6c 50 74  .    parseCellPt
32170 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
32180 26 69 6e 66 6f 29 3b 0a 20 20 20 20 73 7a 20 3d  &info);.    sz =
32190 20 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20   info.nData;.   
321a0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69 6e 74   if( !pPage->int
321b0 4b 65 79 20 29 20 73 7a 20 2b 3d 20 69 6e 66 6f  Key ) sz += info
321c0 2e 6e 4b 65 79 3b 0a 20 20 20 20 61 73 73 65 72  .nKey;.    asser
321d0 74 28 20 73 7a 3d 3d 69 6e 66 6f 2e 6e 50 61 79  t( sz==info.nPay
321e0 6c 6f 61 64 20 29 3b 0a 20 20 20 20 69 66 28 20  load );.    if( 
321f0 73 7a 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  sz>info.nLocal )
32200 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67  {.      int nPag
32210 65 20 3d 20 28 73 7a 20 2d 20 69 6e 66 6f 2e 6e  e = (sz - info.n
32220 4c 6f 63 61 6c 20 2b 20 75 73 61 62 6c 65 53 69  Local + usableSi
32230 7a 65 20 2d 20 35 29 2f 28 75 73 61 62 6c 65 53  ze - 5)/(usableS
32240 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 20 20  ize - 4);.      
32250 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20  Pgno pgnoOvfl = 
32260 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  get4byte(&pCell[
32270 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29  info.iOverflow])
32280 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
32290 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
322a0 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
322b0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
322c0 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61        checkPtrma
322d0 70 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f 4f 76  p(pCheck, pgnoOv
322e0 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
322f0 4c 4f 57 31 2c 20 69 50 61 67 65 2c 20 7a 43 6f  LOW1, iPage, zCo
32300 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a  ntext);.      }.
32310 23 65 6e 64 69 66 0a 20 20 20 20 20 20 63 68 65  #endif.      che
32320 63 6b 4c 69 73 74 28 70 43 68 65 63 6b 2c 20 30  ckList(pCheck, 0
32330 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 6e 50 61 67  , pgnoOvfl, nPag
32340 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20  e, zContext);.  
32350 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
32360 6b 20 73 61 6e 69 74 79 20 6f 66 20 6c 65 66 74  k sanity of left
32370 20 63 68 69 6c 64 20 70 61 67 65 2e 0a 20 20 20   child page..   
32380 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61   */.    if( !pPa
32390 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
323a0 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
323b0 65 28 70 43 65 6c 6c 29 3b 0a 23 69 66 6e 64 65  e(pCell);.#ifnde
323c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
323d0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69  TOVACUUM.      i
323e0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
323f0 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  um ){.        ch
32400 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b  eckPtrmap(pCheck
32410 2c 20 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  , pgno, PTRMAP_B
32420 54 52 45 45 2c 20 69 50 61 67 65 2c 20 7a 43 6f  TREE, iPage, zCo
32430 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a  ntext);.      }.
32440 23 65 6e 64 69 66 0a 20 20 20 20 20 20 64 32 20  #endif.      d2 
32450 3d 20 63 68 65 63 6b 54 72 65 65 50 61 67 65 28  = checkTreePage(
32460 70 43 68 65 63 6b 2c 70 67 6e 6f 2c 70 50 61 67  pCheck,pgno,pPag
32470 65 2c 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20  e,zContext);.   
32480 20 20 20 69 66 28 20 69 3e 30 20 26 26 20 64 32     if( i>0 && d2
32490 21 3d 64 65 70 74 68 20 29 7b 0a 20 20 20 20 20  !=depth ){.     
324a0 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
324b0 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65  g(pCheck, zConte
324c0 78 74 2c 20 22 43 68 69 6c 64 20 70 61 67 65 20  xt, "Child page 
324d0 64 65 70 74 68 20 64 69 66 66 65 72 73 22 29 3b  depth differs");
324e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
324f0 65 70 74 68 20 3d 20 64 32 3b 0a 20 20 20 20 7d  epth = d2;.    }
32500 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67  .  }.  if( !pPag
32510 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70  e->leaf ){.    p
32520 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
32530 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
32540 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
32550 29 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a  );.    sprintf(z
32560 43 6f 6e 74 65 78 74 2c 20 22 4f 6e 20 70 61 67  Context, "On pag
32570 65 20 25 64 20 61 74 20 72 69 67 68 74 20 63 68  e %d at right ch
32580 69 6c 64 3a 20 22 2c 20 69 50 61 67 65 29 3b 0a  ild: ", iPage);.
32590 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
325a0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
325b0 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
325c0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
325d0 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65  checkPtrmap(pChe
325e0 63 6b 2c 20 70 67 6e 6f 2c 20 50 54 52 4d 41 50  ck, pgno, PTRMAP
325f0 5f 42 54 52 45 45 2c 20 69 50 61 67 65 2c 20 30  _BTREE, iPage, 0
32600 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
32610 20 20 20 20 63 68 65 63 6b 54 72 65 65 50 61 67      checkTreePag
32620 65 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f 2c 20  e(pCheck, pgno, 
32630 70 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29  pPage, zContext)
32640 3b 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 43 68 65  ;.  }. .  /* Che
32650 63 6b 20 66 6f 72 20 63 6f 6d 70 6c 65 74 65 20  ck for complete 
32660 63 6f 76 65 72 61 67 65 20 6f 66 20 74 68 65 20  coverage of the 
32670 70 61 67 65 0a 20 20 2a 2f 0a 20 20 64 61 74 61  page.  */.  data
32680 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
32690 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
326a0 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 68 69 74  hdrOffset;.  hit
326b0 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
326c0 20 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20   usableSize );. 
326d0 20 69 66 28 20 68 69 74 20 29 7b 0a 20 20 20 20   if( hit ){.    
326e0 6d 65 6d 73 65 74 28 68 69 74 2c 20 31 2c 20 67  memset(hit, 1, g
326f0 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
32700 72 2b 35 5d 29 29 3b 0a 20 20 20 20 6e 43 65 6c  r+5]));.    nCel
32710 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  l = get2byte(&da
32720 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20  ta[hdr+3]);.    
32730 63 65 6c 6c 53 74 61 72 74 20 3d 20 68 64 72 20  cellStart = hdr 
32740 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e  + 12 - 4*pPage->
32750 6c 65 61 66 3b 0a 20 20 20 20 66 6f 72 28 69 3d  leaf;.    for(i=
32760 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
32770 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 63 20 3d  {.      int pc =
32780 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
32790 63 65 6c 6c 53 74 61 72 74 2b 69 2a 32 5d 29 3b  cellStart+i*2]);
327a0 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20  .      int size 
327b0 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
327c0 61 67 65 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b  age, &data[pc]);
327d0 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
327e0 20 20 20 20 69 66 28 20 28 70 63 2b 73 69 7a 65      if( (pc+size
327f0 2d 31 29 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20  -1)>=usableSize 
32800 7c 7c 20 70 63 3c 30 20 29 7b 0a 20 20 20 20 20  || pc<0 ){.     
32810 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
32820 67 28 70 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20  g(pCheck, 0, .  
32830 20 20 20 20 20 20 20 20 20 20 22 43 6f 72 72 75            "Corru
32840 70 74 69 6f 6e 20 64 65 74 65 63 74 65 64 20 69  ption detected i
32850 6e 20 63 65 6c 6c 20 25 64 20 6f 6e 20 70 61 67  n cell %d on pag
32860 65 20 25 64 22 2c 69 2c 69 50 61 67 65 2c 30 29  e %d",i,iPage,0)
32870 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
32880 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 63 2b         for(j=pc+
32890 73 69 7a 65 2d 31 3b 20 6a 3e 3d 70 63 3b 20 6a  size-1; j>=pc; j
328a0 2d 2d 29 20 68 69 74 5b 6a 5d 2b 2b 3b 0a 20 20  --) hit[j]++;.  
328b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
328c0 66 6f 72 28 63 6e 74 3d 30 2c 20 69 3d 67 65 74  for(cnt=0, i=get
328d0 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
328e0 31 5d 29 3b 20 69 3e 30 20 26 26 20 69 3c 75 73  1]); i>0 && i<us
328f0 61 62 6c 65 53 69 7a 65 20 26 26 20 63 6e 74 3c  ableSize && cnt<
32900 31 30 30 30 30 3b 20 0a 20 20 20 20 20 20 20 20  10000; .        
32910 20 20 20 63 6e 74 2b 2b 29 7b 0a 20 20 20 20 20     cnt++){.     
32920 20 69 6e 74 20 73 69 7a 65 20 3d 20 67 65 74 32   int size = get2
32930 62 79 74 65 28 26 64 61 74 61 5b 69 2b 32 5d 29  byte(&data[i+2])
32940 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
32950 20 20 20 20 20 69 66 28 20 28 69 2b 73 69 7a 65       if( (i+size
32960 2d 31 29 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20  -1)>=usableSize 
32970 7c 7c 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20  || i<0 ){.      
32980 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
32990 28 70 43 68 65 63 6b 2c 20 30 2c 20 20 0a 20 20  (pCheck, 0,  .  
329a0 20 20 20 20 20 20 20 20 20 20 22 43 6f 72 72 75            "Corru
329b0 70 74 69 6f 6e 20 64 65 74 65 63 74 65 64 20 69  ption detected i
329c0 6e 20 63 65 6c 6c 20 25 64 20 6f 6e 20 70 61 67  n cell %d on pag
329d0 65 20 25 64 22 2c 69 2c 69 50 61 67 65 2c 30 29  e %d",i,iPage,0)
329e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
329f0 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 2b 73         for(j=i+s
32a00 69 7a 65 2d 31 3b 20 6a 3e 3d 69 3b 20 6a 2d 2d  ize-1; j>=i; j--
32a10 29 20 68 69 74 5b 6a 5d 2b 2b 3b 0a 20 20 20 20  ) hit[j]++;.    
32a20 20 20 7d 0a 20 20 20 20 20 20 69 20 3d 20 67 65    }.      i = ge
32a30 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 5d 29  t2byte(&data[i])
32a40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
32a50 69 3d 63 6e 74 3d 30 3b 20 69 3c 75 73 61 62 6c  i=cnt=0; i<usabl
32a60 65 53 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  eSize; i++){.   
32a70 20 20 20 69 66 28 20 68 69 74 5b 69 5d 3d 3d 30     if( hit[i]==0
32a80 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6e 74 2b   ){.        cnt+
32a90 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  +;.      }else i
32aa0 66 28 20 68 69 74 5b 69 5d 3e 31 20 29 7b 0a 20  f( hit[i]>1 ){. 
32ab0 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65         checkAppe
32ac0 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c  ndMsg(pCheck, 0,
32ad0 0a 20 20 20 20 20 20 20 20 20 20 22 4d 75 6c 74  .          "Mult
32ae0 69 70 6c 65 20 75 73 65 73 20 66 6f 72 20 62 79  iple uses for by
32af0 74 65 20 25 64 20 6f 66 20 70 61 67 65 20 25 64  te %d of page %d
32b00 22 2c 20 69 2c 20 69 50 61 67 65 29 3b 0a 20 20  ", i, iPage);.  
32b10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
32b20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
32b30 66 28 20 63 6e 74 21 3d 64 61 74 61 5b 68 64 72  f( cnt!=data[hdr
32b40 2b 37 5d 20 29 7b 0a 20 20 20 20 20 20 63 68 65  +7] ){.      che
32b50 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
32b60 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20  ck, 0, .        
32b70 20 20 22 46 72 61 67 6d 65 6e 74 65 64 20 73 70    "Fragmented sp
32b80 61 63 65 20 69 73 20 25 64 20 62 79 74 65 20 72  ace is %d byte r
32b90 65 70 6f 72 74 65 64 20 61 73 20 25 64 20 6f 6e  eported as %d on
32ba0 20 70 61 67 65 20 25 64 22 2c 0a 20 20 20 20 20   page %d",.     
32bb0 20 20 20 20 20 63 6e 74 2c 20 64 61 74 61 5b 68       cnt, data[h
32bc0 64 72 2b 37 5d 2c 20 69 50 61 67 65 29 3b 0a 20  dr+7], iPage);. 
32bd0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
32be0 65 46 72 65 65 28 68 69 74 29 3b 0a 0a 20 20 72  eFree(hit);..  r
32bf0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
32c00 29 3b 0a 20 20 72 65 74 75 72 6e 20 64 65 70 74  );.  return dept
32c10 68 2b 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  h+1;.}.#endif /*
32c20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54   SQLITE_OMIT_INT
32c30 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a  EGRITY_CHECK */.
32c40 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
32c50 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43  OMIT_INTEGRITY_C
32c60 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  HECK./*.** This 
32c70 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 61 20 63  routine does a c
32c80 6f 6d 70 6c 65 74 65 20 63 68 65 63 6b 20 6f 66  omplete check of
32c90 20 74 68 65 20 67 69 76 65 6e 20 42 54 72 65 65   the given BTree
32ca0 20 66 69 6c 65 2e 20 20 61 52 6f 6f 74 5b 5d 20   file.  aRoot[] 
32cb0 69 73 0a 2a 2a 20 61 6e 20 61 72 72 61 79 20 6f  is.** an array o
32cc0 66 20 70 61 67 65 73 20 6e 75 6d 62 65 72 73 20  f pages numbers 
32cd0 77 65 72 65 20 65 61 63 68 20 70 61 67 65 20 6e  were each page n
32ce0 75 6d 62 65 72 20 69 73 20 74 68 65 20 72 6f 6f  umber is the roo
32cf0 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 61 20 74  t page of.** a t
32d00 61 62 6c 65 2e 20 20 6e 52 6f 6f 74 20 69 73 20  able.  nRoot is 
32d10 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
32d20 74 72 69 65 73 20 69 6e 20 61 52 6f 6f 74 2e 0a  tries in aRoot..
32d30 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68  **.** If everyth
32d40 69 6e 67 20 63 68 65 63 6b 73 20 6f 75 74 2c 20  ing checks out, 
32d50 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
32d60 75 72 6e 73 20 4e 55 4c 4c 2e 20 20 49 66 20 73  urns NULL.  If s
32d70 6f 6d 65 74 68 69 6e 67 20 69 73 0a 2a 2a 20 61  omething is.** a
32d80 6d 69 73 73 2c 20 61 6e 20 65 72 72 6f 72 20 6d  miss, an error m
32d90 65 73 73 61 67 65 20 69 73 20 77 72 69 74 74 65  essage is writte
32da0 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  n into memory ob
32db0 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
32dc0 6f 63 28 29 0a 2a 2a 20 61 6e 64 20 61 20 70 6f  oc().** and a po
32dd0 69 6e 74 65 72 20 74 6f 20 74 68 61 74 20 65 72  inter to that er
32de0 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 72  ror message is r
32df0 65 74 75 72 6e 65 64 2e 20 20 54 68 65 20 63 61  eturned.  The ca
32e00 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a  lling function.*
32e10 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  * is responsible
32e20 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68 65   for freeing the
32e30 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77   error message w
32e40 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a  hen it is done..
32e50 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33  */.char *sqlite3
32e60 42 74 72 65 65 49 6e 74 65 67 72 69 74 79 43 68  BtreeIntegrityCh
32e70 65 63 6b 28 0a 20 20 42 74 72 65 65 20 2a 70 2c  eck(.  Btree *p,
32e80 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
32e90 65 20 74 6f 20 62 65 20 63 68 65 63 6b 65 64 20  e to be checked 
32ea0 2a 2f 0a 20 20 69 6e 74 20 2a 61 52 6f 6f 74 2c  */.  int *aRoot,
32eb0 20 20 20 2f 2a 20 41 6e 20 61 72 72 61 79 20 6f     /* An array o
32ec0 66 20 72 6f 6f 74 20 70 61 67 65 73 20 6e 75 6d  f root pages num
32ed0 62 65 72 73 20 66 6f 72 20 69 6e 64 69 76 69 64  bers for individ
32ee0 75 61 6c 20 74 72 65 65 73 20 2a 2f 0a 20 20 69  ual trees */.  i
32ef0 6e 74 20 6e 52 6f 6f 74 2c 20 20 20 20 2f 2a 20  nt nRoot,    /* 
32f00 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
32f10 73 20 69 6e 20 61 52 6f 6f 74 5b 5d 20 2a 2f 0a  s in aRoot[] */.
32f20 20 20 69 6e 74 20 6d 78 45 72 72 2c 20 20 20 20    int mxErr,    
32f30 2f 2a 20 53 74 6f 70 20 72 65 70 6f 72 74 69 6e  /* Stop reportin
32f40 67 20 65 72 72 6f 72 73 20 61 66 74 65 72 20 74  g errors after t
32f50 68 69 73 20 6d 61 6e 79 20 2a 2f 0a 20 20 69 6e  his many */.  in
32f60 74 20 2a 70 6e 45 72 72 20 20 20 20 2f 2a 20 57  t *pnErr    /* W
32f70 72 69 74 65 20 6e 75 6d 62 65 72 20 6f 66 20 65  rite number of e
32f80 72 72 6f 72 73 20 73 65 65 6e 20 74 6f 20 74 68  rrors seen to th
32f90 69 73 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 29  is variable */.)
32fa0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
32fb0 20 6e 52 65 66 3b 0a 20 20 49 6e 74 65 67 72 69   nRef;.  Integri
32fc0 74 79 43 6b 20 73 43 68 65 63 6b 3b 0a 20 20 42  tyCk sCheck;.  B
32fd0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
32fe0 2d 3e 70 42 74 3b 0a 0a 20 20 6e 52 65 66 20 3d  ->pBt;..  nRef =
32ff0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
33000 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
33010 72 29 3b 0a 20 20 69 66 28 20 6c 6f 63 6b 42 74  r);.  if( lockBt
33020 72 65 65 57 69 74 68 52 65 74 72 79 28 70 29 21  reeWithRetry(p)!
33030 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
33040 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 53    return sqliteS
33050 74 72 44 75 70 28 22 55 6e 61 62 6c 65 20 74 6f  trDup("Unable to
33060 20 61 63 71 75 69 72 65 20 61 20 72 65 61 64 20   acquire a read 
33070 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
33080 62 61 73 65 22 29 3b 0a 20 20 7d 0a 20 20 73 43  base");.  }.  sC
33090 68 65 63 6b 2e 70 42 74 20 3d 20 70 42 74 3b 0a  heck.pBt = pBt;.
330a0 20 20 73 43 68 65 63 6b 2e 70 50 61 67 65 72 20    sCheck.pPager 
330b0 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20  = pBt->pPager;. 
330c0 20 73 43 68 65 63 6b 2e 6e 50 61 67 65 20 3d 20   sCheck.nPage = 
330d0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
330e0 63 6f 75 6e 74 28 73 43 68 65 63 6b 2e 70 50 61  count(sCheck.pPa
330f0 67 65 72 29 3b 0a 20 20 73 43 68 65 63 6b 2e 6d  ger);.  sCheck.m
33100 78 45 72 72 20 3d 20 6d 78 45 72 72 3b 0a 20 20  xErr = mxErr;.  
33110 73 43 68 65 63 6b 2e 6e 45 72 72 20 3d 20 30 3b  sCheck.nErr = 0;
33120 0a 20 20 2a 70 6e 45 72 72 20 3d 20 30 3b 0a 20  .  *pnErr = 0;. 
33130 20 69 66 28 20 73 43 68 65 63 6b 2e 6e 50 61 67   if( sCheck.nPag
33140 65 3d 3d 30 20 29 7b 0a 20 20 20 20 75 6e 6c 6f  e==0 ){.    unlo
33150 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
33160 70 42 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  pBt);.    return
33170 20 30 3b 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b   0;.  }.  sCheck
33180 2e 61 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 4d  .anRef = sqliteM
33190 61 6c 6c 6f 63 52 61 77 28 20 28 73 43 68 65 63  allocRaw( (sChec
331a0 6b 2e 6e 50 61 67 65 2b 31 29 2a 73 69 7a 65 6f  k.nPage+1)*sizeo
331b0 66 28 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 30  f(sCheck.anRef[0
331c0 5d 29 20 29 3b 0a 20 20 69 66 28 20 21 73 43 68  ]) );.  if( !sCh
331d0 65 63 6b 2e 61 6e 52 65 66 20 29 7b 0a 20 20 20  eck.anRef ){.   
331e0 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
331f0 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 2a  used(pBt);.    *
33200 70 6e 45 72 72 20 3d 20 31 3b 0a 20 20 20 20 72  pnErr = 1;.    r
33210 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4d 50 72  eturn sqlite3MPr
33220 69 6e 74 66 28 22 55 6e 61 62 6c 65 20 74 6f 20  intf("Unable to 
33230 6d 61 6c 6c 6f 63 20 25 64 20 62 79 74 65 73 22  malloc %d bytes"
33240 2c 20 0a 20 20 20 20 20 20 20 20 28 73 43 68 65  , .        (sChe
33250 63 6b 2e 6e 50 61 67 65 2b 31 29 2a 73 69 7a 65  ck.nPage+1)*size
33260 6f 66 28 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b  of(sCheck.anRef[
33270 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  0]));.  }.  for(
33280 69 3d 30 3b 20 69 3c 3d 73 43 68 65 63 6b 2e 6e  i=0; i<=sCheck.n
33290 50 61 67 65 3b 20 69 2b 2b 29 7b 20 73 43 68 65  Page; i++){ sChe
332a0 63 6b 2e 61 6e 52 65 66 5b 69 5d 20 3d 20 30 3b  ck.anRef[i] = 0;
332b0 20 7d 0a 20 20 69 20 3d 20 50 45 4e 44 49 4e 47   }.  i = PENDING
332c0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 3b  _BYTE_PAGE(pBt);
332d0 0a 20 20 69 66 28 20 69 3c 3d 73 43 68 65 63 6b  .  if( i<=sCheck
332e0 2e 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 73 43  .nPage ){.    sC
332f0 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 20 3d 20  heck.anRef[i] = 
33300 31 3b 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b 2e  1;.  }.  sCheck.
33310 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20  zErrMsg = 0;..  
33320 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 69 6e 74  /* Check the int
33330 65 67 72 69 74 79 20 6f 66 20 74 68 65 20 66 72  egrity of the fr
33340 65 65 6c 69 73 74 0a 20 20 2a 2f 0a 20 20 63 68  eelist.  */.  ch
33350 65 63 6b 4c 69 73 74 28 26 73 43 68 65 63 6b 2c  eckList(&sCheck,
33360 20 31 2c 20 67 65 74 34 62 79 74 65 28 26 70 42   1, get4byte(&pB
33370 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
33380 5b 33 32 5d 29 2c 0a 20 20 20 20 20 20 20 20 20  [32]),.         
33390 20 20 20 67 65 74 34 62 79 74 65 28 26 70 42 74     get4byte(&pBt
333a0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
333b0 33 36 5d 29 2c 20 22 4d 61 69 6e 20 66 72 65 65  36]), "Main free
333c0 6c 69 73 74 3a 20 22 29 3b 0a 0a 20 20 2f 2a 20  list: ");..  /* 
333d0 43 68 65 63 6b 20 61 6c 6c 20 74 68 65 20 74 61  Check all the ta
333e0 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  bles..  */.  for
333f0 28 69 3d 30 3b 20 69 3c 6e 52 6f 6f 74 20 26 26  (i=0; i<nRoot &&
33400 20 73 43 68 65 63 6b 2e 6d 78 45 72 72 3b 20 69   sCheck.mxErr; i
33410 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 52 6f  ++){.    if( aRo
33420 6f 74 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69  ot[i]==0 ) conti
33430 6e 75 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  nue;.#ifndef SQL
33440 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
33450 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
33460 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 61  >autoVacuum && a
33470 52 6f 6f 74 5b 69 5d 3e 31 20 29 7b 0a 20 20 20  Root[i]>1 ){.   
33480 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 26     checkPtrmap(&
33490 73 43 68 65 63 6b 2c 20 61 52 6f 6f 74 5b 69 5d  sCheck, aRoot[i]
334a0 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  , PTRMAP_ROOTPAG
334b0 45 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  E, 0, 0);.    }.
334c0 23 65 6e 64 69 66 0a 20 20 20 20 63 68 65 63 6b  #endif.    check
334d0 54 72 65 65 50 61 67 65 28 26 73 43 68 65 63 6b  TreePage(&sCheck
334e0 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 30 2c 20 22  , aRoot[i], 0, "
334f0 4c 69 73 74 20 6f 66 20 74 72 65 65 20 72 6f 6f  List of tree roo
33500 74 73 3a 20 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ts: ");.  }..  /
33510 2a 20 4d 61 6b 65 20 73 75 72 65 20 65 76 65 72  * Make sure ever
33520 79 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 69  y page in the fi
33530 6c 65 20 69 73 20 72 65 66 65 72 65 6e 63 65 64  le is referenced
33540 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b  .  */.  for(i=1;
33550 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65   i<=sCheck.nPage
33560 20 26 26 20 73 43 68 65 63 6b 2e 6d 78 45 72 72   && sCheck.mxErr
33570 3b 20 69 2b 2b 29 7b 0a 23 69 66 64 65 66 20 53  ; i++){.#ifdef S
33580 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
33590 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 73 43  ACUUM.    if( sC
335a0 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 3d 3d 30  heck.anRef[i]==0
335b0 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41   ){.      checkA
335c0 70 70 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b  ppendMsg(&sCheck
335d0 2c 20 30 2c 20 22 50 61 67 65 20 25 64 20 69 73  , 0, "Page %d is
335e0 20 6e 65 76 65 72 20 75 73 65 64 22 2c 20 69 29   never used", i)
335f0 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  ;.    }.#else.  
33600 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
33610 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
33620 74 6f 2d 76 61 63 75 75 6d 2c 20 6d 61 6b 65 20  to-vacuum, make 
33630 73 75 72 65 20 6e 6f 20 74 61 62 6c 65 73 20 63  sure no tables c
33640 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a 20 72 65  ontain.    ** re
33650 66 65 72 65 6e 63 65 73 20 74 6f 20 70 6f 69 6e  ferences to poin
33660 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 0a 20  ter-map pages.. 
33670 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 43     */.    if( sC
33680 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 3d 3d 30  heck.anRef[i]==0
33690 20 26 26 20 0a 20 20 20 20 20 20 20 28 50 54 52   && .       (PTR
336a0 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
336b0 69 29 21 3d 69 20 7c 7c 20 21 70 42 74 2d 3e 61  i)!=i || !pBt->a
336c0 75 74 6f 56 61 63 75 75 6d 29 20 29 7b 0a 20 20  utoVacuum) ){.  
336d0 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
336e0 73 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 22  sg(&sCheck, 0, "
336f0 50 61 67 65 20 25 64 20 69 73 20 6e 65 76 65 72  Page %d is never
33700 20 75 73 65 64 22 2c 20 69 29 3b 0a 20 20 20 20   used", i);.    
33710 7d 0a 20 20 20 20 69 66 28 20 73 43 68 65 63 6b  }.    if( sCheck
33720 2e 61 6e 52 65 66 5b 69 5d 21 3d 30 20 26 26 20  .anRef[i]!=0 && 
33730 0a 20 20 20 20 20 20 20 28 50 54 52 4d 41 50 5f  .       (PTRMAP_
33740 50 41 47 45 4e 4f 28 70 42 74 2c 20 69 29 3d 3d  PAGENO(pBt, i)==
33750 69 20 26 26 20 70 42 74 2d 3e 61 75 74 6f 56 61  i && pBt->autoVa
33760 63 75 75 6d 29 20 29 7b 0a 20 20 20 20 20 20 63  cuum) ){.      c
33770 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73  heckAppendMsg(&s
33780 43 68 65 63 6b 2c 20 30 2c 20 22 50 6f 69 6e 74  Check, 0, "Point
33790 65 72 20 6d 61 70 20 70 61 67 65 20 25 64 20 69  er map page %d i
337a0 73 20 72 65 66 65 72 65 6e 63 65 64 22 2c 20 69  s referenced", i
337b0 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
337c0 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
337d0 75 72 65 20 74 68 69 73 20 61 6e 61 6c 79 73 69  ure this analysi
337e0 73 20 64 69 64 20 6e 6f 74 20 6c 65 61 76 65 20  s did not leave 
337f0 61 6e 79 20 75 6e 72 65 66 28 29 20 70 61 67 65  any unref() page
33800 73 0a 20 20 2a 2f 0a 20 20 75 6e 6c 6f 63 6b 42  s.  */.  unlockB
33810 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
33820 29 3b 0a 20 20 69 66 28 20 6e 52 65 66 20 21 3d  );.  if( nRef !=
33830 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
33840 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
33850 72 29 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41  r) ){.    checkA
33860 70 70 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b  ppendMsg(&sCheck
33870 2c 20 30 2c 20 0a 20 20 20 20 20 20 22 4f 75 74  , 0, .      "Out
33880 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 63 6f  standing page co
33890 75 6e 74 20 67 6f 65 73 20 66 72 6f 6d 20 25 64  unt goes from %d
338a0 20 74 6f 20 25 64 20 64 75 72 69 6e 67 20 74 68   to %d during th
338b0 69 73 20 61 6e 61 6c 79 73 69 73 22 2c 0a 20 20  is analysis",.  
338c0 20 20 20 20 6e 52 65 66 2c 20 73 71 6c 69 74 65      nRef, sqlite
338d0 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
338e0 42 74 2d 3e 70 50 61 67 65 72 29 0a 20 20 20 20  Bt->pPager).    
338f0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65  );.  }..  /* Cle
33900 61 6e 20 20 75 70 20 61 6e 64 20 72 65 70 6f 72  an  up and repor
33910 74 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20  t errors..  */. 
33920 20 73 71 6c 69 74 65 46 72 65 65 28 73 43 68 65   sqliteFree(sChe
33930 63 6b 2e 61 6e 52 65 66 29 3b 0a 20 20 2a 70 6e  ck.anRef);.  *pn
33940 45 72 72 20 3d 20 73 43 68 65 63 6b 2e 6e 45 72  Err = sCheck.nEr
33950 72 3b 0a 20 20 72 65 74 75 72 6e 20 73 43 68 65  r;.  return sChe
33960 63 6b 2e 7a 45 72 72 4d 73 67 3b 0a 7d 0a 23 65  ck.zErrMsg;.}.#e
33970 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
33980 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48  MIT_INTEGRITY_CH
33990 45 43 4b 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  ECK */../*.** Re
339a0 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61  turn the full pa
339b0 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 75 6e  thname of the un
339c0 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73  derlying databas
339d0 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74  e file..*/.const
339e0 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74   char *sqlite3Bt
339f0 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 42  reeGetFilename(B
33a00 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65  tree *p){.  asse
33a10 72 74 28 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67  rt( p->pBt->pPag
33a20 65 72 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  er!=0 );.  retur
33a30 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  n sqlite3PagerFi
33a40 6c 65 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70  lename(p->pBt->p
33a50 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Pager);.}../*.**
33a60 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 74 68   Return the path
33a70 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 69 72 65  name of the dire
33a80 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61  ctory that conta
33a90 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ins the database
33aa0 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
33ab0 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72  char *sqlite3Btr
33ac0 65 65 47 65 74 44 69 72 6e 61 6d 65 28 42 74 72  eeGetDirname(Btr
33ad0 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  ee *p){.  assert
33ae0 28 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  ( p->pBt->pPager
33af0 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
33b00 73 71 6c 69 74 65 33 50 61 67 65 72 44 69 72 6e  sqlite3PagerDirn
33b10 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67  ame(p->pBt->pPag
33b20 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  er);.}../*.** Re
33b30 74 75 72 6e 20 74 68 65 20 70 61 74 68 6e 61 6d  turn the pathnam
33b40 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
33b50 20 66 69 6c 65 20 66 6f 72 20 74 68 69 73 20 64   file for this d
33b60 61 74 61 62 61 73 65 2e 20 54 68 65 20 72 65 74  atabase. The ret
33b70 75 72 6e 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  urn.** value of 
33b80 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
33b90 74 68 65 20 73 61 6d 65 20 72 65 67 61 72 64 6c  the same regardl
33ba0 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 74  ess of whether t
33bb0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
33bc0 2a 2a 20 68 61 73 20 62 65 65 6e 20 63 72 65 61  ** has been crea
33bd0 74 65 64 20 6f 72 20 6e 6f 74 2e 0a 2a 2f 0a 63  ted or not..*/.c
33be0 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
33bf0 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61  e3BtreeGetJourna
33c00 6c 6e 61 6d 65 28 42 74 72 65 65 20 2a 70 29 7b  lname(Btree *p){
33c10 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 42  .  assert( p->pB
33c20 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t->pPager!=0 );.
33c30 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
33c40 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65  PagerJournalname
33c50 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29  (p->pBt->pPager)
33c60 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
33c70 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0a  ITE_OMIT_VACUUM.
33c80 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 63  /*.** Copy the c
33c90 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20  omplete content 
33ca0 6f 66 20 70 42 74 46 72 6f 6d 20 69 6e 74 6f 20  of pBtFrom into 
33cb0 70 42 74 54 6f 2e 20 20 41 20 74 72 61 6e 73 61  pBtTo.  A transa
33cc0 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 62 65  ction.** must be
33cd0 20 61 63 74 69 76 65 20 66 6f 72 20 62 6f 74 68   active for both
33ce0 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   files..**.** Th
33cf0 65 20 73 69 7a 65 20 6f 66 20 66 69 6c 65 20 70  e size of file p
33d00 42 74 46 72 6f 6d 20 6d 61 79 20 62 65 20 72 65  BtFrom may be re
33d10 64 75 63 65 64 20 62 79 20 74 68 69 73 20 6f 70  duced by this op
33d20 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20 49 66 20 61  eration..** If a
33d30 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  nything goes wro
33d40 6e 67 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74  ng, the transact
33d50 69 6f 6e 20 6f 6e 20 70 42 74 46 72 6f 6d 20 69  ion on pBtFrom i
33d60 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  s rolled back..*
33d70 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
33d80 65 65 43 6f 70 79 46 69 6c 65 28 42 74 72 65 65  eeCopyFile(Btree
33d90 20 2a 70 54 6f 2c 20 42 74 72 65 65 20 2a 70 46   *pTo, Btree *pF
33da0 72 6f 6d 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  rom){.  int rc =
33db0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67   SQLITE_OK;.  Pg
33dc0 6e 6f 20 69 2c 20 6e 50 61 67 65 2c 20 6e 54 6f  no i, nPage, nTo
33dd0 50 61 67 65 2c 20 69 53 6b 69 70 3b 0a 0a 20 20  Page, iSkip;..  
33de0 42 74 53 68 61 72 65 64 20 2a 70 42 74 54 6f 20  BtShared *pBtTo 
33df0 3d 20 70 54 6f 2d 3e 70 42 74 3b 0a 20 20 42 74  = pTo->pBt;.  Bt
33e00 53 68 61 72 65 64 20 2a 70 42 74 46 72 6f 6d 20  Shared *pBtFrom 
33e10 3d 20 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 0a 20  = pFrom->pBt;.. 
33e20 20 69 66 28 20 70 54 6f 2d 3e 69 6e 54 72 61 6e   if( pTo->inTran
33e30 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c  s!=TRANS_WRITE |
33e40 7c 20 70 46 72 6f 6d 2d 3e 69 6e 54 72 61 6e 73  | pFrom->inTrans
33e50 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  !=TRANS_WRITE ){
33e60 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
33e70 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
33e80 69 66 28 20 70 42 74 54 6f 2d 3e 70 43 75 72 73  if( pBtTo->pCurs
33e90 6f 72 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  or ) return SQLI
33ea0 54 45 5f 42 55 53 59 3b 0a 20 20 6e 54 6f 50 61  TE_BUSY;.  nToPa
33eb0 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ge = sqlite3Page
33ec0 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 54 6f  rPagecount(pBtTo
33ed0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 6e 50 61  ->pPager);.  nPa
33ee0 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ge = sqlite3Page
33ef0 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 46 72  rPagecount(pBtFr
33f00 6f 6d 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69  om->pPager);.  i
33f10 53 6b 69 70 20 3d 20 50 45 4e 44 49 4e 47 5f 42  Skip = PENDING_B
33f20 59 54 45 5f 50 41 47 45 28 70 42 74 54 6f 29 3b  YTE_PAGE(pBtTo);
33f30 0a 20 20 66 6f 72 28 69 3d 31 3b 20 72 63 3d 3d  .  for(i=1; rc==
33f40 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 3d  SQLITE_OK && i<=
33f50 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  nPage; i++){.   
33f60 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
33f70 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 69 53 6b  ;.    if( i==iSk
33f80 69 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ip ) continue;. 
33f90 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
33fa0 61 67 65 72 47 65 74 28 70 42 74 46 72 6f 6d 2d  agerGet(pBtFrom-
33fb0 3e 70 50 61 67 65 72 2c 20 69 2c 20 26 70 44 62  >pPager, i, &pDb
33fc0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
33fd0 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 72  c ) break;.    r
33fe0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
33ff0 4f 76 65 72 77 72 69 74 65 28 70 42 74 54 6f 2d  Overwrite(pBtTo-
34000 3e 70 50 61 67 65 72 2c 20 69 2c 20 73 71 6c 69  >pPager, i, sqli
34010 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
34020 70 44 62 50 61 67 65 29 29 3b 0a 20 20 20 20 73  pDbPage));.    s
34030 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
34040 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 0a  (pDbPage);.  }..
34050 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
34060 20 69 73 20 73 68 72 69 6e 6b 69 6e 67 2c 20 6a   is shrinking, j
34070 6f 75 72 6e 61 6c 20 74 68 65 20 70 61 67 65 73  ournal the pages
34080 20 74 68 61 74 20 61 72 65 20 62 65 69 6e 67 20   that are being 
34090 74 72 75 6e 63 61 74 65 64 0a 20 20 2a 2a 20 73  truncated.  ** s
340a0 6f 20 74 68 61 74 20 74 68 65 79 20 63 61 6e 20  o that they can 
340b0 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69  be rolled back i
340c0 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 66 61 69  f the commit fai
340d0 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ls..  */.  for(i
340e0 3d 6e 50 61 67 65 2b 31 3b 20 72 63 3d 3d 53 51  =nPage+1; rc==SQ
340f0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 3d 6e 54  LITE_OK && i<=nT
34100 6f 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  oPage; i++){.   
34110 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
34120 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 69 53 6b  ;.    if( i==iSk
34130 69 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ip ) continue;. 
34140 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
34150 61 67 65 72 47 65 74 28 70 42 74 54 6f 2d 3e 70  agerGet(pBtTo->p
34160 50 61 67 65 72 2c 20 69 2c 20 26 70 44 62 50 61  Pager, i, &pDbPa
34170 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
34180 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 72 63 20  ) break;.    rc 
34190 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
341a0 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
341b0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f    sqlite3PagerDo
341c0 6e 74 57 72 69 74 65 28 70 44 62 50 61 67 65 29  ntWrite(pDbPage)
341d0 3b 0a 20 20 20 20 2f 2a 20 59 65 61 68 2e 20 20  ;.    /* Yeah.  
341e0 49 74 20 73 65 65 6d 73 20 77 69 65 72 64 20 74  It seems wierd t
341f0 6f 20 63 61 6c 6c 20 44 6f 6e 74 57 72 69 74 65  o call DontWrite
34200 28 29 20 72 69 67 68 74 20 61 66 74 65 72 20 57  () right after W
34210 72 69 74 65 28 29 2e 20 20 42 75 74 0a 20 20 20  rite().  But.   
34220 20 2a 2a 20 74 68 61 74 20 69 73 20 62 65 63 61   ** that is beca
34230 75 73 65 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  use the names of
34240 20 74 68 6f 73 65 20 70 72 6f 63 65 64 75 72 65   those procedure
34250 73 20 64 6f 20 6e 6f 74 20 65 78 61 63 74 6c 79  s do not exactly
34260 20 0a 20 20 20 20 2a 2a 20 72 65 70 72 65 73 65   .    ** represe
34270 6e 74 20 77 68 61 74 20 74 68 65 79 20 64 6f 2e  nt what they do.
34280 20 20 57 72 69 74 65 28 29 20 72 65 61 6c 6c 79    Write() really
34290 20 6d 65 61 6e 73 20 22 70 75 74 20 74 68 69 73   means "put this
342a0 20 70 61 67 65 20 69 6e 20 74 68 65 0a 20 20 20   page in the.   
342b0 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75   ** rollback jou
342c0 72 6e 61 6c 20 61 6e 64 20 6d 61 72 6b 20 69 74  rnal and mark it
342d0 20 61 73 20 64 69 72 74 79 20 73 6f 20 74 68 61   as dirty so tha
342e0 74 20 69 74 20 77 69 6c 6c 20 62 65 20 77 72 69  t it will be wri
342f0 74 74 65 6e 0a 20 20 20 20 2a 2a 20 74 6f 20 74  tten.    ** to t
34300 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
34310 20 6c 61 74 65 72 2e 22 20 20 44 6f 6e 74 57 72   later."  DontWr
34320 69 74 65 28 29 20 75 6e 64 6f 65 73 20 74 68 65  ite() undoes the
34330 20 73 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 0a   second part of.
34340 20 20 20 20 2a 2a 20 74 68 61 74 20 61 6e 64 20      ** that and 
34350 70 72 65 76 65 6e 74 73 20 74 68 65 20 70 61 67  prevents the pag
34360 65 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72 69  e from being wri
34370 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tten to the data
34380 62 61 73 65 2e 20 20 54 68 65 0a 20 20 20 20 2a  base.  The.    *
34390 2a 20 70 61 67 65 20 69 73 20 73 74 69 6c 6c 20  * page is still 
343a0 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  on the rollback 
343b0 6a 6f 75 72 6e 61 6c 2c 20 74 68 6f 75 67 68 2e  journal, though.
343c0 20 20 41 6e 64 20 74 68 61 74 20 69 73 20 74 68    And that is th
343d0 65 20 77 68 6f 6c 65 0a 20 20 20 20 2a 2a 20 70  e whole.    ** p
343e0 6f 69 6e 74 20 6f 66 20 74 68 69 73 20 6c 6f 6f  oint of this loo
343f0 70 3a 20 74 6f 20 70 75 74 20 70 61 67 65 73 20  p: to put pages 
34400 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  on the rollback 
34410 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20  journal. */.    
34420 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
34430 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a  f(pDbPage);.  }.
34440 20 20 69 66 28 20 21 72 63 20 26 26 20 6e 50 61    if( !rc && nPa
34450 67 65 3c 6e 54 6f 50 61 67 65 20 29 7b 0a 20 20  ge<nToPage ){.  
34460 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
34470 67 65 72 54 72 75 6e 63 61 74 65 28 70 42 74 54  gerTruncate(pBtT
34480 6f 2d 3e 70 50 61 67 65 72 2c 20 6e 50 61 67 65  o->pPager, nPage
34490 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
344a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
344b0 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 54 6f  treeRollback(pTo
344c0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
344d0 72 63 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f  rc;  .}.#endif /
344e0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41  * SQLITE_OMIT_VA
344f0 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  CUUM */../*.** R
34500 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
34510 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
34520 69 73 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e  is active..*/.in
34530 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  t sqlite3BtreeIs
34540 49 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70  InTrans(Btree *p
34550 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 20 26  ){.  return (p &
34560 26 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  & (p->inTrans==T
34570 52 41 4e 53 5f 57 52 49 54 45 29 29 3b 0a 7d 0a  RANS_WRITE));.}.
34580 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f  ./*.** Return no
34590 6e 2d 7a 65 72 6f 20 69 66 20 61 20 73 74 61 74  n-zero if a stat
345a0 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
345b0 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2f 0a  n is active..*/.
345c0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
345d0 49 73 49 6e 53 74 6d 74 28 42 74 72 65 65 20 2a  IsInStmt(Btree *
345e0 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d  p){.  return (p-
345f0 3e 70 42 74 20 26 26 20 70 2d 3e 70 42 74 2d 3e  >pBt && p->pBt->
34600 69 6e 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  inStmt);.}../*.*
34610 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  * Return non-zer
34620 6f 20 69 66 20 61 20 72 65 61 64 20 28 6f 72 20  o if a read (or 
34630 77 72 69 74 65 29 20 74 72 61 6e 73 61 63 74 69  write) transacti
34640 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2f  on is active..*/
34650 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
34660 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28 42  eIsInReadTrans(B
34670 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75  tree *p){.  retu
34680 72 6e 20 28 70 20 26 26 20 28 70 2d 3e 69 6e 54  rn (p && (p->inT
34690 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans!=TRANS_NONE
346a0 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ));.}../*.** Thi
346b0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
346c0 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
346d0 61 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79  a blob of memory
346e0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
346f0 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 73 68 61  .** a single sha
34700 72 65 64 2d 62 74 72 65 65 2e 20 54 68 65 20 6d  red-btree. The m
34710 65 6d 6f 72 79 20 69 73 20 75 73 65 64 20 62 79  emory is used by
34720 20 63 6c 69 65 6e 74 20 63 6f 64 65 20 66 6f 72   client code for
34730 20 69 74 27 73 20 6f 77 6e 0a 2a 2a 20 70 75 72   it's own.** pur
34740 70 6f 73 65 73 20 28 66 6f 72 20 65 78 61 6d 70  poses (for examp
34750 6c 65 2c 20 74 6f 20 73 74 6f 72 65 20 61 20 68  le, to store a h
34760 69 67 68 2d 6c 65 76 65 6c 20 73 63 68 65 6d 61  igh-level schema
34770 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
34780 20 0a 2a 2a 20 74 68 65 20 73 68 61 72 65 64 2d   .** the shared-
34790 62 74 72 65 65 29 2e 20 54 68 65 20 62 74 72 65  btree). The btre
347a0 65 20 6c 61 79 65 72 20 6d 61 6e 61 67 65 73 20  e layer manages 
347b0 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 69  reference counti
347c0 6e 67 20 69 73 73 75 65 73 2e 0a 2a 2a 0a 2a 2a  ng issues..**.**
347d0 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
347e0 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 6f  this is called o
347f0 6e 20 61 20 73 68 61 72 65 64 2d 62 74 72 65 65  n a shared-btree
34800 2c 20 6e 42 79 74 65 73 20 62 79 74 65 73 20 6f  , nBytes bytes o
34810 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 72 65 20  f memory.** are 
34820 61 6c 6c 6f 63 61 74 65 64 2c 20 7a 65 72 6f 65  allocated, zeroe
34830 64 2c 20 61 6e 64 20 72 65 74 75 72 6e 65 64 20  d, and returned 
34840 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 46  to the caller. F
34850 6f 72 20 65 61 63 68 20 73 75 62 73 65 71 75 65  or each subseque
34860 6e 74 20 0a 2a 2a 20 63 61 6c 6c 20 74 68 65 20  nt .** call the 
34870 6e 42 79 74 65 73 20 70 61 72 61 6d 65 74 65 72  nBytes parameter
34880 20 69 73 20 69 67 6e 6f 72 65 64 20 61 6e 64 20   is ignored and 
34890 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
348a0 20 73 61 6d 65 20 62 6c 6f 62 0a 2a 2a 20 6f 66   same blob.** of
348b0 20 6d 65 6d 6f 72 79 20 72 65 74 75 72 6e 65 64   memory returned
348c0 2e 20 0a 2a 2a 0a 2a 2a 20 4a 75 73 74 20 62 65  . .**.** Just be
348d0 66 6f 72 65 20 74 68 65 20 73 68 61 72 65 64 2d  fore the shared-
348e0 62 74 72 65 65 20 69 73 20 63 6c 6f 73 65 64 2c  btree is closed,
348f0 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 70 61   the function pa
34900 73 73 65 64 20 61 73 20 74 68 65 20 0a 2a 2a 20  ssed as the .** 
34910 78 46 72 65 65 20 61 72 67 75 6d 65 6e 74 20 77  xFree argument w
34920 68 65 6e 20 74 68 65 20 6d 65 6d 6f 72 79 20 61  hen the memory a
34930 6c 6c 6f 63 61 74 69 6f 6e 20 77 61 73 20 6d 61  llocation was ma
34940 64 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e  de is invoked on
34950 20 74 68 65 20 0a 2a 2a 20 62 6c 6f 62 20 6f 66   the .** blob of
34960 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72   allocated memor
34970 79 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  y. This function
34980 20 73 68 6f 75 6c 64 20 6e 6f 74 20 63 61 6c 6c   should not call
34990 20 73 71 6c 69 74 65 46 72 65 65 28 29 0a 2a 2a   sqliteFree().**
349a0 20 6f 6e 20 74 68 65 20 6d 65 6d 6f 72 79 2c 20   on the memory, 
349b0 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 20  the btree layer 
349c0 64 6f 65 73 20 74 68 61 74 2e 0a 2a 2f 0a 76 6f  does that..*/.vo
349d0 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  id *sqlite3Btree
349e0 53 63 68 65 6d 61 28 42 74 72 65 65 20 2a 70 2c  Schema(Btree *p,
349f0 20 69 6e 74 20 6e 42 79 74 65 73 2c 20 76 6f 69   int nBytes, voi
34a00 64 28 2a 78 46 72 65 65 29 28 76 6f 69 64 20 2a  d(*xFree)(void *
34a10 29 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  )){.  BtShared *
34a20 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
34a30 69 66 28 20 21 70 42 74 2d 3e 70 53 63 68 65 6d  if( !pBt->pSchem
34a40 61 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 53  a ){.    pBt->pS
34a50 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 4d 61  chema = sqliteMa
34a60 6c 6c 6f 63 28 6e 42 79 74 65 73 29 3b 0a 20 20  lloc(nBytes);.  
34a70 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65    pBt->xFreeSche
34a80 6d 61 20 3d 20 78 46 72 65 65 3b 0a 20 20 7d 0a  ma = xFree;.  }.
34a90 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 70 53    return pBt->pS
34aa0 63 68 65 6d 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  chema;.}../*.** 
34ab0 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61  Return true if a
34ac0 6e 6f 74 68 65 72 20 75 73 65 72 20 6f 66 20 74  nother user of t
34ad0 68 65 20 73 61 6d 65 20 73 68 61 72 65 64 20 62  he same shared b
34ae0 74 72 65 65 20 61 73 20 74 68 65 20 61 72 67 75  tree as the argu
34af0 6d 65 6e 74 0a 2a 2a 20 68 61 6e 64 6c 65 20 68  ment.** handle h
34b00 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76  olds an exclusiv
34b10 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 73 71  e lock on the sq
34b20 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
34b30 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
34b40 33 42 74 72 65 65 53 63 68 65 6d 61 4c 6f 63 6b  3BtreeSchemaLock
34b50 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ed(Btree *p){.  
34b60 72 65 74 75 72 6e 20 28 71 75 65 72 79 54 61 62  return (queryTab
34b70 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52  leLock(p, MASTER
34b80 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b  _ROOT, READ_LOCK
34b90 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d  )!=SQLITE_OK);.}
34ba0 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
34bb0 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
34bc0 43 48 45 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e  CHE./*.** Obtain
34bd0 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74   a lock on the t
34be0 61 62 6c 65 20 77 68 6f 73 65 20 72 6f 6f 74 20  able whose root 
34bf0 70 61 67 65 20 69 73 20 69 54 61 62 2e 20 20 54  page is iTab.  T
34c00 68 65 0a 2a 2a 20 6c 6f 63 6b 20 69 73 20 61 20  he.** lock is a 
34c10 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 69 73  write lock if is
34c20 57 72 69 74 65 6c 6f 63 6b 20 69 73 20 74 72 75  Writelock is tru
34c30 65 20 6f 72 20 61 20 72 65 61 64 20 6c 6f 63 6b  e or a read lock
34c40 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 66 61 6c  .** if it is fal
34c50 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
34c60 65 33 42 74 72 65 65 4c 6f 63 6b 54 61 62 6c 65  e3BtreeLockTable
34c70 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69  (Btree *p, int i
34c80 54 61 62 2c 20 75 38 20 69 73 57 72 69 74 65 4c  Tab, u8 isWriteL
34c90 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ock){.  int rc =
34ca0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38   SQLITE_OK;.  u8
34cb0 20 6c 6f 63 6b 54 79 70 65 20 3d 20 28 69 73 57   lockType = (isW
34cc0 72 69 74 65 4c 6f 63 6b 3f 57 52 49 54 45 5f 4c  riteLock?WRITE_L
34cd0 4f 43 4b 3a 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a  OCK:READ_LOCK);.
34ce0 20 20 72 63 20 3d 20 71 75 65 72 79 54 61 62 6c    rc = queryTabl
34cf0 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 2c 20 6c  eLock(p, iTab, l
34d00 6f 63 6b 54 79 70 65 29 3b 0a 20 20 69 66 28 20  ockType);.  if( 
34d10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
34d20 0a 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 54 61  .    rc = lockTa
34d30 62 6c 65 28 70 2c 20 69 54 61 62 2c 20 6c 6f 63  ble(p, iTab, loc
34d40 6b 54 79 70 65 29 3b 0a 20 20 7d 0a 20 20 72 65  kType);.  }.  re
34d50 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
34d60 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
34d70 6c 6f 77 69 6e 67 20 64 65 62 75 67 67 69 6e 67  lowing debugging
34d80 20 69 6e 74 65 72 66 61 63 65 20 68 61 73 20 74   interface has t
34d90 6f 20 62 65 20 69 6e 20 74 68 69 73 20 66 69 6c  o be in this fil
34da0 65 20 28 72 61 74 68 65 72 0a 2a 2a 20 74 68 61  e (rather.** tha
34db0 6e 20 69 6e 2c 20 66 6f 72 20 65 78 61 6d 70 6c  n in, for exampl
34dc0 65 2c 20 74 65 73 74 31 2e 63 29 20 73 6f 20 74  e, test1.c) so t
34dd0 68 61 74 20 69 74 20 63 61 6e 20 67 65 74 20 61  hat it can get a
34de0 63 63 65 73 73 20 74 6f 0a 2a 2a 20 74 68 65 20  ccess to.** the 
34df0 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 42 74  definition of Bt
34e00 53 68 61 72 65 64 2e 0a 2a 2f 0a 23 69 66 20 64  Shared..*/.#if d
34e10 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
34e20 42 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28  BUG) && defined(
34e30 54 43 4c 53 48 29 0a 23 69 6e 63 6c 75 64 65 20  TCLSH).#include 
34e40 3c 74 63 6c 2e 68 3e 0a 69 6e 74 20 73 71 6c 69  <tcl.h>.int sqli
34e50 74 65 33 5f 73 68 61 72 65 64 5f 63 61 63 68 65  te3_shared_cache
34e60 5f 72 65 70 6f 72 74 28 0a 20 20 76 6f 69 64 20  _report(.  void 
34e70 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
34e80 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
34e90 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
34ea0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
34eb0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64   objv[].){.#ifnd
34ec0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
34ed0 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 63 6f  HARED_CACHE.  co
34ee0 6e 73 74 20 54 68 72 65 61 64 44 61 74 61 20 2a  nst ThreadData *
34ef0 70 54 64 20 3d 20 73 71 6c 69 74 65 33 54 68 72  pTd = sqlite3Thr
34f00 65 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79 28  eadDataReadOnly(
34f10 29 3b 0a 20 20 69 66 28 20 70 54 64 2d 3e 75 73  );.  if( pTd->us
34f20 65 53 68 61 72 65 64 44 61 74 61 20 29 7b 0a 20  eSharedData ){. 
34f30 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
34f40 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  ;.    Tcl_Obj *p
34f50 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  Ret = Tcl_NewObj
34f60 28 29 3b 0a 20 20 20 20 66 6f 72 28 70 42 74 3d  ();.    for(pBt=
34f70 70 54 64 2d 3e 70 42 74 72 65 65 3b 20 70 42 74  pTd->pBtree; pBt
34f80 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74  ; pBt=pBt->pNext
34f90 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
34fa0 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c  har *zFile = sql
34fb0 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d  ite3PagerFilenam
34fc0 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  e(pBt->pPager);.
34fd0 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62        Tcl_ListOb
34fe0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
34ff0 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c  nterp, pRet, Tcl
35000 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 46  _NewStringObj(zF
35010 69 6c 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 20  ile, -1));.     
35020 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
35030 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
35040 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49  , pRet, Tcl_NewI
35050 6e 74 4f 62 6a 28 70 42 74 2d 3e 6e 52 65 66 29  ntObj(pBt->nRef)
35060 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c  );.    }.    Tcl
35070 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
35080 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20 20 7d  terp, pRet);.  }
35090 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
350a0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69   TCL_OK;.}.#endi
350b0 66 0a                                            f.